Compare commits

...
Sign in to create a new pull request.

370 commits
v6 ... master

Author SHA1 Message Date
Milan*
133e66ad38 adjust depth levels, don't disable caves 2017-03-17 22:09:46 +01:00
Duane Robertson
f1f0abcc16 Cooperate with Ramoid. 2017-02-17 19:21:47 -06:00
Duane Robertson
2186b24632 Cooperate with underworlds mod. 2017-01-29 19:43:17 -06:00
Duane Robertson
bdca26220d Enable fluids and stop forcing mapgen insertion. 2017-01-26 18:57:26 -06:00
Duane Robertson
297b41a055 Remove debug. 2017-01-24 20:06:53 -06:00
Duane Robertson
b568e8b96f Fix readme. 2017-01-24 20:06:01 -06:00
Duane Robertson
1e78532144 Fix reference to hot_spikes. 2017-01-24 20:00:06 -06:00
Duane Robertson
6cb7f1da1d Remove everything except the caves. 2017-01-24 19:54:46 -06:00
Duane
e5e7475476 Remove dead heightmap code. 2016-08-11 00:13:37 -05:00
Duane
3f8a2de971 Fix mossycobble crash. 2016-08-07 08:48:33 -05:00
Duane
b3c4e26027 Check for room before adding to chest. 2016-08-07 04:51:07 -05:00
Duane
d0149162c0 Correct coffer spawn rate. 2016-08-07 02:01:20 -05:00
Duane
be7d7a1976 Don't generate terrain before dungeon. 2016-08-07 01:47:44 -05:00
Duane
77a6129e00 Set trap odds correctly. 2016-08-06 23:13:29 -05:00
Duane
5ae6e9f89c Streamline abms. Fix manticore poison. 2016-08-06 23:12:26 -05:00
Duane
678b025cb0 Stop dungeon generation in underzones. 2016-08-06 19:02:33 -05:00
Duane
f182dd902a Add monster-summoning chest. 2016-08-06 09:54:38 -05:00
Duane
3244b2f1ff Adjust dungeon spawns. 2016-08-06 03:28:00 -05:00
Duane
f91d3d1070 Reduce treasure increments slightly. 2016-08-06 02:08:41 -05:00
Duane
2bbf9ab957 Change catch_up to match mobs. 2016-08-05 19:28:58 -05:00
Duane
232fac6361 Add manticore from horror. 2016-08-05 04:29:16 -05:00
Duane
e64d458359 Add flour to treasures. 2016-08-05 02:05:24 -05:00
Duane
7c0b4affe5 Increase dungeon levels. 2016-08-05 01:56:40 -05:00
Duane
35e52b1a7b Add cotton and wool to treasures. 2016-08-05 01:42:11 -05:00
Duane
04ecb1bd5c Add poison and pit traps. 2016-08-05 01:29:38 -05:00
Duane
5f3d97ab0c Add extra coffers when generating dungeon.
As a reward for pressing on.
2016-08-04 23:53:22 -05:00
Duane
c1c60d1f8b Adjust goblin stats. 2016-08-04 23:43:07 -05:00
Duane
a0fa05a60f Limit abm that plants new fungi. 2016-08-04 22:42:43 -05:00
Duane
8eab778a39 Typo 2016-08-04 21:42:08 -05:00
Duane
fb45d350b3 Streamline abms. 2016-08-04 21:40:50 -05:00
Duane
2f9d41c11e Add traps to dungeons. 2016-08-04 08:03:00 -05:00
Duane
cbf8994755 Fix armor display after terminate. 2016-08-04 06:47:26 -05:00
Duane
323bf1d0ca Adjust bee spawns and pie recipes. 2016-08-04 06:30:18 -05:00
Duane
8f4c8f7668 Fix mob promotion problems. 2016-08-04 04:43:16 -05:00
Duane
366a2125b8 Correct snowy village surface and crater terrain problem. 2016-08-04 00:42:18 -05:00
Duane
4141dce691 Add exploding chests and remove dungeon protection. 2016-08-03 08:36:30 -05:00
Duane
ab1fc810a9 Remove zoisite textures. 2016-08-03 08:05:25 -05:00
Duane
69feb6f994 Remove zoisites. 2016-08-03 08:02:35 -05:00
Duane
aa379d0701 Fix cave regression. 2016-08-03 07:59:07 -05:00
Duane
2ae0d2f2a1 Adjust dungeon spawns. 2016-08-03 07:32:37 -05:00
Duane
3fe63e8fd8 Spawn monsters/treasure by depth. 2016-08-03 02:55:30 -05:00
Duane
0405fb8448 Make dungeon blocks diggable. 2016-08-02 22:49:49 -05:00
Duane
8817fd38d6 Clean up borders and magic numbers. 2016-08-02 22:23:59 -05:00
Duane
2270e87a71 Localize variables. Prevent shafts from damaging trees. 2016-08-02 04:56:42 -05:00
Duane
61c3cb0edd Most dungeon features working. 2016-08-02 04:18:20 -05:00
Duane
5abe211fb6 Add more dungeon-like fortresses. 2016-08-01 03:54:05 -05:00
Duane
138858c2a2 Change some variable names. 2016-08-01 01:24:43 -05:00
Duane
92bb8a6c8e Remove garbage collection. 2016-07-31 03:30:02 -05:00
Duane
aefc390cc9 Force garbage collection. 2016-07-30 21:03:58 -05:00
Duane
4575c5c0e6 Crash-proof generate function. 2016-07-30 20:32:52 -05:00
Duane
dfddba270c Allow pyramids in any biome (by setting). 2016-07-30 20:05:26 -05:00
Duane
9c121b4c09 Fix error when removing doors with a chainsaw. 2016-07-30 19:05:43 -05:00
Duane
7b6de7195c Adjust abms. 2016-07-28 21:24:40 -05:00
Duane
6119dba871 Suppress fires. 2016-07-28 21:15:57 -05:00
Duane
df1e490a9e Adjust mushroom growth. 2016-07-24 23:49:49 -05:00
Duane
14774dfe3f Adjust onion drops. 2016-07-24 22:25:36 -05:00
Duane
26e671d600 Increase savage damage. 2016-07-24 22:08:44 -05:00
Duane
394e5cd8c2 More starting equipment. 2016-07-22 06:28:08 -05:00
Duane
d32ca7788f Reduce punch debugging. 2016-07-22 04:05:38 -05:00
Duane
10d8a0cc5c Adjust fortress spawns. 2016-07-22 03:38:16 -05:00
Duane
57ef1744c5 Adjust casket spawns. 2016-07-22 02:36:43 -05:00
Duane
d5c3a8f971 Tree analysis. 2016-07-22 02:32:46 -05:00
Duane
5dba3b99ec Add starting equipment. 2016-07-22 01:58:19 -05:00
Duane
52d4311071 Remove disintigration bombs. 2016-07-21 23:55:55 -05:00
Duane
e9765fabfc Add large craters. 2016-07-21 03:07:36 -05:00
Duane
212511b754 Adjust tree and meteor odds. 2016-07-20 05:14:01 -05:00
Duane
8e7e1f2d46 Adjust jackhammer. 2016-07-20 00:49:40 -05:00
Duane
a1a5fb0a7f Fix variable == nil error. 2016-07-19 12:00:20 -05:00
Duane
b2c104d53a Prevent bed errors in /sleep. 2016-07-18 17:46:07 -05:00
Duane
ae0886a397 Restrict meteor flashes. 2016-07-17 21:43:13 -05:00
Duane
ee4ca10d61 Use get_mapgen_setting. 2016-07-17 21:27:05 -05:00
Duane
538243d697 Potential bed error. 2016-07-17 17:36:41 -05:00
Duane
01cef3d1bd Add /sleep command. 2016-07-17 03:55:51 -05:00
Duane
193ad7e7ac Add flare gun. 2016-07-17 01:10:40 -05:00
Duane
357be42a0a Use get_mapgen_params. 2016-07-16 18:41:49 -05:00
Duane
812dcca7b9 Correct mobs name. 2016-07-16 05:32:51 -05:00
Duane
89627afc78 changes to accomodate 3d_armor 2016-07-16 05:26:12 -05:00
Duane
39a38703a8 Delay armor display to allow for lag. 2016-07-15 19:20:39 -05:00
Duane
de4d2b7b52 Fix unknown bucket issue. 2016-07-15 08:30:35 -05:00
Duane
ae3e8eff08 Prevent giant trees from being breached by fungal trees. 2016-07-15 04:35:39 -05:00
Duane
1648bc459f Extra error checking: global variables 2016-07-15 04:18:54 -05:00
Duane
bf26b8bee1 Extra error checking. 2016-07-15 02:58:33 -05:00
Duane
aa999e2ed5 Extra error checking: abms.lua 2016-07-14 21:49:58 -05:00
Duane
e1e7745a15 Extra error checking: init.lua 2016-07-14 21:19:03 -05:00
Duane
9efa81d1fe Add information to debugging. 2016-07-14 11:26:46 -05:00
Duane
ddd97bc66a Add debugging code for punch function. 2016-07-14 11:15:19 -05:00
Duane
73354d3a96 Change charcoal references to group. 2016-07-14 07:07:35 -05:00
Duane
28c3d82cfa Remove dead code. 2016-07-14 05:51:04 -05:00
Duane
6daa9ee815 Add chainsaw and jackhammer. 2016-07-14 05:41:04 -05:00
Duane
992fdbf9e9 Add bucket textures. 2016-07-14 01:07:56 -05:00
Duane
b138bad822 Handle lava correctly. 2016-07-14 00:43:16 -05:00
Duane
05dab8ff81 Add wooden buckets. Disable mass-dig.
Change bowl recipe.
Mass digging is not compatible.
Also, keep elephants from drowning.
2016-07-14 00:29:17 -05:00
Duane
410259de35 Fix variable == nil. 2016-07-13 21:02:07 -05:00
Duane
b6e66def05 Add strength elixirs. 2016-07-13 05:31:54 -05:00
Duane
dd81a5777a Replace water plant/terrain with terrain on dig. 2016-07-13 00:18:41 -05:00
Duane
e6a1a158ed Make water plans unwalkable.
To avoid "sand traps".
2016-07-12 23:23:58 -05:00
Duane
1caf0fba61 Add breathing elixir. 2016-07-12 22:36:14 -05:00
Duane
8eedc5afc3 Fix crash from missing node types. 2016-07-12 21:20:55 -05:00
Duane
4ad818a922 Activate traps when dug. 2016-07-12 04:05:02 -05:00
Duane
278bfadb17 Add right-click mass dig. 2016-07-12 02:36:35 -05:00
Duane
eb6b544926 Add initial random elixir ingredients. 2016-07-11 11:54:31 -05:00
Duane
a5906f635b Make onions farmable. 2016-07-11 05:28:28 -05:00
Duane
34ffc77540 Adjust apple spawn. 2016-07-11 00:28:48 -05:00
Duane
4ed95b93af Add meat pie. 2016-07-10 22:43:35 -05:00
Duane
159083227d Grow and decay apples. 2016-07-10 08:25:31 -05:00
Duane
534d48a0bd Alternate pie recipe. 2016-07-10 06:18:07 -05:00
Duane
4cfa301cea Add apple pie. Allow digging bombs. 2016-07-10 05:57:36 -05:00
Duane
186abc20f3 Add flatten command. 2016-07-09 04:45:09 -05:00
Duane
d1fda5aa30 Reduce hot cobble abms.
They're taking way too much time.
2016-07-08 22:06:32 -05:00
Duane
fdc3a6ed19 Correct variable names. 2016-07-08 21:55:51 -05:00
Duane Robertson
5bb654be93 Merge pull request #40 from everamzah/username
Pass user name string instead of userdata
2016-07-08 21:59:21 -05:00
James Stevenson
927c4b1f77 Pass user name string instead of userdata 2016-07-08 20:12:22 -04:00
Duane
0d33ff5b0b Simplify floor bomb recipes. 2016-07-08 10:12:20 -05:00
Duane
c8c107b300 Add armor hud. Correct armor handling in elixirs. 2016-07-07 21:56:53 -05:00
Duane
aa9c21bc93 Remove inventory cube calls per pr39. 2016-07-07 19:58:49 -05:00
Duane
d18e98bfa2 Make the liquid recipes work without functions. 2016-07-07 04:52:36 -05:00
Duane
d820a49197 Add floor bombs. 2016-07-06 17:58:20 -05:00
Duane
2e978e540c Adjust tree nodes. Return bucket from sap. 2016-07-06 00:46:36 -05:00
Duane
5763c4888e Add radiated stone monster. 2016-07-05 10:33:51 -05:00
Duane
71b6f4b168 Adjust several monsters. 2016-07-05 10:13:38 -05:00
Duane
8d70e7a7cb Add fun caves stones to stone spawning monsters. 2016-07-05 09:56:37 -05:00
Duane
14b38a868b Allow hot cobble to be quenched. 2016-07-05 09:28:11 -05:00
Duane
f693268c75 Savage gathering and planting. 2016-07-05 08:57:53 -05:00
Duane
518a8384fc Add minerals to giant trees. Raise fortresses to -33 max.
This could cause issues with really deep oceans, but I haven't seen any.
2016-07-05 07:36:36 -05:00
Duane
5d2bdcdaba Change pyramid spawns back. 2016-07-04 17:41:08 -05:00
Duane
f75e5fe6e4 Localize variable. 2016-07-04 11:36:29 -05:00
Duane
fcee06b6e1 Recreate destroyed translocators...
since mobs doesn't check for protection. Sooo many ways this could go
wrong.
2016-07-04 08:57:24 -05:00
Duane
419fc2f583 Prevent translocator loss with full inventory. 2016-07-04 02:46:07 -05:00
Duane
a23782fbf2 Remove steel from translocator recipe. 2016-07-04 02:21:14 -05:00
Duane
2248d65591 Firework texture. 2016-07-04 01:09:09 -05:00
Duane
ededbd5a78 Merge pull request 36. 2016-07-04 00:16:19 -05:00
Duane
943977949b Remove the y+1 from translocate. 2016-07-04 00:14:54 -05:00
Duane
4a63066b7d Adjust hunger bar to fit non-scaling default bars. 2016-07-03 23:41:15 -05:00
Duane
0fd901dcca Protect translocators. Fix mobs requirement error in villages.
The translocator protection DOES NOT WORK against mobs explosions.
This is not a fun_caves issue.
2016-07-03 23:20:53 -05:00
James Stevenson
970dd3fab2 Use warps object/def
From warps mod by sofar
2016-07-03 16:22:48 -04:00
Duane
26622dd1dd Add initial holiday settings. 2016-07-03 08:16:00 -05:00
Duane Robertson
4de7c7ab68 Merge pull request #35 from everamzah/opt-mobpack
Opt-depend on fun_caves_mobs mod
2016-07-03 07:13:53 -05:00
James Stevenson
d033bcf7b5 Opt-depend on fun_caves_mobs mod 2016-07-03 07:14:47 -04:00
Duane
801b11bf67 Limit casket spawns. 2016-07-03 04:36:54 -05:00
Duane
6286a4e829 Change pyramid spawns to center on caskets. 2016-07-03 02:49:09 -05:00
Duane
70c39c6c0e Adjust goblin spawns. 2016-07-03 00:56:58 -05:00
Duane
7c6f09db63 Adjust goblin spawns and digging. 2016-07-02 03:03:23 -05:00
Duane
91de8b0abf Add another fortress design. 2016-07-01 16:18:30 -05:00
Duane
0b1e15bf4d Correct close calls. 2016-07-01 15:47:26 -05:00
Duane
ee590db95e Fix dumb error with file closure. 2016-07-01 15:46:19 -05:00
Duane
1eb6658a15 Prevent variable == nil crash. 2016-07-01 15:33:10 -05:00
Duane
396d149ab4 Add fortress designs. 2016-07-01 06:54:33 -05:00
Duane
f44735e032 Shrink fortresses and add non-maze levels. 2016-07-01 01:54:08 -05:00
Duane
955d4db7ad Remove fire_walk as it overwrites bones. 2016-06-30 21:45:14 -05:00
Duane
e9ae30dfc9 Use status effects for elixirs and cold demon slow. 2016-06-30 18:48:51 -05:00
Duane
b486af8627 Generalize status effects. 2016-06-30 17:54:33 -05:00
Duane
e5005dd8d6 Give savages more range. 2016-06-30 15:30:37 -05:00
Duane
9a7f058659 Add savages to villages. 2016-06-30 15:24:00 -05:00
Duane
d94847072f Make villages optional. 2016-06-30 13:58:18 -05:00
Duane
6a68d3c616 Standard horizontal position for tesseracts. 2016-06-30 13:47:53 -05:00
Duane
f860bfa6b7 Restrict horizontal range of tesseracts. 2016-06-30 13:42:15 -05:00
Duane
925378daa1 Restrict goblin range. 2016-06-30 13:30:51 -05:00
Duane
dc1b4544c1 Make crumbly stone cracky as well. 2016-06-30 01:42:12 -05:00
Duane
e2d29e0dd9 Adjust pyramid caskets. 2016-06-29 14:30:03 -05:00
Duane
695316ea2a Add primitive villages. 2016-06-29 12:25:05 -05:00
Duane
163d75ae74 Add some filler treasures. 2016-06-29 09:16:43 -05:00
Duane
e5395a69ff Concentrate goblins more. Use blocks for pyramids. 2016-06-29 08:14:41 -05:00
Duane
fb8fcab31a Add explanatory messages to translocator actions. 2016-06-28 19:38:18 -05:00
Duane
2e1a49cd6e Clean up translocator code. 2016-06-28 19:31:33 -05:00
Duane
ad330c2f9e Make coral slightly less insanely difficult to find. 2016-06-28 15:44:52 -05:00
Duane
ada9d80bc6 Add owner to translocators. 2016-06-28 13:53:08 -05:00
Duane
04ade2f8ff Save database at shutdown. 2016-06-28 13:10:04 -05:00
Duane
25ad0e3200 Prevent translocator error on data loss. 2016-06-28 12:52:13 -05:00
Duane
3c41fa6a3f Another variable == nil error. 2016-06-28 12:37:03 -05:00
Duane
c2ac5a93be Add pyramids.
Needs more monsters.
2016-06-28 10:23:31 -05:00
Duane Robertson
6bea364511 Merge pull request #29 from everamzah/prot
Translocator: Check for protection
2016-06-28 06:00:47 -05:00
James Stevenson
eea51cd260 Translocator: Check for protection 2016-06-28 06:29:42 -04:00
Duane
d1443e1d09 Add sap to tree growth. 2016-06-28 02:46:50 -05:00
Duane
cca6f2ae1c Correct slime spawns. 2016-06-28 00:49:46 -05:00
Duane
09017179fc Add fixlight. Fix bucket of gold regression. 2016-06-27 23:53:31 -05:00
Duane
95c3acbe11 Prevent potential loss of translocator in lag. 2016-06-27 08:49:23 -05:00
Duane
a8a058ac8b Remove non-abm database writes. 2016-06-27 08:34:43 -05:00
Duane
3938e81fe5 Return from translocator pair errors. 2016-06-27 08:28:37 -05:00
Duane
4704b4cf2b More variable == nil checks. 2016-06-27 08:06:26 -05:00
Duane
a0fac75def Correct variable == nil crashes. 2016-06-27 07:59:45 -05:00
Duane
82f226a0aa Adjust goblin digging. 2016-06-27 07:55:25 -05:00
Duane
fbcd651651 Translocators 2016-06-27 05:00:16 -05:00
Duane
02337a1187 Accomodate armor mods. 2016-06-26 19:43:08 -05:00
Duane
dffcc72cbd Move fortress-related data to fortress.lua. 2016-06-26 08:16:20 -05:00
Duane
9333788d8e Add sap to solvents.
Thanks, azekill_DIABLO.
2016-06-26 07:48:57 -05:00
Duane
fc9e303c0c Modify goblin digging. 2016-06-26 03:23:06 -05:00
Duane
394b046bed Add sticks to grasslands. 2016-06-26 00:25:15 -05:00
Duane
5568b5c893 Tougher traps cause damage when dug. 2016-06-25 22:45:18 -05:00
Duane
e43aa31279 Use the beds spawn table for /setspawn. 2016-06-25 20:54:56 -05:00
Duane
fdd130c1a5 Add disgusting gruel. 2016-06-25 19:56:43 -05:00
Duane
af524bf009 Add setspawn. 2016-06-25 15:22:50 -05:00
Duane
36af3b1d92 Add mini-hunger mod. Correct meat drops in some mobs. 2016-06-25 01:38:54 -05:00
Duane
aac2db0da4 Make wood not breakable by hand (by default). 2016-06-24 12:01:52 -05:00
Duane
c8ad6d4fec Correctly handle setting defaults. 2016-06-24 11:20:52 -05:00
Duane
99c9c18ed8 Add an option for non-violent explosions. 2016-06-24 11:07:24 -05:00
Duane
9325a474b5 Fix heightmap issues with trees. 2016-06-23 22:35:48 -05:00
Duane
3e3e0c17d6 Allow use of most mapgens. Add some dungeon variety. 2016-06-23 20:21:38 -05:00
Duane
1aebdf3b47 Remove dangling comma. 2016-06-23 13:45:28 -05:00
Duane
d29d7e4e0b Add snow dragon. 2016-06-23 10:56:39 -05:00
Duane
7b157a1029 Add yeti snowball to snow demon's attack. 2016-06-23 10:02:34 -05:00
Duane
de4874c3ce Fix transparency of vapors. 2016-06-23 09:50:09 -05:00
Duane
ada2231dbf Add reach to monster table. 2016-06-23 09:26:26 -05:00
Duane
42916c4666 Clean up several functions. 2016-06-23 07:23:03 -05:00
Duane
e6f482c9d5 Add garnet and zoisite functions. 2016-06-22 16:01:15 -05:00
Duane
f438090899 Expire elixirs on death option. 2016-06-22 08:24:30 -05:00
Duane
48847cc7e0 Add eternal ice crystal drops. 2016-06-22 08:06:08 -05:00
Duane
72efe71560 Add blizzard demon and goblin sounds. 2016-06-22 07:54:45 -05:00
Duane
ef9e69eb07 Add ice demon. 2016-06-22 06:45:15 -05:00
Duane
d8c6550127 Prevent multiple elixir cheat. 2016-06-22 00:18:10 -05:00
Duane
53b31526f4 Change setting comments. 2016-06-21 07:10:49 -05:00
Duane
d569dc3ce4 Change armor elixir default. 2016-06-21 07:02:50 -05:00
Duane
c5357b51fc Make armor elixirs optional. 2016-06-21 07:01:48 -05:00
Duane
abffeb54d9 Streamline tesseracts and separate trophies. 2016-06-21 06:43:16 -05:00
Duane
3de24bde95 Rename elixir. 2016-06-21 03:47:25 -05:00
Duane
d8dbf6a4af Make armor.lua compatible with 3d_armor.
abms.lua may need to be changed.
2016-06-21 03:14:49 -05:00
Duane
ab14e3b2aa Remove debugging. 2016-06-21 02:43:42 -05:00
Duane
11c4a7d7d0 Change us_time calls to gametime. 2016-06-21 00:38:38 -05:00
Duane
2b8b604162 Localize variable and correct /armor calculation. 2016-06-20 22:40:41 -05:00
Duane
3d57691431 Add /armor command. 2016-06-20 21:31:49 -05:00
Duane
50ce118087 Remove debugging. Fix meteor probability. 2016-06-20 20:00:36 -05:00
Duane
9ef29d3feb Add wallhammer. 2016-06-20 04:07:59 -05:00
Duane
1ddb0c02a7 Fix deprecated keywords. 2016-06-19 19:56:36 -05:00
Duane
f93da354d9 Fix trap drops. Add rope ladder. 2016-06-19 19:34:46 -05:00
Duane Robertson
35c08b1aa4 Merge pull request #23 from everamzah/vessels
Bottles for the vessel shelf
2016-06-19 07:41:40 -05:00
James Stevenson
67266afceb Bottles for the vessel shelf
Give moon_glass a description
2016-06-19 07:28:24 -04:00
Duane
9193317ca6 Add initial elixirs. 2016-06-18 23:50:16 -05:00
Duane
04c6051e8a Add recipe list. Correct tesseract labels. 2016-06-18 19:57:37 -05:00
Duane Robertson
2aa15f20a9 Merge pull request #22 from everamzah/replace_deprecated
Replace deprecated minetest.env
2016-06-18 07:12:16 -05:00
James Stevenson
6cbfcde873 Replace deprecated minetest.env 2016-06-18 07:55:16 -04:00
Duane
6c764f0c3b Multiple changes:
- Adjust giant tree spawns.
- Remove dragon from dungeons.
- Adjust all abms.
- Allow giant trees to grow back damage.
- Revamp ice trap.
- Fix iron moonstone and coral teleporters.
2016-06-18 06:35:48 -05:00
Duane
fa86013731 Consolidate goblins. Simplify digging. 2016-06-16 18:22:23 -05:00
Duane
37c7275a07 Add stars. 2016-06-16 00:46:19 -05:00
Duane
6a793059f2 Standardize mob hp/damage. 2016-06-15 19:20:07 -05:00
Duane
17fc19f787 Remove bucket function for asteroid water. 2016-06-15 12:46:05 -05:00
Duane
f1db3a156e Add asteroid belt. 2016-06-15 12:37:27 -05:00
Duane
306591f082 Adjust fungal growth. 2016-06-15 06:45:18 -05:00
Duane
edd4baf418 Clean up abms. 2016-06-15 06:29:58 -05:00
Duane
0696a64673 Add fire fox. Fix environmental damage timer. 2016-06-15 04:06:35 -05:00
Duane
4f66ec44bd Skip fortress mob placement if there aren't any. 2016-06-14 09:56:28 -05:00
Duane Robertson
cd42c129c3 Merge pull request #20 from Gael-de-Sailly/mobs_fix
Fix issue about mobs spawning in fortress
2016-06-14 09:18:20 -05:00
Gael-de-Sailly
508adfc281 Fix issue about mobs spawning in fortress 2016-06-14 14:47:08 +02:00
Duane
09bbe2132b Allow other bees to summon. 2016-06-14 05:58:58 -05:00
Duane
e5cd050121 Remove local functions. 2016-06-14 02:18:21 -05:00
Duane
3f0b5d08b2 Add decorative leaves. 2016-06-14 01:08:57 -05:00
Duane
9cb5aef679 Add glowing fungal wood. 2016-06-13 23:45:09 -05:00
Duane
3d6bc4451e Fix water/sap. 2016-06-13 23:26:24 -05:00
Duane
68e8671235 Add killer bees. Correct light in trees. 2016-06-13 13:10:14 -05:00
Duane
99eb220fef Overscan trees. 2016-06-13 06:10:36 -05:00
Duane
48089a51c6 Add tree interior and adjust height. 2016-06-13 05:45:07 -05:00
Duane
9034b560f1 Change giant tree nodes. 2016-06-13 03:33:45 -05:00
Duane
d3480acde2 Add giant trees. 2016-06-13 03:10:02 -05:00
Duane
37a5474570 Add sky-sea. 2016-06-12 19:53:23 -05:00
Duane
7ec0eae568 Add moon bear. 2016-06-12 06:24:16 -05:00
Duane
241fef9f79 Fix schematic placement. Add dragon. 2016-06-12 06:02:34 -05:00
Duane
e144b2b300 More interesting radioactive texture. 2016-06-12 05:49:10 -05:00
Duane
1da72bfa40 Stop rampant mushroom spread. 2016-06-12 05:36:37 -05:00
Duane
c4dd513d88 Adjust mineral spawn. 2016-06-12 01:25:21 -05:00
Duane
dc05865839 Add minerals to clouds. 2016-06-12 00:47:07 -05:00
Duane
03f29b1cd8 Adjust cloud generation. 2016-06-12 00:02:56 -05:00
Duane
30d5f9ce96 Add flora and fauna to clouds. 2016-06-11 23:26:07 -05:00
Duane
b5d48307cb Add cloud layers. Add teleporter graphics. 2016-06-11 19:25:54 -05:00
Duane
ac2096246e Add two trophies. 2016-06-11 04:57:43 -05:00
Duane
f3393d36fc Fix regressions. Add 3 teleporters. 2016-06-11 03:50:17 -05:00
Duane
9fedc6c52a Fix regression in coral. Add coral teleporter. 2016-06-10 12:22:24 -05:00
Duane
43176144f9 Add teleporter prerequisites. 2016-06-10 02:52:58 -05:00
Duane
65a11345a8 Adjust a/s tesseract recipe. 2016-06-09 07:52:42 -05:00
Duane
8912eb85cd Add aquamarine tesserect. 2016-06-09 07:42:17 -05:00
Duane
a6497392bd Clean up and adjust poison water. 2016-06-09 04:20:45 -05:00
Duane
3ddce086ca Clean up cave biomes. 2016-06-09 01:04:53 -05:00
Duane
e447a3f506 Clean up underzones. 2016-06-08 21:05:10 -05:00
Duane
10bb057f61 Add Minauros and zombies (only there). 2016-06-08 00:45:26 -05:00
Duane
d22195be27 And more debugging. 2016-06-07 21:23:29 -05:00
Duane
f0aeb4855e Remove debugging. 2016-06-07 21:19:24 -05:00
Duane
fd2b4d8389 Overscan to remove anomolous stone.
Breaking the functions into different files may cause problems.
2016-06-07 13:57:56 -05:00
Duane
6296eafcd9 Add Styx and giant sharks. 2016-06-07 09:02:42 -05:00
Duane
87c065153a Add riverbeds to biomes and start hell levels. 2016-06-06 19:54:42 -05:00
Duane
5ea5f54a7d Strange realms I. 2016-06-06 11:45:32 -05:00
Duane
ca5b481ecd Put tarantula skin back. 2016-06-06 07:42:43 -05:00
Duane
0f09bd5cc8 Modify mobs from original mods.
... rather than copying them.
2016-06-06 07:13:31 -05:00
Duane
0c788eb537 Additional notes on image/model credits. 2016-06-06 03:12:36 -05:00
Duane
0edc007f47 Prevent server-killing sand falls. 2016-06-06 02:52:49 -05:00
Duane
d7c16bbae9 Keep elephants from drowning in puddles. 2016-06-06 02:24:02 -05:00
Duane
35e6699a56 Activate new giant mushrooms.
... to avoid falling glitches
2016-06-06 02:12:55 -05:00
Duane Robertson
9bb660983e Merge pull request #12 from everamzah/elephant
Add elephant mob
2016-06-06 02:09:08 -05:00
Duane Robertson
88fd2e6a1b Merge pull request #16 from everamzah/deco_rocks
Randomize placed small rocks
2016-06-06 02:06:10 -05:00
Duane Robertson
858130fb88 Merge pull request #17 from everamzah/sunlight_propagates
Propagate sunlight for rocks, stems
2016-06-06 02:03:47 -05:00
Duane
75fdb61c25 Adjust dirt monster altitude. 2016-06-06 01:57:19 -05:00
Duane Robertson
22b96c7ff9 Merge pull request #15 from everamzah/dry_dirt_mobs
Modify dirt monster and tarantula
2016-06-06 01:49:16 -05:00
Duane Robertson
57ab4c49fd Merge pull request #18 from everamzah/molten_gold_bucket
Add bucket support for gold goblin
2016-06-06 01:36:32 -05:00
James Stevenson
865733cec7 Add bucket support
Register molten gold with bucket.register_liquid()
Depend on bucket mod, drop lava texture for inv item
2016-06-03 20:13:02 -04:00
James Stevenson
c8d70f4b34 Propagate sunlight for rocks, stems 2016-06-03 12:55:51 -04:00
James Stevenson
326d3d5613 Randomize placed small rocks 2016-06-03 12:51:07 -04:00
James Stevenson
1cf1f3856c Modify dirt monster and tarantula
Add default:dirt_with_dry_grass to spawning
2016-06-03 12:40:17 -04:00
Duane
503d966733 Add missing texture. 2016-06-02 22:55:14 -05:00
James Stevenson
762dbfa595 Make elephant hostile on approach
Now a monster mob, but with a limited view range of 9
seems to keep to itself. Also walks/runs a bit faster.
2016-05-31 14:07:38 -04:00
James Stevenson
245381aafa Add elephant mob
Increase damage, and hit range
Change spawn change from 15000 to 17000
2016-05-31 13:54:35 -04:00
Duane Robertson
301249f9d2 Merge remote-tracking branch 'refs/remotes/origin/master' 2016-05-31 11:30:51 -05:00
Duane Robertson
2bc38a79a3 Localize some functions. 2016-05-31 11:30:29 -05:00
Duane Robertson
729079cff4 Merge pull request #11 from everamzah/hunger
Hunger mod support
2016-05-31 11:02:12 -05:00
James Stevenson
10ea16bc7e Opt-support hunger mod 2016-05-31 11:10:34 -04:00
Duane Robertson
70a706e6be Remove debug. 2016-05-30 07:29:57 -05:00
Duane Robertson
c9c3153f1d Protect fortress nodes. 2016-05-30 07:29:29 -05:00
Duane Robertson
aa44226a4e Separate fortress monster spawn system 2016-05-30 05:19:13 -05:00
Duane Robertson
85353e0ce6 Prevent crash in mapgens with no biomemap. 2016-05-29 19:29:48 -05:00
Duane Robertson
4a5950721e Localize more functions. 2016-05-29 09:27:59 -05:00
Duane Robertson
16983356c8 Fix spike error. 2016-05-29 06:20:20 -05:00
Duane Robertson
558e778861 More lag reduction. 2016-05-29 04:32:40 -05:00
Duane Robertson
02d6c44638 Tweak fortress noise. 2016-05-28 09:58:04 -05:00
Duane Robertson
285387f1b3 Merge remote-tracking branch 'refs/remotes/origin/master'
Conflicts:
	mapgen.lua
2016-05-28 09:21:08 -05:00
Duane Robertson
67c19e3ee8 Merge pull request #3 from HybridDog/patch-1
Update mapgen.lua
2016-05-28 09:17:28 -05:00
Duane Robertson
b5088cbffb Localize floor. 2016-05-28 09:16:28 -05:00
HybridDog
7172568615 Update mapgen.lua
use math.floor on n in fun_caves.is_fortress to ensure it's integer when comparing it with 1
put the manual garbage collection into a minetest.after, else it doesn't know yet that data, etc. aren't longer used
2016-05-28 14:31:10 +02:00
Duane Robertson
bde0274123 Relocalize variable. 2016-05-28 06:32:20 -05:00
Duane Robertson
0f684a76d0 Correct missing function. 2016-05-28 06:23:20 -05:00
Duane Robertson
fac68f46a5 Reoptimize some variables. 2016-05-28 06:16:04 -05:00
Duane Robertson
65a6df1e44 Streamline abms. 2016-05-28 05:24:36 -05:00
Duane Robertson
942d6c6a9c Toggle debug. 2016-05-27 21:57:13 -05:00
Duane Robertson
f76f554d1f Level improve creatures based on all axes. 2016-05-27 21:21:49 -05:00
Duane Robertson
6225566875 Dungeon hardening, part 1 2016-05-27 08:05:51 -05:00
Duane Robertson
d02f04504b Update README. 2016-05-26 23:41:59 -05:00
Duane Robertson
a117583db6 Reorganize nodes.lua for clarity. 2016-05-26 22:55:32 -05:00
Duane Robertson
f5ed9d1cb2 Fix maze algorithm. 2016-05-26 10:10:36 -05:00
Duane Robertson
660023553b Initial fortress work (mazes). 2016-05-26 07:07:14 -05:00
Duane Robertson
68397c7fca Allow more cobbling. 2016-05-26 02:06:15 -05:00
Duane Robertson
58ed1a5e1c Better delay 2016-05-26 01:49:08 -05:00
Duane Robertson
234b71064c Delay custom actions. 2016-05-26 01:12:06 -05:00
Duane Robertson
f8678a3d44 Correct errors in search. 2016-05-26 00:28:36 -05:00
Duane Robertson
0285d39793 Rework heightmap check. 2016-05-25 23:04:24 -05:00
Duane Robertson
5e5aa5f610 Adjust altitude limits. 2016-05-25 00:53:06 -05:00
Duane Robertson
7f031350a9 Rework black zone. 2016-05-24 22:21:24 -05:00
Duane Robertson
1a9afc9ede Optimize variables. 2016-05-24 19:20:17 -05:00
Duane Robertson
26d4d7cc86 Remove cold desert. 2016-05-23 20:39:13 -05:00
Duane Robertson
ba83b79a9c Mountain corrections 2016-05-23 19:36:49 -05:00
Duane Robertson
f4e6c52f2f Better biomes 2016-05-23 18:52:48 -05:00
Duane Robertson
7b969e0009 Make deserts survivable. 2016-05-23 11:08:25 -05:00
Duane Robertson
c93090b4e8 Adjust mushrooms and goblins.
Remove dirt from desert caves.
2016-05-23 09:53:37 -05:00
Duane Robertson
11e404c23a Add hunger. Make goblins attack. Remove easy bread. 2016-05-23 07:54:39 -05:00
Duane Robertson
689548aa9b Optimize mapgen a bit. 2016-05-23 07:33:24 -05:00
Duane Robertson
26af8d805c Clean waterlily code. 2016-05-23 05:50:17 -05:00
Duane Robertson
061576fcc3 Change plant texture. 2016-05-22 07:37:34 -05:00
Duane Robertson
61f3bd007d Continuing rewrite. Add plants. 2016-05-22 07:17:20 -05:00
Duane Robertson
d65c6acdf4 Adjust heightmap compensation. 2016-05-21 10:53:00 -05:00
Duane Robertson
011affc46f Major overhaul. Separate cave decorations from mapgen. 2016-05-21 09:47:42 -05:00
Duane Robertson
f8a5339f57 Reduce surface caves. 2016-05-21 01:05:47 -05:00
Duane Robertson
d648e1a178 Add mobs_monster dependency. 2016-05-20 19:11:15 -05:00
Duane Robertson
b4e2db7f3c Adjust caves near the surface. 2016-05-20 08:36:59 -05:00
Duane Robertson
007fb4e38e Modify goblin depth. 2016-05-20 01:58:31 -05:00
Duane Robertson
1ca35fe367 Remove duplicated models. 2016-05-20 01:01:14 -05:00
Duane Robertson
4821c4e912 Remove duplicated textures. 2016-05-20 00:59:36 -05:00
Duane Robertson
a46641fcac Use mobs redo api instead of replicating. 2016-05-20 00:58:12 -05:00
Duane Robertson
6f25d3c388 Return the surface world. 2016-05-19 22:14:31 -05:00
Duane Robertson
0ad60d974b Adjust salt and biome spread. 2016-05-19 01:24:25 -05:00
Duane Robertson
36597871fb Adjustments and add sand monster. 2016-05-18 05:13:38 -05:00
Duane Robertson
54cff8252b Adjust altitude. 2016-05-17 03:38:19 -05:00
Duane Robertson
5f09951a56 Lower cold damage and add ice goblins. 2016-05-17 03:03:28 -05:00
Duane Robertson
a595c7952a Correct cold damage. Add ice spiders. 2016-05-16 23:30:12 -05:00
Duane Robertson
fb8b9eb68d Get rid of a lot of light sources to help lag. 2016-05-16 21:29:46 -05:00
Duane Robertson
18b8401334 Fix hot/cold damage. 2016-05-16 03:37:28 -05:00
Duane Robertson
0780d8dd67 Add hot spikes. Bias ores toward bad zones. 2016-05-16 00:08:53 -05:00
Duane Robertson
87fbc5256c Simplify cave algorithm. 2016-05-11 23:39:34 -05:00
Duane Robertson
12b65b8fb6 Hot cobble hurts. 2016-04-26 18:04:48 -05:00
Duane Robertson
80c2d32129 fix screenshot 5 2016-04-26 16:37:42 -05:00
Duane Robertson
1571108cf3 fix screenshot 4 2016-04-26 16:37:02 -05:00
Duane Robertson
b89e40e092 fix screenshot 3 2016-04-26 16:36:39 -05:00
Duane Robertson
7ec34577c4 Fix screenshot 2 2016-04-26 16:34:17 -05:00
Duane Robertson
24412d94be Fix screenshot 1 2016-04-26 16:33:34 -05:00
Duane Robertson
eebddeb1a4 license and readme work 2016-04-26 16:29:11 -05:00
Duane Robertson
303655e06c Fix ore generation. 2016-04-25 22:42:41 -05:00
Duane Robertson
182e32d231 Integrate goblins and mobs. 2016-04-25 22:15:21 -05:00
Duane Robertson
6097e844cf all caves 2016-04-25 01:16:53 -05:00
36 changed files with 1897 additions and 615 deletions

34
LICENSE
View file

@ -6,9 +6,9 @@
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
(This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
the version number 2.1.)
Preamble
@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
@ -111,7 +111,7 @@ modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@ -158,7 +158,7 @@ Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
@ -216,7 +216,7 @@ instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
@ -267,7 +267,7 @@ Library will still fall under Section 6.)
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
@ -370,7 +370,7 @@ subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
@ -456,7 +456,7 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
@ -470,8 +470,8 @@ safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
{description}
Copyright (C) {year} {fullname}
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -485,7 +485,8 @@ convey the exclusion of warranty; and each file should have at least the
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
Also add information on how to contact you by electronic and paper mail.
@ -494,9 +495,10 @@ school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
library `Frob' (a library for tweaking knobs) written by James Random
Hacker.
<signature of Ty Coon>, 1 April 1990
{signature of Ty Coon}, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

View file

@ -1,13 +1,13 @@
# fun_caves
Fun Caves is an attempt to convert the mapgen V6 caves into a lua mod, so they can be used with any mapgen. I've translated the C++ code into lua in the most mechanical way possible. I honestly have no idea how half of it works, and I don't intend to spend a lot of time on it in the future, so anyone who likes this mod is encouraged to fork and/or tinker with it and submit pull requests.
Fun Caves replaces the default caves with a dense system of mostly flat (and easier to navigate) caverns, with biomes owing much to caverealms. Once you go underground, you should find everything you need to survive without ever returning to the surface.
![screenshot](https://github.com/duane-r/fun_caves/raw/master/textures/screenshot.jpg)
#![screenshot](https://github.com/duane-r/fun_caves/raw/master/textures/screenshot3.jpg)
The source is available on github.
Code: LGPL2, textures: none
Code: LGPL2, textures: CC-BY-SA and CC0
Mod dependencies: default
Mod dependencies: default, dye, flowers, vessels
Download: https://github.com/duane-r/fun_caves/archive/master.zip

659
abms.lua Normal file
View file

@ -0,0 +1,659 @@
-- Fun_Caves abms.lua
-- Copyright Duane Robertson (duane@duanerobertson.com), 2017
-- Distributed under the LGPLv2.1 (https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
-------------------------------------------------------------------
-- Abms
-------------------------------------------------------------------
-- player surface damage
local dps_delay = 3
local last_dps_check = 0
local cold_delay = 5
local dps_count = cold_delay
local mushrooms = {"flowers:mushroom_brown", "flowers:mushroom_red"}
local time_factor = (fun_caves_mod.time_factor or 10)
local light_max = (fun_caves_mod.light_max or 10)
-- fungal tree nodes
local fungal_tree_leaves = {}
for i = 1, 4 do
fungal_tree_leaves[#fungal_tree_leaves+1] = "fun_caves:fungal_tree_leaves_"..i
end
local is_fungal_leaf = {}
for _, leaf in ipairs(fungal_tree_leaves) do
is_fungal_leaf[leaf] = true
end
local fungal_nodes = {}
for _, leaf in pairs(fungal_tree_leaves) do
fungal_nodes[#fungal_nodes+1] = {name = leaf}
end
fungal_nodes[#fungal_nodes+1] = {name = 'fun_caves:fungal_tree_fruit'}
local fungi_to_explode = {} -- see below
local exploding_fungi = fun_caves_mod.exploding_fungi
if not exploding_fungi then
exploding_fungi = {}
end
-- hot spike parameters
local spike_air = {}
spike_air['default:lava_source'] = true
spike_air['default:lava_source'] = true
spike_air['default:lava_flowing'] = true
local spike_soil = {}
spike_soil['fun_caves:hot_cobble'] = true
spike_soil['fun_caves:black_sand'] = true
------------------------------------------------------------
-- all the fun_caves globalstep functions
------------------------------------------------------------
local hot_stuff = {"group:surface_hot"}
local cold_stuff = {"group:surface_cold"}
local poison_stuff = {"group:poison"}
local minetest_find_nodes_in_area = minetest.find_nodes_in_area
minetest.register_globalstep(function(dtime)
if not (dtime and type(dtime) == 'number') then
return
end
local time = minetest.get_gametime()
if not (time and type(time) == 'number') then
return
end
-- Execute only after an interval.
if not last_dps_check or time - last_dps_check < dps_delay then
return
end
local players = minetest.get_connected_players()
if not (players and type(players) == 'table') then
return
end
for i = 1, #players do
local player = players[i]
local pos = player:getpos()
pos = vector.round(pos)
local player_name = player:get_player_name()
-- environmental damage
if fun_caves_mod.DEBUG and player:get_hp() < 20 then
-- Regenerate the player while testing.
print("HP: "..player:get_hp())
player:set_hp(20)
return
else
local minp = vector.subtract(pos, 0.5)
local maxp = vector.add(pos, 0.5)
-- ... from standing on or near hot objects.
local counts = minetest_find_nodes_in_area(minp, maxp, hot_stuff)
if not (counts and type(counts) == 'table') then
return
end
if #counts > 1 then
player:set_hp(player:get_hp() - 1)
end
-- ... from standing on or near poison.
local counts = minetest_find_nodes_in_area(minp, maxp, poison_stuff)
if not (counts and type(counts) == 'table') then
return
end
if #counts > 1 then
player:set_hp(player:get_hp() - 1)
end
-- ... from standing on or near cold objects (less often).
if dps_count % cold_delay == 0 then
counts = minetest_find_nodes_in_area(minp, maxp, cold_stuff)
if not (counts and type(counts) == 'table') then
return
end
if #counts > 1 then
player:set_hp(player:get_hp() - 1)
end
end
end
end
-- Set this outside of the player loop, to affect everyone.
if dps_count % cold_delay < 1 then
dps_count = cold_delay
end
last_dps_check = minetest.get_gametime()
if not (last_dps_check and type(last_dps_check) == 'number') then
last_dps_check = 0
end
dps_count = dps_count - 1
end)
------------------------------------------------------------
-- destruction
------------------------------------------------------------
minetest.register_abm({
nodenames = {"fun_caves:hot_cobble",},
neighbors = {"group:water"},
interval = time_factor,
chance = 30,
catch_up = false,
action = function(pos, node)
if not (pos and node) then
return
end
minetest.set_node(pos, {name = "default:cobble"})
minetest.sound_play("default_cool_lava",
{pos = pos, max_hear_distance = 16, gain = 0.25})
end,
})
-- Exploding fungal fruit
minetest.register_abm({
nodenames = {"fun_caves:fungal_tree_fruit"},
interval = 12 * time_factor,
chance = 400,
catch_up = false,
action = function(pos, node)
if not (pos and node) then
return
end
fun_caves_mod.soft_boom(pos)
end
})
-- Destroy mushroom caps in the light.
minetest.register_abm({
nodenames = {"fun_caves:giant_mushroom_cap", "fun_caves:huge_mushroom_cap"},
interval = 3 * time_factor,
chance = 200,
action = function(pos, node)
if not (pos and node) then
return
end
if (minetest.get_node_light(pos, nil) or 99) >= light_max + 2 then
minetest.remove_node(pos)
return
end
end
})
-- * Replace this with an after_destruct call *
--minetest.register_abm({
-- nodenames = {"fun_caves:giant_mushroom_cap", "fun_caves:huge_mushroom_cap"},
-- interval = time_factor,
-- chance = 20,
-- action = function(pos, node)
-- if not (pos and node) then
-- return
-- end
--
-- pos.y = pos.y - 1
-- local node_below = minetest.get_node_or_nil(pos)
-- if not (node_below and node_below.name == 'fun_caves:giant_mushroom_stem') then
-- pos.y = pos.y + 1
-- minetest.remove_node(pos)
-- return
-- end
-- end
--})
--minetest.register_abm({
-- nodenames = {"fire:basic_flame"},
-- interval = 2 * time_factor,
-- chance = 50,
-- action = function(p0, node, _, _)
-- minetest.remove_node(p0)
-- end,
--})
------------------------------------------------------------
-- creation
------------------------------------------------------------
-- fungal spread
minetest.register_abm({
nodenames = fungal_tree_leaves,
neighbors = {"air", "group:liquid"},
interval = 4 * time_factor,
chance = 200,
catch_up = false,
action = function(pos, node)
if not (pos and node) then
return
end
if (minetest.get_node_light(pos, nil) or 99) >= light_max + 2 then
minetest.remove_node(pos)
return
end
if math.random(40) == 1 then
minetest.set_node(pos, fungal_nodes[#fungal_nodes])
return
end
if math.random(100) == 1 then
minetest.set_node(pos, fungal_nodes[math.random(#fungal_nodes - 1)])
return
end
pos.y = pos.y - 1
local grow_node = minetest.get_node_or_nil(pos)
if grow_node and grow_node.name == "air" then
minetest.set_node(pos, node)
return
end
pos.x = pos.x + math.random(-1, 1)
pos.y = pos.y + math.random(-1, 1) + 1
pos.z = pos.z + math.random(-1, 1)
grow_node = minetest.get_node_or_nil(pos)
if grow_node and grow_node.name == "air" and (minetest.get_node_light(pos, nil) or 99) <= light_max then
minetest.set_node(pos, node)
return
elseif grow_node and is_fungal_leaf[grow_node.name] and grow_node.name ~= node.name then
minetest.remove_node(pos)
return
end
end
})
-- mushroom growth -- caps regenerate in time
local huge_mushroom_cap_node = {name = 'fun_caves:huge_mushroom_cap'}
minetest.register_abm({
nodenames = {"fun_caves:giant_mushroom_stem"},
neighbors = {'air'},
interval = 4 * time_factor,
chance = 200,
action = function(pos, node)
if not (pos and node) then
return
end
pos.y = pos.y + 1
local node_up = minetest.get_node_or_nil(pos)
if not node_up or node_up.name ~= "air" then
return
end
if (minetest.get_node_light(pos, nil) or 99) <= light_max then
minetest.set_node(pos, huge_mushroom_cap_node)
end
end
})
-- new fungi
local mushroom_nodes = {}
for _, mushroom in pairs(mushrooms) do
mushroom_nodes[#mushroom_nodes+1] = {name = mushroom}
end
minetest.register_abm({
nodenames = {"default:dirt"},
neighbors = {'fun_caves:stone_with_lichen', 'fun_caves:stone_with_algae', 'fun_caves:giant_mushroom_stem'},
interval = 10 * time_factor,
chance = 500,
catch_up = false,
action = function(pos, node)
if not (pos and node and pos.y < 0) then
return
end
pos.y = pos.y + 1
local grow_node = minetest.get_node_or_nil(pos)
if grow_node and grow_node.name == "air"
and (minetest.get_node_light(pos, nil) or 99) <= light_max then
if math.random(4) == 1 then
minetest.set_node(pos, fungal_nodes[math.random(#fungal_nodes - 1)])
else
minetest.set_node(pos, mushroom_nodes[math.random(#mushroom_nodes)])
end
end
end
})
-- mushroom growth -- small into huge
local giant_mushroom_stem_node = {name = 'fun_caves:giant_mushroom_stem'}
minetest.register_abm({
nodenames = mushrooms,
interval = 20 * time_factor,
chance = 700,
catch_up = false,
action = function(pos, node)
if not (pos and node and pos.y < 0) then
return
end
local pos_up = {x=pos.x,y=pos.y+1,z=pos.z}
local node_up = minetest.get_node_or_nil(pos_up)
if not node_up or node_up.name ~= "air" then
return
end
local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z})
if not node_under
or minetest.get_item_group(node_under.name, "soil") == 0
or (minetest.get_node_light(pos_up, nil) or 99) > light_max then
return
end
minetest.set_node(pos_up, huge_mushroom_cap_node)
minetest.set_node(pos, giant_mushroom_stem_node)
end
})
-- mushroom growth -- huge into giant
local giant_mushroom_cap_node = {name = "fun_caves:giant_mushroom_cap"}
minetest.register_abm({
nodenames = {"fun_caves:huge_mushroom_cap"},
interval = 40 * time_factor,
chance = 2000,
catch_up = false,
action = function(pos, node)
if not (pos and node) then
return
end
local pos_up = {x=pos.x,y=pos.y+1,z=pos.z}
local node_up = minetest.get_node_or_nil(pos_up)
if not node_up or node_up.name ~= "air" then
return
end
-- Check for soil.
local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 2, z = pos.z})
if not node_under
or minetest.get_item_group(node_under.name, "soil") == 0
or (minetest.get_node_light(pos_up, nil) or 99) > light_max then
return
end
minetest.set_node(pos_up, giant_mushroom_cap_node)
minetest.set_node(pos, {name = "fun_caves:giant_mushroom_stem"})
end
})
-- Spike spread and death
minetest.register_abm({
nodenames = fun_caves_mod.hot_spikes,
interval = 40 * time_factor,
chance = 2000,
action = function(pos, node)
if not (pos and node and pos.y < 0) then
return
end
if not (fun_caves_mod.hot_spike and fun_caves_mod.hot_spikes) then
return
end
local spike_num = fun_caves_mod.hot_spike[node.name]
if not spike_num then
return
end
if spike_num < #fun_caves_mod.hot_spikes then
minetest.set_node(pos, {name=fun_caves_mod.hot_spikes[spike_num+1]})
return
end
pos.x = pos.x + math.random(-2, 2)
pos.y = pos.y + math.random(-1, 1)
pos.z = pos.z + math.random(-2, 2)
local new_node = minetest.get_node_or_nil(pos)
if not (new_node and spike_air[new_node.name]) then
return
end
local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z})
if not (node_under and spike_soil[node_under.name]) then
return
end
minetest.set_node(pos, {name = fun_caves_mod.hot_spikes[1]})
end
})
------------------------------------------------------------
-- explosive functions
------------------------------------------------------------
-- All of this is copied from TNT, but modified to leave stone intact.
-- Fill a list with data for content IDs, after all nodes are registered
local cid_data = {}
minetest.after(0, function()
for name, def in pairs(minetest.registered_nodes) do
cid_data[minetest.get_content_id(name)] = {
name = name,
--drops = def.drops,
flammable = def.groups.flammable,
choppy = def.groups.choppy,
fleshy = def.groups.fleshy,
snappy = def.groups.snappy,
on_blast = def.on_blast,
}
end
-- This also has to be done after content ids are established.
for i = 1, 4 do
fungi_to_explode[minetest.get_content_id("fun_caves:fungal_tree_leaves_"..i)] = true
end
fungi_to_explode[minetest.get_content_id('fun_caves:fungal_tree_fruit')] = true
fungi_to_explode[minetest.get_content_id('fun_caves:giant_mushroom_cap')] = true
fungi_to_explode[minetest.get_content_id('fun_caves:giant_mushroom_stem')] = true
fungi_to_explode[minetest.get_content_id('fun_caves:huge_mushroom_cap')] = true
end)
local function add_effects(pos, radius)
if not (pos and radius and type(radius) == 'number') then
return
end
minetest.add_particlespawner({
amount = 128,
time = 1,
minpos = vector.subtract(pos, radius / 2),
maxpos = vector.add(pos, radius / 2),
minvel = {x=-20, y=-20, z=-20},
maxvel = {x=20, y=20, z=20},
minacc = vector.new(),
maxacc = vector.new(),
minexptime = 1,
maxexptime = 3,
minsize = 8,
maxsize = 16,
texture = "tnt_smoke.png",
})
end
local function destroy(pos, cid)
if not (pos and cid) then
return
end
local def = cid_data[cid]
if not (def and def.flammable and def.flammable > 0 and not minetest.is_protected(pos, "")) then
return
end
if def.on_blast then
def.on_blast(vector.new(pos), 1)
return
end
if def.snappy == nil and def.choppy == nil and def.fleshy == nil and def.name ~= "fire:basic_flame" then
return
end
if exploding_fungi or fungi_to_explode[cid] then
minetest.remove_node(pos)
end
end
local math_random = math.random
local function explode(pos, radius)
if not (pos and radius and type(radius) == 'number') then
return
end
local pos = vector.round(pos)
local vm = VoxelManip()
local p1 = vector.subtract(pos, radius)
local p2 = vector.add(pos, radius)
local minp, maxp = vm:read_from_map(p1, p2)
local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
local data = vm:get_data()
local p = {}
local c_air = minetest.get_content_id("air")
for z = -radius, radius do
for y = -radius, 4*radius do
local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z)
for x = -radius, radius do
if (x * x) + (y * y / 4) + (z * z) <=
(radius * radius) + math_random(-radius, radius) then
local cid = data[vi]
p.x = pos.x + x
p.y = pos.y + y
p.z = pos.z + z
if cid ~= c_air then
destroy(p, cid)
end
end
vi = vi + 1
end
end
end
end
local function calc_velocity(pos1, pos2, old_vel, power)
if not (pos1 and pos2 and old_vel and power) then
return
end
local vel = vector.direction(pos1, pos2)
vel = vector.normalize(vel)
vel = vector.multiply(vel, power)
-- Divide by distance
local dist = vector.distance(pos1, pos2)
dist = math.max(dist, 1)
vel = vector.divide(vel, dist)
-- Add old velocity
vel = vector.add(vel, old_vel)
return vel
end
local function entity_physics(pos, radius)
if not (pos and radius and type(radius) == 'number') then
return
end
-- Make the damage radius larger than the destruction radius
radius = radius * 2
local objs = minetest.get_objects_inside_radius(pos, radius)
if not (objs and type(objs) == 'table') then
return
end
local math_max = math.max
local vector_distance = vector.distance
for _, obj in pairs(objs) do
local obj_pos = obj:getpos()
local obj_vel = obj:getvelocity()
local dist = math_max(1, vector_distance(pos, obj_pos))
if obj_vel ~= nil then
obj:setvelocity(calc_velocity(pos, obj_pos,
obj_vel, radius * 10))
end
local damage = (4 / dist) * radius
obj:set_hp(obj:get_hp() - damage)
end
end
fun_caves_mod.soft_boom = function(pos)
if not pos then
return
end
local node = minetest.get_node_or_nil(pos)
if not node then
return
end
if exploding_fungi then
minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64})
end
local radius = 5
minetest.remove_node(pos)
explode(pos, radius)
if exploding_fungi then
entity_physics(pos, radius)
add_effects(pos, radius)
end
end
-----------------------------------------------
-- testing only -- remove before distribution
-----------------------------------------------
-- Mushroom spread and death
--minetest.register_abm({
-- nodenames = mushrooms,
-- interval = 1 * time_factor,
-- chance = 50,
-- action = function(pos, node)
-- if minetest.get_node_light(pos, nil) >= light_max + 2 then
-- minetest.remove_node(pos)
-- return
-- end
-- local random = {
-- x = pos.x + math.random(-2, 2),
-- y = pos.y + math.random(-1, 1),
-- z = pos.z + math.random(-2, 2)
-- }
-- local random_node = minetest.get_node_or_nil(random)
-- if not random_node or random_node.name ~= "air" then
-- return
-- end
-- local node_under = minetest.get_node_or_nil({x = random.x,
-- y = random.y - 1, z = random.z})
-- if not node_under then
-- return
-- end
--
-- if (minetest.get_item_group(node_under.name, "soil") ~= 0 or
-- minetest.get_item_group(node_under.name, "tree") ~= 0) and
-- minetest.get_node_light(pos, 0.5) <= light_max and
-- minetest.get_node_light(random, 0.5) <= light_max then
-- minetest.set_node(random, {name = node.name})
-- end
-- end
--})

69
cavegen.lua Normal file
View file

@ -0,0 +1,69 @@
-- Fun_Caves cavegen.lua
-- Copyright Duane Robertson (duane@duanerobertson.com), 2017
-- Distributed under the LGPLv2.1 (https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
fun_caves_mod.cave_width = 0.05 -- figurative width
local max_depth = -28000
fun_caves_mod.cave_noise_1 = {offset = 0, scale = 1, seed = 3901, spread = {x = 40, y = 10, z = 40}, octaves = 3, persist = 1, lacunarity = 2}
fun_caves_mod.cave_noise_2 = {offset = 0, scale = 1, seed = -8402, spread = {x = 40, y = 20, z = 40}, octaves = 3, persist = 1, lacunarity = 2}
local cave_noise_3 = {offset = 15, scale = 10, seed = 3721, spread = {x = 40, y = 40, z = 40}, octaves = 3, persist = 1, lacunarity = 2}
fun_caves_mod.cavegen = function(minp, maxp, data, area, node, heightmap)
if not (minp and maxp and data and area and node and type(data) == 'table') then
return
end
local temp_y = (minp.y+maxp.y)/2
if temp_y > -28000 or temp_y < -30999 then return end
local csize = vector.add(vector.subtract(maxp, minp), 1)
local map_max = {x = csize.x, y = csize.y + 2, z = csize.z}
local map_min = {x = minp.x, y = minp.y - 1, z = minp.z}
local cave_1, cave_2, cave_3
cave_1 = minetest.get_perlin_map(fun_caves_mod.cave_noise_1, map_max):get3dMap_flat(map_min)
cave_2 = minetest.get_perlin_map(fun_caves_mod.cave_noise_2, map_max):get3dMap_flat(map_min)
cave_3 = minetest.get_perlin_map(cave_noise_3, {x=csize.x, y=csize.z}):get2dMap_flat({x=minp.x, y=minp.z})
if not (cave_1 and cave_2 and cave_3) then
return
end
local index = 0
local index3d = 0
local cave_width = fun_caves_mod.cave_width
local write
for z = minp.z, maxp.z do
for x = minp.x, maxp.x do
index = index + 1
index3d = (z - minp.z) * (csize.y + 2) * csize.x + (x - minp.x) + 1
local ivm = area:index(x, minp.y, z)
local height = heightmap[index]
for y = minp.y, maxp.y do
if ((y <= maxp.y and y >= minp.y) or (data[ivm] == node['default:stone'])) and y < height - cave_3[index] and cave_1[index3d] * cave_2[index3d] > cave_width then
data[ivm] = node["air"]
write = true
if y > 0 and cave_3[index] < 1 and y == height then
-- Clear the air above a cave mouth.
local ivm2 = ivm
for y2 = y + 1, maxp.y + 8 do
ivm2 = ivm2 + area.ystride
if data[ivm2] ~= node["default:water_source"] then
data[ivm2] = node["air"]
write = true
end
end
end
end
ivm = ivm + area.ystride
index3d = index3d + csize.x
end
end
end
return write
end

222
deco.lua Normal file
View file

@ -0,0 +1,222 @@
-- Fun_Caves deco.lua
-- Copyright Duane Robertson (duane@duanerobertson.com), 2017
-- Distributed under the LGPLv2.1 (https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
dofile(fun_caves_mod.path .. "/nodes.lua")
dofile(fun_caves_mod.path .. "/fungal_tree.lua")
local deco_depth = -5 -- place cave stuff this far beneath the surface
local water_level = 1
local fluid_compression = -22000 -- the depth to start planting lava/water
local max_depth = -27960
local csize
local node_match_cache = {}
local biome_noise = {offset = 0.0, scale = 1.0, spread = {x = 400, y = 400, z = 400}, seed = 903, octaves = 3, persist = 0.5, lacunarity = 2.0}
-- Air needs to be placed prior to decorations.
fun_caves_mod.decogen = function(minp, maxp, data, area, node, heightmap)
if not (minp and maxp and data and area and node and type(data) == 'table' and fun_caves_mod.cave_biomes and fun_caves_mod.make_fungal_tree) then
return
end
local temp_y = (minp.y+maxp.y)/2
if temp_y > -28000 or temp_y < -30999 then return end
csize = vector.add(vector.subtract(maxp, minp), 1)
local map_max = {x = csize.x, y = csize.y + 2, z = csize.z}
local map_min = {x = minp.x, y = minp.y - 1, z = minp.z}
local biome_n = minetest.get_perlin_map(biome_noise, map_max):get3dMap_flat(map_min)
local write
local index = 0
local index3d = 0
local math_max = math.max
local math_min = math.min
local math_log = math.log
local math_random = math.random
for z = minp.z, maxp.z do
for x = minp.x, maxp.x do
index = index + 1
index3d = (z - minp.z) * (csize.y + 2) * csize.x + (x - minp.x) + 1
local ivm = area:index(x, minp.y, z)
local height = heightmap[index]
for y = minp.y-1, maxp.y+1 do
if y <= height + deco_depth and (height < max_depth or y < 0) then
for deco_non_loop = 1, 1 do
if not (data[ivm] == node["air"] or data[ivm] == node["default:stone"]) then
break
end
local biome
local biome_val = biome_n[index3d]
-- Compress biomes at the surface to avoid fluids.
if y > fluid_compression then
biome_val = biome_val / math_max(1, math_log(y - fluid_compression))
end
for _, bi in pairs(fun_caves_mod.cave_biomes) do
if biome_val >= bi.biome_val_low and biome_val < bi.biome_val_high then
biome = bi
end
end
--biome = fun_caves_mod.cave_biomes['salt']
if not biome then
print(("* Fun Caves: Error in biome selection: %s"):format(biome_val))
biome = fun_caves_mod.cave_biomes['algae']
end
local node_below
if y > minp.y then
node_below = data[ivm - area.ystride]
end
local node_above = data[ivm + area.ystride]
if data[ivm] == node["default:stone"] then
if node_above == node["air"] and biome and biome.dirt and math_random(biome.dirt_chance) == 1 then
data[ivm] = node[biome.dirt]
write = true
break
end
local air_above = false
for i = 1, biome.stone_depth do
if data[ivm + area.ystride * i] == node["air"] then
air_above = true
end
end
if air_above then
if biome and biome.deco and math_random(biome.deco_chance) == 1 then
data[ivm] = node[biome.deco]
write = true
break
else
data[ivm] = node[biome.floor_node]
write = true
break
end
end
local air_below = false
for i = 1, biome.stone_depth do
if data[ivm - area.ystride * i] == node["air"] then
air_below = true
end
end
-- Prevent server-crashing sandslides.
if not air_above and biome.floor_node == "default:sand" then
data[ivm] = node["default:sandstone"]
write = true
break
end
if air_below then
if biome and biome.deco and math_random(biome.deco_chance) == 1 then
data[ivm] = node[biome.deco]
write = true
break
else
data[ivm] = node[biome.ceiling_node]
write = true
break
end
end
end
if data[ivm] == node["air"] and y < maxp.y then
-- hanging down
-- stone hasn't yet been changed
if biome and biome.stalactite and node_above == node["default:stone"] and math_random(biome.stalactite_chance) == 1 then
data[ivm] = node[biome.stalactite]
write = true
break
end
-- fluids
if y > minp.y and biome and biome.fluid and node_below == node[biome.floor_node] and math_random(biome.fluid_chance) == 1 then
data[ivm] = node[biome.fluid]
write = true
break
-- standing up
elseif node_below == node[biome.floor_node] and biome and biome.stalagmite and math_random(biome.stalagmite_chance) == 1 then
if type(biome.stalagmite) == 'table' then
data[ivm] = node[biome.stalagmite[math_random(#biome.stalagmite)]]
else
data[ivm] = node[biome.stalagmite]
end
write = true
break
-- vegetation
elseif node_below == node["default:dirt"] and biome and biome.fungi then
if math_random(10) == 1 then
data[ivm] = node["flowers:mushroom_red"]
write = true
break
elseif math_random(10) == 1 then
data[ivm] = node["flowers:mushroom_brown"]
write = true
break
elseif node_above == node["air"] and math_random(10) == 1 then
data[ivm] = node["fun_caves:giant_mushroom_stem"]
write = true
break
elseif math_random(30) == 1 then
local air_count = 0
local j
for i = 1, 12 do
j = ivm + area.ystride * i
if j <= #data and data[j] == node["air"] then
air_count = air_count + 1
end
end
if air_count > 5 then
fun_caves_mod.make_fungal_tree(data, area, ivm, math_random(2, math_min(air_count, 12)))
end
end
elseif node_below == node["fun_caves:giant_mushroom_stem"] and data[ivm - area.ystride * 2] == node["fun_caves:giant_mushroom_stem"] then
data[ivm] = node["fun_caves:giant_mushroom_cap"]
write = true
break
elseif node_below == node["fun_caves:giant_mushroom_stem"] then
if node_above == node["air"] and math_random(3) == 1 then
data[ivm] = node["fun_caves:giant_mushroom_stem"]
write = true
break
else
data[ivm] = node["fun_caves:huge_mushroom_cap"]
write = true
break
end
end
end
end
elseif y < height and data[ivm] == node["air"] and (data[ivm - area.ystride] == node['default:stone'] or data[ivm - area.ystride] == node['default:sandstone']) then
-- This just places non-abm dirt inside caves.
-- Its value is questionable.
data[ivm - area.ystride] = node["fun_caves:dirt"]
write = true
end
ivm = ivm + area.ystride
index3d = index3d + csize.x
end
end
end
return write
end

View file

@ -1 +1,9 @@
default
bucket?
dye
flowers
mobs?
ramoid?
underworlds?
vessels
wooden_bucket?

188
fungal_tree.lua Normal file
View file

@ -0,0 +1,188 @@
-- Fun_Caves fungal_tree.lua
-- Copyright Duane Robertson (duane@duanerobertson.com), 2017
-- Distributed under the LGPLv2.1 (https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
local colors = {}
colors["^[colorize:#FF00FF:60"] = "dye:violet"
colors["^[colorize:#0000FF:60"] = "dye:blue"
colors["^[colorize:#FF4500:80"] = "dye:green"
colors[""] = "dye:white"
local fungal_tree_leaves = {}
local newnode = fun_caves_mod.clone_node("farming:straw")
newnode.description = "Dry Fiber"
minetest.register_node("fun_caves:dry_fiber", newnode)
minetest.register_node("fun_caves:fungal_tree_fruit", {
description = "Fungal tree fruit",
drawtype = "plantlike",
visual_scale = 0.75,
tiles = {"fun_caves_fungal_tree_fruit.png"},
--inventory_image = ".png",
paramtype = "light",
sunlight_propagates = true,
light_source = 6,
walkable = false,
is_ground_content = false,
selection_box = {
type = "fixed",
fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
},
groups = {fleshy = 3, dig_immediate = 3, flammable = 2},
--on_use = minetest.item_eat(2),
sounds = default.node_sound_leaves_defaults(),
on_timer = fun_caves_mod.soft_boom,
on_punch = fun_caves_mod.soft_boom,
})
local fruit = minetest.get_content_id("fun_caves:fungal_tree_fruit")
function fun_caves_mod.make_fungal_tree(data, area, ivm, height)
if not (data and area and ivm and height and type(data) == 'table' and type(ivm) == 'number' and type(height) == 'number') then
return
end
local leaf = minetest.get_content_id(fungal_tree_leaves[math.random(#fungal_tree_leaves)])
local air = minetest.get_content_id('air')
for y = 0, height do
local radius = 1
if y > 1 and y < height - 2 then
radius = 2
end
for z = -radius,radius do
for x = -radius,radius do
local sr = math.random(1,100)
local i = ivm + z*area.zstride + y*area.ystride + x
if data[i] == air then
if x == 0 and y == 0 and z == 0 then
data[i] = leaf
elseif sr == 1 then
data[i] = fruit
elseif sr < 50 then
data[i] = leaf
end
end
end
end
end
end
-- multicolored growths
local count = 0
for color, dye in pairs(colors) do
count = count + 1
local name = "fun_caves:fungal_tree_leaves_"..count
fungal_tree_leaves[#fungal_tree_leaves+1] = name
minetest.register_node(name, {
description = "Fungal tree growths",
drawtype = "allfaces_optional",
waving = 1,
visual_scale = 1.3,
tiles = {"fun_caves_fungal_tree_leaves.png"..color},
paramtype = "light",
is_ground_content = false,
groups = {snappy=3, flammable=3, plant=1},
drop = {
max_items = 1,
items = {
--{items = {"fun_caves:"..tree.name.."_sapling"}, rarity = tree.drop_rarity },
{items = {name} }
}
},
sounds = default.node_sound_leaves_defaults(),
after_place_node = default.after_place_leaves,
})
minetest.register_craft({
type = "cooking",
output = "fun_caves:dry_fiber",
recipe = name,
cooktime = 2,
})
if dye then
minetest.register_craft({
output = dye,
recipe = {
{name}
}
})
end
end
minetest.register_craft({
type = "fuel",
recipe = "fun_caves:dry_fiber",
burntime = 5,
})
minetest.register_craft({
output = "dye:yellow",
recipe = {
{"flowers:mushroom_brown"}
}
})
minetest.register_craftitem("fun_caves:wooden_bowl", {
description = "Wooden Bowl",
drawtype = "plantlike",
paramtype = "light",
tiles = {"fun_caves_wooden_bowl.png"},
inventory_image = "fun_caves_wooden_bowl.png",
groups = {bowl = 1, dig_immediate = 3},
})
minetest.register_craft({
output = 'fun_caves:wooden_bowl 20',
recipe = {
{'group:wood', '', 'group:wood'},
{'group:wood', '', 'group:wood'},
{'', 'group:wood', ''},
},
})
minetest.register_craftitem("fun_caves:disgusting_gruel", {
description = "Disgusting Gruel",
drawtype = "plantlike",
paramtype = "light",
tiles = {"fun_caves_disgusting_gruel.png"},
inventory_image = "fun_caves_disgusting_gruel.png",
on_use = minetest.item_eat(2),
groups = {dig_immediate = 3},
})
minetest.register_craftitem("fun_caves:disgusting_gruel_raw", {
description = "Bowl Of Gluey Paste",
drawtype = "plantlike",
paramtype = "light",
tiles = {"fun_caves_disgusting_gruel_raw.png"},
inventory_image = "fun_caves_disgusting_gruel_raw.png",
groups = {dig_immediate = 3},
})
minetest.register_craft({
type = "cooking",
output = "fun_caves:disgusting_gruel",
recipe = 'fun_caves:disgusting_gruel_raw',
cooktime = 2,
})
minetest.register_craft({
output = "fun_caves:disgusting_gruel_raw",
type = 'shapeless',
recipe = {
'fun_caves:dry_fiber',
'group:water_bucket',
'group:bowl',
},
replacements = {
{'bucket:bucket_water', 'bucket:bucket_water'},
{'bucket:bucket_river_water', 'bucket:bucket_river_water'},
{'wooden_bucket:bucket_wood_water', 'wooden_bucket:bucket_wood_water'},
{'wooden_bucket:bucket_wood_river_water', 'wooden_bucket:bucket_wood_river_water'},
},
})

View file

@ -1,84 +1,32 @@
fun_caves = {}
fun_caves.version = "1.0"
fun_caves.path = minetest.get_modpath(minetest.get_current_modname())
fun_caves.world = false
-- Fun_Caves init.lua
-- Copyright Duane Robertson (duane@duanerobertson.com), 2017
-- Distributed under the LGPLv2.1 (https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
if fun_caves.world then
minetest.register_on_mapgen_init(function(mgparams)
minetest.set_mapgen_params({mgname="singlenode", flags="nolight"})
end)
if default then
if default.register_ores then
default.register_ores()
end
if default.register_blobs then
default.register_blobs()
end
if default.register_biomes then
default.register_biomes()
end
if default.register_decorations then
default.register_decorations()
end
if flowers.register_decorations then
flowers.register_decorations()
end
end
else
minetest.set_mapgen_params({flags="nocaves"})
end
fun_caves_mod = {}
fun_caves_mod.version = "2.0"
fun_caves_mod.time_factor = 1 -- affects growth abms
fun_caves_mod.light_max = 8 -- light intensity for mushroom growth
fun_caves_mod.path = minetest.get_modpath(minetest.get_current_modname())
fun_caves_mod.world = minetest.get_worldpath()
-- Modify a node to add a group
function minetest.add_group(node, groups)
local def = minetest.registered_items[node]
if not def then
return false
function fun_caves_mod.clone_node(name)
if not (name and type(name) == 'string') then
return
end
local def_groups = def.groups or {}
for group, value in pairs(groups) do
if value ~= 0 then
def_groups[group] = value
else
def_groups[group] = nil
end
end
minetest.override_item(node, {groups = def_groups})
return true
end
function fun_caves.clone_node(name)
local node = minetest.registered_nodes[name]
local node2 = table.copy(node)
return node2
end
function fun_caves.node(name)
if not fun_caves.node_cache then
fun_caves.node_cache = {}
end
if not fun_caves.node_cache[name] then
fun_caves.node_cache[name] = minetest.get_content_id(name)
if name ~= "ignore" and fun_caves.node_cache[name] == 127 then
print("*** Failure to find node: "..name)
end
end
return fun_caves.node_cache[name]
end
minetest.register_on_mapgen_init(function(mgparams)
--minetest.set_mapgen_setting('mg_flags', "nocaves, nodungeons", true)
--minetest.set_mapgen_setting('mg_flags', "nocaves", true)
end)
--dofile(fun_caves.path .. "/nodes.lua")
dofile(fun_caves.path .. "/mapgen.lua")
if fun_caves.world then
minetest.register_on_newplayer(fun_caves.respawn)
minetest.register_on_respawnplayer(fun_caves.respawn)
end
-- Inserting helps to ensure that fun_caves operates first.
table.insert(minetest.registered_on_generateds, 1, fun_caves.generate)
dofile(fun_caves_mod.path .. "/mapgen.lua")
dofile(fun_caves_mod.path .. "/abms.lua")

View file

@ -1,545 +1,279 @@
-- Much of this code is translated directly from the Minetest
-- cavegen.cpp, and is likewise distributed under the LGPL2.1
-- Fun_Caves mapgen.lua
-- Copyright Duane Robertson (duane@duanerobertson.com), 2017
-- Distributed under the LGPLv2.1 (https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
--local DEBUG = true
local node = fun_caves.node
local DEBUG
local max_depth = -28000
local seed_noise = {offset = 0, scale = 32768, seed = 5202, spread = {x = 80, y = 80, z = 80}, octaves = 2, persist = 0.4, lacunarity = 2}
fun_caves_mod.use_bi_hi = true
local ground_nodes = {}
ground_nodes[minetest.get_content_id('default:stone')] = true
ground_nodes[minetest.get_content_id('default:desert_stone')] = true
ground_nodes[minetest.get_content_id('default:sandstone')] = true
ground_nodes[minetest.get_content_id('default:dirt')] = true
ground_nodes[minetest.get_content_id('default:sand')] = true
ground_nodes[minetest.get_content_id('default:dirt_with_grass')] = true
ground_nodes[minetest.get_content_id('default:dirt_with_snow')] = true
ground_nodes[minetest.get_content_id('default:dirt_with_dry_grass')] = true
-- This tables looks up nodes that aren't already stored.
local node = setmetatable({}, {
__index = function(t, k)
if not (t and k and type(t) == 'table') then
return
end
t[k] = minetest.get_content_id(k)
return t[k]
end
})
local data = {}
local p2data = {} -- vm rotation data buffer
local lightmap = {}
local vm, emin, emax, a, csize, heightmap, biomemap
local div_sz_x, div_sz_z, minp, maxp, terrain, cave
local terrain_noise = {offset = 0,
scale = 20, seed = 8829, spread = {x = 40, y = 40, z = 40},
octaves = 6, persist = 0.4, lacunarity = 2}
local cave_noise = {offset = 0, scale = 1,
seed = -3977, spread = {x = 30, y = 30, z = 30}, octaves = 3,
persist = 0.8, lacunarity = 2}
fun_caves_mod.cave_biomes = {
algae = {
biome_val_low = 0,
biome_val_high = 0.2,
ceiling_node = 'fun_caves:stone_with_algae',
dirt = 'default:dirt',
dirt_chance = 10,
floor_node = 'fun_caves:stone_with_algae',
fungi = true,
stalactite = 'fun_caves:stalactite_slimy',
stalactite_chance = 12,
stalagmite = 'fun_caves:stalagmite_slimy',
stalagmite_chance = 12,
stone_depth = 1,
underwater = true,
},
coal = {
biome_val_low = 0.5,
biome_val_high = 0.6,
ceiling_node = 'fun_caves:black_sand',
deco = 'default:coalblock',
deco_chance = 100,
floor_node = 'fun_caves:black_sand',
stalagmite = 'fun_caves:constant_flame',
stalagmite_chance = 50,
stone_depth = 2,
underwater = false,
},
hot = {
biome_val_low = 0.6,
biome_val_high = 99,
ceiling_node = 'fun_caves:hot_cobble',
floor_node = 'fun_caves:hot_cobble',
fluid = 'default:lava_source',
fluid_chance = 300,
stalagmite = fun_caves_mod.hot_spikes,
stalagmite_chance = 50,
stone_depth = 1,
underwater = false,
},
ice = {
biome_val_low = -99,
biome_val_high = -0.6,
ceiling_node = 'default:ice',
floor_node = 'default:ice',
stalactite = 'fun_caves:icicle_down',
stalactite_chance = 12,
stalagmite = 'fun_caves:icicle_up',
stalagmite_chance = 12,
stone_depth = 2,
underwater = true,
},
ice_thin = {
biome_val_low = -0.6,
biome_val_high = -0.5,
ceiling_node = 'fun_caves:thin_ice',
floor_node = 'fun_caves:thin_ice',
stone_depth = 2,
underwater = true,
},
lichen = {
biome_val_low = -0.3,
biome_val_high = 0,
ceiling_node = 'fun_caves:stone_with_lichen',
dirt = 'default:dirt',
dirt_chance = 10,
floor_node = 'fun_caves:stone_with_lichen',
fungi = true,
stalactite = 'fun_caves:stalactite',
stalactite_chance = 12,
stalagmite = 'fun_caves:stalagmite',
stalagmite_chance = 12,
stone_depth = 1,
underwater = true,
},
lichen_dead = {
biome_val_low = -0.6,
biome_val_high = -0.5,
ceiling_node = 'fun_caves:stone_with_lichen',
floor_node = 'fun_caves:stone_with_lichen',
stalactite = 'fun_caves:stalactite',
stalactite_chance = 12,
stalagmite = 'fun_caves:stalagmite',
stalagmite_chance = 12,
stone_depth = 1,
underwater = true,
},
moss = {
biome_val_low = -0.5,
biome_val_high = -0.3,
ceiling_node = 'fun_caves:stone_with_moss',
deco = 'fun_caves:glowing_fungal_stone',
deco_chance = 50,
floor_node = 'fun_caves:stone_with_moss',
fluid = 'default:water_source',
fluid_chance = 300,
stalactite = 'fun_caves:stalactite_mossy',
stalactite_chance = 12,
stalagmite = 'fun_caves:stalagmite_mossy',
stalagmite_chance = 12,
stone_depth = 1,
underwater = true,
},
salt = {
biome_val_low = 0.2,
biome_val_high = 0.35,
ceiling_node = 'fun_caves:stone_with_salt',
deco = 'fun_caves:radioactive_ore',
deco_chance = 500,
floor_node = 'fun_caves:stone_with_salt',
stone_depth = 2,
underwater = false,
},
sand = {
biome_val_low = 0.35,
biome_val_high = 0.5,
ceiling_node = 'default:sand',
floor_node = 'default:sand',
stone_depth = 2,
underwater = true,
},
}
local seed_noise = {offset = 0, scale = 32768,
seed = 5202, spread = {x = 80, y = 80, z = 80}, octaves = 2,
persist = 0.4, lacunarity = 2}
if fun_caves.world then
fun_caves.biomes = {}
local biomes = fun_caves.biomes
local biome_names = {}
biome_names["common"] = {}
biome_names["uncommon"] = {}
do
local biome_terrain_scale = {}
biome_terrain_scale["coniferous_forest"] = 0.75
biome_terrain_scale["rainforest"] = 0.33
biome_terrain_scale["underground"] = 1.5
local tree_biomes = {}
tree_biomes["deciduous_forest"] = {"deciduous_trees"}
tree_biomes["coniferous_forest"] = {"conifer_trees"}
tree_biomes["taiga"] = {"conifer_trees"}
tree_biomes["rainforest"] = {"jungle_trees"}
tree_biomes["rainforest_swamp"] = {"jungle_trees"}
tree_biomes["coniferous_forest"] = {"conifer_trees"}
tree_biomes["savanna"] = {"acacia_trees"}
for i, obiome in pairs(minetest.registered_biomes) do
local biome = table.copy(obiome)
biome.special_tree_prob = 2
if biome.name == "savanna" then
biome.special_tree_prob = 30
end
local rarity = "common"
biome.terrain_scale = biome_terrain_scale[biome] or 0.5
if string.find(biome.name, "ocean") then
biome.terrain_scale = 1
rarity = "uncommon"
end
if string.find(biome.name, "swamp") then
biome.terrain_scale = 0.25
rarity = "uncommon"
end
if string.find(biome.name, "beach") then
biome.terrain_scale = 0.25
rarity = "uncommon"
end
if string.find(biome.name, "^underground$") then
biome.node_top = "default:stone"
rarity = "uncommon"
end
biome.special_trees = tree_biomes[biome.name]
biomes[biome.name] = biome
biome_names[rarity][#biome_names[rarity]+1] = biome.name
end
end
biomes["control"] = {}
end
if false then
local cave_stones = {
"fun_caves:stone_with_moss",
"fun_caves:stone_with_lichen",
"fun_caves:stone_with_algae",
"fun_caves:stone_with_salt",
}
local mushroom_stones = {}
mushroom_stones[node("default:stone")] = true
mushroom_stones[node("fun_caves:stone_with_algae")] = true
mushroom_stones[node("fun_caves:stone_with_lichen")] = true
end
local function place_schematic(pos, schem, center)
local rot = math.random(4) - 1
local yslice = {}
if schem.yslice_prob then
for _, ys in pairs(schem.yslice_prob) do
yslice[ys.ypos] = ys.prob
end
local function generate(p_minp, p_maxp, seed)
if not (p_minp and p_maxp and seed) then
return
end
if center then
pos.x = pos.x - math.floor(schem.size.x / 2)
pos.z = pos.z - math.floor(schem.size.z / 2)
local minp, maxp = p_minp, p_maxp
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
if not (vm and emin and emax) then
return
end
for z1 = 0, schem.size.z - 1 do
for x1 = 0, schem.size.x - 1 do
local x, z
if rot == 0 then
x, z = x1, z1
elseif rot == 1 then
x, z = schem.size.z - z1 - 1, x1
elseif rot == 2 then
x, z = schem.size.x - x1 - 1, schem.size.z - z1 - 1
elseif rot == 3 then
x, z = z1, schem.size.x - x1 - 1
end
local dz = pos.z - minp.z + z
local dx = pos.x - minp.x + x
if pos.x + x > minp.x and pos.x + x < maxp.x and pos.z + z > minp.z and pos.z + z < maxp.z then
local ivm = a:index(pos.x + x, pos.y, pos.z + z)
local isch = z1 * schem.size.y * schem.size.x + x1 + 1
for y = 0, schem.size.y - 1 do
local dy = pos.y - minp.y + y
if math.min(dx, csize.x - dx) + math.min(dy, csize.y - dy) + math.min(dz, csize.z - dz) > bevel then
if yslice[y] or 255 >= math.random(255) then
local prob = schem.data[isch].prob or schem.data[isch].param1 or 255
if prob >= math.random(255) and schem.data[isch].name ~= "air" then
data[ivm] = node(schem.data[isch].name)
end
local param2 = schem.data[isch].param2 or 0
p2data[ivm] = param2
end
end
ivm = ivm + a.ystride
isch = isch + schem.size.x
end
end
end
end
end
local function get_decoration(biome)
for i, deco in pairs(fun_caves.decorations) do
if not deco.biomes or deco.biomes[biome] then
local range = 1000
if deco.deco_type == "simple" then
if deco.fill_ratio and math.random(range) - 1 < deco.fill_ratio * 1000 then
return deco.decoration
end
else
-- nop
end
end
end
end
local np_cave = {offset = 6, scale = 6, seed = 34329, spread = {x = 250, y = 250, z = 250}, octaves = 3, persist = 0.5, lacunarity = 2}
local function rangelim(x, y, z)
return math.max(math.min(x, z), y)
end
local function carveRoute(this, vec, f, randomize_xz, tunnel_above_ground)
local startp = vector.new(this.orp)
startp = vector.add(startp, this.of)
local fp = vector.add(this.orp, vector.multiply(vec, f))
fp.x = fp.x + 0.1 * math.random(-10, 10)
fp.z = fp.z + 0.1 * math.random(-10, 10)
local cp = vector.new(fp)
local d0 = -this.rs/2
local d1 = d0 + this.rs
if (randomize_xz) then
d0 = d0 + math.random(-1, 1)
d1 = d1 + math.random(-1, 1)
end
for z0 = d0, d1 do
local si = this.rs / 2 - math.max(0, math.abs(z0) - this.rs / 7 - 1)
for x0 = -si - math.random(0,1), si - 1 + math.random(0,1) do
if (tunnel_above_ground) then
--continue
else
local maxabsxz = math.max(math.abs(x0), math.abs(z0))
local si2 = this.rs / 2 - math.max(0, maxabsxz - this.rs / 7 - 1)
for y0 = -si2, si2 do
if (this.large_cave_is_flat) then
-- Make large caves not so tall
if (this.rs > 7 and math.abs(y0) >= this.rs / 3) then
--continue
else
local p = vector.new(cp.x + x0, cp.y + y0, cp.z + z0)
p = vector.add(p, this.of)
if not a:containsp(p) then
--continue
else
local i = a:indexp(vector.round(p))
local c = data[i]
--if (not ndef.get(c).is_ground_content) then
-- ** check for ground content? **
local donotdig = false
if c == node("default:desert_sand") then
donotdig = true
end
if donotdig then
--continue
else
if (this.large_cave) then
local full_ymin = minp.y - 16
local full_ymax = maxp.y + 16
if this.flooded and not this.lava_cave then
data[i] = (p.y <= this.water_level) and node("default:water_source") or node("air")
elseif this.flooded then
data[i] = (p.y < startp.y - 2) and node("default:lava_source") or node("air")
else
data[i] = node("air")
end
else
if (c == node("ignore") or c == node("air")) then
--continue
else
data[i] = node("air")
end
end
end
end
end
end
end
end
end
end
end
local function makeTunnel(this, dirswitch)
if dirswitch and not this.large_cave then
this.main_direction = vector.new(
((math.random() * 20) - 10) / 10,
((math.random() * 20) - 10) / 30,
((math.random() * 20) - 10) / 10
)
this.main_direction = vector.multiply(this.main_direction, math.random(0, 10) / 10)
end
-- Randomize size
local min_d = this.min_tunnel_diameter
local max_d = this.max_tunnel_diameter
this.rs = math.random(min_d, max_d)
local rs_part_max_length_rs = this.rs * this.part_max_length_rs
local maxlen
if this.large_cave then
maxlen = vector.new(
rs_part_max_length_rs,
rs_part_max_length_rs / 2,
rs_part_max_length_rs
)
else
maxlen = vector.new(
rs_part_max_length_rs,
math.random(1, rs_part_max_length_rs),
rs_part_max_length_rs
)
end
local vec = vector.new(
(math.random() * maxlen.x) - maxlen.x / 2,
(math.random() * maxlen.y) - maxlen.y / 2,
(math.random() * maxlen.z) - maxlen.z / 2
)
-- Jump downward sometimes
if not this.large_cave and math.random(0, 12) == 0 then
vec = vector.new(
(math.random() * maxlen.x) - maxlen.x / 2,
(math.random() * (maxlen.y * 2)) - maxlen.y,
(math.random() * maxlen.z) - maxlen.z / 2
)
end
-- Do not make caves that are entirely above ground, to fix
-- shadow bugs caused by overgenerated large caves.
-- It is only necessary to check the startpoint and endpoint.
local orpi = vector.new(this.orp.x, this.orp.y, this.orp.z)
local veci = vector.new(vec.x, vec.y, vec.z)
local h1
local h2
local p1 = vector.add(orpi, veci, this.of, this.rs / 2)
if (p1.z >= minp.z and p1.z <= maxp.z and
p1.x >= minp.x and p1.x <= maxp.x) then
local index1 = math.floor(p1.z - minp.z + 0.5) * csize.x + math.floor(p1.x - minp.x + 0.5) + 1
h1 = heightmap[index1]
else
h1 = this.water_level -- If not in heightmap
end
local p2 = vector.add(orpi, this.of, this.rs / 2)
if (p2.z >= minp.z and p2.z <= maxp.z and
p2.x >= minp.x and p2.x <= maxp.x) then
local index2 = math.floor(p2.z - minp.z + 0.5) * csize.x + math.floor(p2.x - minp.x + 0.5) + 1
h2 = heightmap[index2]
else
h2 = this.water_level
end
-- If startpoint and endpoint are above ground,
-- disable placing of nodes in carveRoute while
-- still running all pseudorandom calls to ensure
-- caves consistent with existing worlds.
local tunnel_above_ground = p1.y > h1 and p2.y > h2
vec = vector.add(vec, this.main_direction)
local rp = vector.add(this.orp, vec)
if (rp.x < 0) then
rp.x = 0
elseif (rp.x >= this.ar.x) then
rp.x = this.ar.x - 1
end
if (rp.y < this.route_y_min) then
rp.y = this.route_y_min
elseif (rp.y >= this.route_y_max) then
rp.y = this.route_y_max - 1
end
if (rp.z < 0) then
rp.z = 0
elseif (rp.z >= this.ar.z) then
rp.z = this.ar.z - 1
end
vec = vector.subtract(rp, this.orp)
local veclen = vector.length(vec)
-- As odd as it sounds, veclen is *exactly* 0.0 sometimes, causing a FPE
if (veclen < 0.05) then
veclen = 1.0
end
-- Every second section is rough
local randomize_xz = (math.random(1, 2) == 1)
-- Carve routes
for f = 0, 1, 1.0 / veclen do
--print(dump(vec))
carveRoute(this, vec, f, randomize_xz, tunnel_above_ground)
end
this.orp = rp
end
local function makeCave(this, max_stone_height)
this.max_stone_y = max_stone_height
this.main_direction = vector.new(0, 0, 0)
--print(dump(this))
-- Allowed route area size in nodes
this.ar = vector.add(vector.subtract(maxp, minp), 1)
-- Area starting point in nodes
this.of = minp
-- Allow a bit more
--(this should be more than the maximum radius of the tunnel)
local max_spread_amount = 16
local insure = 10
local more = math.max(max_spread_amount - this.max_tunnel_diameter / 2 - insure, 1)
this.ar = vector.add(this.ar, vector.multiply(vector.new(1,0,1), (more * 2)))
this.of = vector.subtract(this.of, vector.multiply(vector.new(1,0,1), more))
this.route_y_min = 0
-- Allow half a diameter + 7 over stone surface
this.route_y_max = -this.of.y + this.max_stone_y + this.max_tunnel_diameter / 2 + 7
-- Limit maximum to area
this.route_y_max = rangelim(this.route_y_max, 0, this.ar.y - 1)
if this.large_cave then
local min = 0
if minp.y < this.water_level and maxp.y > this.water_level then
min = this.water_level - this.max_tunnel_diameter/3 - this.of.y
this.route_y_max = this.water_level + this.max_tunnel_diameter/3 - this.of.y
end
this.route_y_min = math.random(min, min + this.max_tunnel_diameter)
this.route_y_min = rangelim(this.route_y_min, 0, this.route_y_max)
end
local route_start_y_min = this.route_y_min
local route_start_y_max = this.route_y_max
route_start_y_min = rangelim(route_start_y_min, 0, this.ar.y-1)
route_start_y_max = rangelim(route_start_y_max, route_start_y_min, this.ar.y-1)
-- Randomize starting position
this.orp = vector.new(
(math.random() * this.ar.x) + 0.5,
(math.random(route_start_y_min, route_start_y_max)) + 0.5,
(math.random() * this.ar.z) + 0.5
)
-- Generate some tunnel starting from orp
for j = 0, this.tunnel_routepoints do
--print(dump(this.orp))
makeTunnel(this, j % this.dswitchint == 0)
end
end
local function CaveV6(is_large_cave)
local this = {}
this.water_level = 1
this.large_cave = is_large_cave
this.min_tunnel_diameter = 2
this.max_tunnel_diameter = math.random(2, 6)
this.dswitchint = math.random(1, 14)
this.flooded = true
this.lava_cave = false
if maxp.y < this.water_level and minp.y / 31000 - math.random() < -0.5 then
this.lava_cave = true
end
if this.large_cave then
this.part_max_length_rs = math.random(2,4)
this.tunnel_routepoints = math.random(5, math.random(15,30))
this.min_tunnel_diameter = 5
this.max_tunnel_diameter = math.random(7, math.random(8,24))
else
this.part_max_length_rs = math.random(2,9)
this.tunnel_routepoints = math.random(10, math.random(15,30))
end
this.large_cave_is_flat = (math.random(0,1) == 0)
return this
end
local function getBiome(x, z)
return nil
end
local function generateCaves(max_stone_y)
local cave_amount = minetest.get_perlin(np_cave):get2d({x=minp.x, y=minp.y})
local volume_nodes = (maxp.x - minp.x + 1) * (maxp.y - minp.y + 1) * 16
cave_amount = math.max(0.0, cave_amount)
local caves_count = cave_amount * volume_nodes / 50000
local bruises_count = 1
if (math.random(1, 6) == 1) then
bruises_count = math.random(0, math.random(0, 2))
end
if (getBiome(minp.x, minp.z) == "desert") then
caves_count = caves_count / 3
bruises_count = caves_count / 3
end
for i = 0, caves_count + bruises_count do
local large_cave = (i >= caves_count)
local cave = CaveV6(large_cave)
--print(dump(cave))
makeCave(cave, max_stone_y)
end
end
function fun_caves.generate(p_minp, p_maxp, seed)
minp, maxp = p_minp, p_maxp
vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
vm:get_data(data)
--p2data = vm:get_param2_data()
a = VoxelArea:new({MinEdge = emin, MaxEdge = emax})
csize = vector.add(vector.subtract(maxp, minp), 1)
heightmap = minetest.get_mapgen_object("heightmap")
local heightmap
local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax})
local csize = vector.add(vector.subtract(maxp, minp), 1)
local write
local max_stone_height = -40000
if minetest.get_modpath('ramoid') and ramoid_mod and ramoid_mod.ramoid_depth then
local avg = (minp.y + maxp.y) / 2
if avg > (ramoid_mod.ramoid_depth - 1) * 80 - 32 and avg < ramoid_mod.ramoid_depth * 80 - 32 then
return
end
end
if minetest.get_modpath('underworlds') and underworlds_mod and underworlds_mod.underzones then
local avg = (minp.y + maxp.y) / 2
for _, uz in pairs(underworlds_mod.underzones) do
if avg <= uz.upper_bound and avg >= uz.lower_bound then
return
end
end
end
if fun_caves_mod.use_bi_hi then
heightmap = minetest.get_mapgen_object("heightmap")
end
-- Correct heightmap.
if maxp.y < -300 or minp.y > 300 then
for i = 1, #heightmap do
heightmap[i] = (maxp.y < 0) and max_depth or - max_depth
end
else
local index = 0
for z = minp.z, maxp.z do
for x = minp.x, maxp.x do
index = index + 1
if max_stone_height < heightmap[index] then
max_stone_height = heightmap[index]
end
end
end
-- Deal with memory issues. This, of course, is supposed to be automatic.
local mem = math.floor(collectgarbage("count")/1024)
if mem > 400 then
print("Fun Caves: Manually collecting garbage...")
collectgarbage("collect")
end
-- use the same seed (based on perlin noise).
math.randomseed(minetest.get_perlin(seed_noise):get2d({x=minp.x, y=minp.z}))
-- Keep this first after seeding!
local px = math.floor((minp.x + 32) / csize.x)
local pz = math.floor((minp.z + 32) / csize.z)
generateCaves(max_stone_height)
--local index = 0
--local index3d = 0
--for z = minp.z, maxp.z do
-- local dz = z - minp.z
-- for x = minp.x, maxp.x do
-- index = index + 1
-- local dx = x - minp.x
-- index3d = dz * csize.y * csize.x + dx + 1
-- local ivm = a:index(x, minp.y, z)
-- for y = minp.y, maxp.y do
-- local dy = y - minp.y
-- ivm = ivm + a.ystride
-- index3d = index3d + csize.x
-- end
-- end
--end
vm:set_data(data)
--minetest.generate_ores(vm, minp, maxp)
--minetest.generate_decorations(vm, minp, maxp)
--vm:set_param2_data(p2data)
if DEBUG then
vm:set_lighting({day = 15, night = 15})
local height = heightmap[index]
if height and height < maxp.y - 1 and height > minp.y then
--nop
else
vm:set_lighting({day = 0, night = 0})
height = - max_depth
local ivm2 = area:index(x, maxp.y + 8, z)
for y = maxp.y + 8, minp.y - 8, -1 do
if ground_nodes[data[ivm2]] then
height = (y < maxp.y + 8) and y or max_depth
break
end
ivm2 = ivm2 - area.ystride
end
heightmap[index] = height
end
end
end
end
for fake_loop = 1, 1 do
if fun_caves_mod.cavegen and fun_caves_mod.decogen then
local h2, write_cave
write_cave = fun_caves_mod.cavegen(minp, maxp, data, area, node, heightmap)
write = write or write_cave
local write_deco
write_deco = fun_caves_mod.decogen(minp, maxp, data, area, node, heightmap)
write = write or write_deco
end
end
if write then
vm:set_data(data)
if DEBUG then
vm:set_lighting({day = 8, night = 8})
else
vm:set_lighting({day = 0, night = 0}, minp, maxp)
vm:calc_lighting()
end
vm:update_liquids()
vm:write_to_map()
vm, a, lightmap, heightmap, biomemap, terrain, cave = nil, nil, nil, nil, nil, nil, nil
end
end
if fun_caves_mod.path then
dofile(fun_caves_mod.path .. "/cavegen.lua")
dofile(fun_caves_mod.path .. "/deco.lua")
end
local function pgenerate(...)
local status, err = pcall(generate, ...)
--local status, err = true
--generate(...)
if not status then
print('Fun Caves: Could not generate terrain:')
print(dump(err))
collectgarbage("collect")
end
end
-- Inserting helps to ensure that fun_caves_mod operates first.
--table.insert(minetest.registered_on_generateds, 1, pgenerate)
minetest.register_on_generated(pgenerate)

451
nodes.lua Normal file
View file

@ -0,0 +1,451 @@
-- Fun_Caves nodes.lua
-- Copyright Duane Robertson (duane@duanerobertson.com), 2017
-- Distributed under the LGPLv2.1 (https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
local light_max = fun_caves_mod.light_max or 10
if minetest.registered_items['underworlds:black_sand'] then
minetest.register_alias("fun_caves:black_sand", 'underworlds:black_sand')
else
-- black (oily) sand
local newnode = fun_caves_mod.clone_node("default:sand")
newnode.description = "Black Sand"
newnode.tiles = {"fun_caves_black_sand.png"}
newnode.groups['falling_node'] = 0
minetest.register_node("fun_caves:black_sand", newnode)
end
if minetest.registered_items['underworlds:hot_cobble'] then
minetest.register_alias("fun_caves:hot_cobble", 'underworlds:hot_cobble')
else
-- cobble, hot - cobble with lava instead of mortar XD
minetest.register_node("fun_caves:hot_cobble", {
description = "Hot Cobble",
tiles = {"caverealms_hot_cobble.png"},
is_ground_content = true,
groups = {crumbly=2, surface_hot=3},
--light_source = 2,
damage_per_second = 1,
sounds = default.node_sound_stone_defaults({
footstep = {name="default_stone_footstep", gain=0.25},
}),
})
end
if minetest.registered_items['underworlds:glowing_fungal_stone'] then
minetest.register_alias("fun_caves:glowing_fungal_stone", 'underworlds:glowing_fungal_stone')
minetest.register_alias("fun_caves:glowing_fungus", 'underworlds:glowing_fungus')
else
-- Glowing fungal stone provides an eerie light.
minetest.register_node("fun_caves:glowing_fungal_stone", {
description = "Glowing Fungal Stone",
tiles = {"default_stone.png^vmg_glowing_fungal.png",},
is_ground_content = true,
light_source = light_max - 4,
groups = {cracky=3, stone=1},
drop = {items={ {items={"default:cobble"},}, {items={"fun_caves:glowing_fungus",},},},},
sounds = default.node_sound_stone_defaults(),
})
-- Glowing fungus grows underground.
minetest.register_craftitem("fun_caves:glowing_fungus", {
description = "Glowing Fungus",
drawtype = "plantlike",
paramtype = "light",
tiles = {"vmg_glowing_fungus.png"},
inventory_image = "vmg_glowing_fungus.png",
groups = {dig_immediate = 3},
})
end
-- moon glass (glows)
if not minetest.registered_items['elixirs:moon_glass'] then
newnode = fun_caves_mod.clone_node("default:glass")
newnode.description = "Glowing Glass"
newnode.light_source = default.LIGHT_MAX
minetest.register_node("fun_caves:moon_glass", newnode)
end
-- Moon juice is extracted from glowing fungus, to make glowing materials.
minetest.register_craftitem("fun_caves:moon_juice", {
description = "Moon Juice",
drawtype = "plantlike",
paramtype = "light",
tiles = {"vmg_moon_juice.png"},
inventory_image = "vmg_moon_juice.png",
--groups = {dig_immediate = 3, attached_node = 1},
groups = {dig_immediate = 3, vessel = 1},
sounds = default.node_sound_glass_defaults(),
})
-- mushroom cap, giant
local cap = {
description = "Giant Mushroom Cap",
tiles = {"vmg_mushroom_giant_cap.png", "vmg_mushroom_giant_under.png", "vmg_mushroom_giant_cap.png"},
is_ground_content = false,
paramtype = "light",
drawtype = "nodebox",
node_box = { type = "fixed",
fixed = {
{-0.3, -0.25, -0.3, 0.3, 0.5, 0.3},
{-0.3, -0.25, -0.4, 0.3, 0.4, -0.3},
{-0.3, -0.25, 0.3, 0.3, 0.4, 0.4},
{-0.4, -0.25, -0.3, -0.3, 0.4, 0.3},
{0.3, -0.25, -0.3, 0.4, 0.4, 0.3},
{-0.4, -0.5, -0.4, 0.4, -0.25, 0.4},
{-0.5, -0.5, -0.4, -0.4, -0.25, 0.4},
{0.4, -0.5, -0.4, 0.5, -0.25, 0.4},
{-0.4, -0.5, -0.5, 0.4, -0.25, -0.4},
{-0.4, -0.5, 0.4, 0.4, -0.25, 0.5},
} },
light_source = light_max,
groups = {fleshy=1, falling_node = 1, dig_immediate=3, flammable=2, plant=1},
}
minetest.register_node("fun_caves:giant_mushroom_cap", cap)
-- mushroom cap, huge
minetest.register_node("fun_caves:huge_mushroom_cap", {
description = "Huge Mushroom Cap",
tiles = {"vmg_mushroom_giant_cap.png", "vmg_mushroom_giant_under.png", "vmg_mushroom_giant_cap.png"},
is_ground_content = false,
paramtype = "light",
drawtype = "nodebox",
node_box = { type = "fixed",
fixed = {
{-0.5, -0.5, -0.33, 0.5, -0.33, 0.33},
{-0.33, -0.5, 0.33, 0.33, -0.33, 0.5},
{-0.33, -0.5, -0.33, 0.33, -0.33, -0.5},
{-0.33, -0.33, -0.33, 0.33, -0.17, 0.33},
} },
light_source = light_max,
groups = {fleshy=1, falling_node = 1, dig_immediate=3, flammable=2, plant=1},
})
-- mushroom stem, giant or huge
minetest.register_node("fun_caves:giant_mushroom_stem", {
description = "Giant Mushroom Stem",
tiles = {"vmg_mushroom_giant_stem.png", "vmg_mushroom_giant_stem.png", "vmg_mushroom_giant_stem.png"},
is_ground_content = false,
groups = {choppy=2, flammable=2, plant=1},
sounds = default.node_sound_wood_defaults(),
sunlight_propagates = true,
paramtype = "light",
drawtype = "nodebox",
node_box = { type = "fixed", fixed = { {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25}, }},
})
-- obsidian, glowing
minetest.register_node("fun_caves:glow_obsidian", {
description = "Glowing Obsidian",
tiles = {"caverealms_glow_obsidian.png"},
is_ground_content = true,
groups = {stone=2, crumbly=1},
--light_source = 7,
sounds = default.node_sound_stone_defaults({
footstep = {name="default_stone_footstep", gain=0.25},
}),
})
-- obsidian, glowing, 2 - has traces of lava
minetest.register_node("fun_caves:glow_obsidian_2", {
description = "Hot Glow Obsidian",
tiles = {"caverealms_glow_obsidian2.png"},
is_ground_content = true,
groups = {stone=2, crumbly=1, surface_hot=3, igniter=1},
damage_per_second = 1,
--light_source = 9,
sounds = default.node_sound_stone_defaults({
footstep = {name="default_stone_footstep", gain=0.25},
}),
})
-- salt
minetest.register_node("fun_caves:stone_with_salt", {
description = "Cave Stone with Salt",
tiles = {"caverealms_salty2.png"},
paramtype = "light",
use_texture_alpha = true,
drawtype = "glasslike",
sunlight_propagates = false,
is_ground_content = true,
groups = {stone=1, crumbly=3, cracky=3},
sounds = default.node_sound_glass_defaults(),
})
-- salt, radioactive ore
newnode = fun_caves_mod.clone_node("fun_caves:stone_with_salt")
newnode.description = "Salt With Radioactive Ore"
newnode.tiles = {"fun_caves_radioactive_ore.png"}
newnode.light_source = 4
minetest.register_node("fun_caves:radioactive_ore", newnode)
if minetest.registered_items['underworlds:thin_ice'] then
minetest.register_alias("fun_caves:thin_ice", 'underworlds:thin_ice')
else
-- ice, thin -- transparent
minetest.register_node("fun_caves:thin_ice", {
description = "Thin Ice",
tiles = {"caverealms_thin_ice.png"},
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_glass_defaults(),
use_texture_alpha = true,
light_source = 1,
drawtype = "glasslike",
sunlight_propagates = true,
freezemelt = "default:water_source",
paramtype = "light",
})
end
-- What's a cave without speleothems?
local spel = {
{type1="stalactite", type2="stalagmite", tile="default_stone.png"},
{type1="stalactite_slimy", type2="stalagmite_slimy", tile="default_stone.png^fun_caves_algae.png"},
{type1="stalactite_mossy", type2="stalagmite_mossy", tile="default_stone.png^fun_caves_moss.png"},
{type1="icicle_down", type2="icicle_up", desc="Icicle", tile="caverealms_thin_ice.png", drop="default:ice"},
}
if minetest.registered_items['underworlds:stalactite'] then
for _, desc in pairs(spel) do
minetest.register_alias("fun_caves:"..desc.type1, 'underworlds:'..desc.type1)
minetest.register_alias("fun_caves:"..desc.type2, 'underworlds:'..desc.type2)
end
else
for _, desc in pairs(spel) do
minetest.register_node("fun_caves:"..desc.type1, {
description = (desc.desc or "Stalactite"),
tiles = {desc.tile},
is_ground_content = true,
walkable = false,
paramtype = "light",
drop = (desc.drop or "fun_caves:stalactite"),
drawtype = "nodebox",
node_box = { type = "fixed",
fixed = {
{-0.07, 0.0, -0.07, 0.07, 0.5, 0.07},
{-0.04, -0.25, -0.04, 0.04, 0.0, 0.04},
{-0.02, -0.5, -0.02, 0.02, 0.25, 0.02},
} },
groups = {rock=1, cracky=3},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("fun_caves:"..desc.type2, {
description = (desc.desc or "Stalagmite"),
tiles = {desc.tile},
is_ground_content = true,
walkable = false,
paramtype = "light",
drop = "fun_caves:stalagmite",
drawtype = "nodebox",
node_box = { type = "fixed",
fixed = {
{-0.07, -0.5, -0.07, 0.07, 0.0, 0.07},
{-0.04, 0.0, -0.04, 0.04, 0.25, 0.04},
{-0.02, 0.25, -0.02, 0.02, 0.5, 0.02},
} },
groups = {rock=1, cracky=3},
sounds = default.node_sound_stone_defaults(),
})
end
end
-- spikes, hot -- silicon-based life
local spike_size = { 1.0, 1.2, 1.4, 1.6, 1.7 }
fun_caves_mod.hot_spikes = {}
for i in ipairs(spike_size) do
if i == 1 then
nodename = "fun_caves:hot_spike"
else
nodename = "fun_caves:hot_spike_"..i
end
fun_caves_mod.hot_spikes[#fun_caves_mod.hot_spikes+1] = nodename
vs = spike_size[i]
minetest.register_node(nodename, {
description = "Stone Spike",
tiles = {"fun_caves_hot_spike.png"},
inventory_image = "fun_caves_hot_spike.png",
wield_image = "fun_caves_hot_spike.png",
is_ground_content = true,
groups = {cracky=3, oddly_breakable_by_hand=1, surface_hot=3},
damage_per_second = 1,
sounds = default.node_sound_stone_defaults(),
paramtype = "light",
drawtype = "plantlike",
walkable = false,
light_source = i * 2,
buildable_to = true,
visual_scale = vs,
selection_box = {
type = "fixed",
fixed = {-0.5*vs, -0.5*vs, -0.5*vs, 0.5*vs, -5/16*vs, 0.5*vs},
}
})
end
fun_caves_mod.hot_spike = {}
for i = 1, #fun_caves_mod.hot_spikes do
fun_caves_mod.hot_spike[fun_caves_mod.hot_spikes[i]] = i
end
-- stone with algae
newnode = fun_caves_mod.clone_node("default:stone")
newnode.description = "Cave Stone With Algae"
newnode.tiles = {"default_stone.png^fun_caves_algae.png"}
newnode.groups = {stone=1, cracky=3, crumbly=3}
newnode.sounds = default.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain=0.25},
})
minetest.register_node("fun_caves:stone_with_algae", newnode)
if minetest.registered_items['underworlds:hot_stone'] then
minetest.register_alias("fun_caves:hot_stone", 'underworlds:hot_stone')
else
-- stone, hot
minetest.register_node("fun_caves:hot_stone", {
description = "Hot Stone",
tiles = {"default_desert_stone.png^[colorize:#FF0000:150"},
is_ground_content = true,
groups = {crumbly=2, surface_hot=3},
light_source = light_max - 5,
damage_per_second = 1,
sounds = default.node_sound_stone_defaults({
footstep = {name="default_stone_footstep", gain=0.25},
}),
})
end
-- stone with lichen
newnode = fun_caves_mod.clone_node("default:stone")
newnode.description = "Cave Stone With Lichen"
newnode.tiles = {"default_stone.png^fun_caves_lichen.png"}
newnode.groups = {stone=1, cracky=3, crumbly=3}
newnode.sounds = default.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain=0.25},
})
minetest.register_node("fun_caves:stone_with_lichen", newnode)
-- stone with moss
newnode = fun_caves_mod.clone_node("default:stone")
newnode.description = "Cave Stone With Moss"
newnode.tiles = {"default_stone.png^fun_caves_moss.png"}
newnode.groups = {stone=1, cracky=3, crumbly=3}
newnode.sounds = default.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain=0.25},
})
minetest.register_node("fun_caves:stone_with_moss", newnode)
------------------------------------
-- recipes
------------------------------------
-- Mushroom stems can be used as wood and leather,
-- ala Journey to the Center of the Earth.
minetest.register_craft({
output = "default:wood",
recipe = {
{"fun_caves:giant_mushroom_stem"}
}
})
if minetest.registered_items['mobs:leather'] then
minetest.register_craft({
output = "mobs:leather",
recipe = {
{"fun_caves:giant_mushroom_cap"}
}
})
end
minetest.register_craft({
output = "dye:red",
recipe = {
{"flowers:mushroom_red"}
}
})
--minetest.register_craft({
-- output = "dye:yellow",
-- recipe = {
-- {"flowers:mushroom_brown"}
-- }
--})
minetest.register_craft({
output = 'default:paper 6',
recipe = {
{'fun_caves:giant_mushroom_stem', 'fun_caves:giant_mushroom_stem', 'fun_caves:giant_mushroom_stem'},
}
})
-- Caps can be cooked and eaten.
minetest.register_node("fun_caves:mushroom_steak", {
description = "Mushroom Steak",
drawtype = "plantlike",
paramtype = "light",
tiles = {"vmg_mushroom_steak.png"},
inventory_image = "vmg_mushroom_steak.png",
on_use = minetest.item_eat(4),
--groups = {dig_immediate = 3, attached_node = 1},
groups = {dig_immediate = 3},
})
minetest.register_craft({
type = "cooking",
output = "fun_caves:mushroom_steak",
recipe = "fun_caves:huge_mushroom_cap",
cooktime = 2,
})
minetest.register_craft({
type = "cooking",
output = "fun_caves:mushroom_steak 2",
recipe = "fun_caves:giant_mushroom_cap",
cooktime = 2,
})
-- moon juice from fungus
minetest.register_craft({
output = "fun_caves:moon_juice",
recipe = {
{"fun_caves:glowing_fungus", "fun_caves:glowing_fungus", "fun_caves:glowing_fungus"},
{"fun_caves:glowing_fungus", "fun_caves:glowing_fungus", "fun_caves:glowing_fungus"},
{"fun_caves:glowing_fungus", "vessels:glass_bottle", "fun_caves:glowing_fungus"},
},
})
minetest.register_craft({
output = "fun_caves:moon_glass",
type = "shapeless",
recipe = {
"fun_caves:moon_juice",
"fun_caves:moon_juice",
"default:glass",
},
})
-- Speleothems can be made into cobblestone, to get them out of inventory.
minetest.register_craft({
output = "default:cobble",
recipe = {
{"", "", ""},
{"fun_caves:stalactite", "fun_caves:stalactite", ""},
{"fun_caves:stalactite", "fun_caves:stalactite", ""},
},
})
minetest.register_craft({
output = "default:cobble",
recipe = {
{"", "", ""},
{"fun_caves:stalagmite", "fun_caves:stalagmite", ""},
{"fun_caves:stalagmite", "fun_caves:stalagmite", ""},
},
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 679 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 724 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
textures/fun_caves_moss.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -0,0 +1 @@
Modified radioactive ore: everamzah

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

BIN
textures/screenshot3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

BIN
textures/vmg_moon_juice.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 788 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB