New road generation: 2 networks with smoothly blended junctions, each nework a blend between low and high octave noises, for variable bendiness. Remove arrow block nodes. Remove unused river water nodes. Add detail to road texture. Improve tree textures. New screenshot
36
README.txt
@ -1,6 +1,6 @@
|
||||
driftgame 0.1.3 by paramat
|
||||
driftgame 0.1.4 by paramat
|
||||
A game for Minetest Engine 5.2.0 and later
|
||||
Built on the 'minipeli' game by paramat
|
||||
Derived from the 'minipeli' game by paramat
|
||||
|
||||
Authors of media
|
||||
----------------
|
||||
@ -12,32 +12,30 @@ Description
|
||||
-----------
|
||||
This game uses a simple road generating mapgen to provide a suitable demonstration environment for my vehicle mod 'driftcar'.
|
||||
The vehicle uses some physics modelling to create semi-realistic skidding and drifting behaviour.
|
||||
Many existing games are not suitable for 'driftcar' as they use intensive ABMs or other intensive code that interferes with the control response of the vehicle.
|
||||
Tyre grip is reduced on the grass nodes (nodes with the 'crumbly' group).
|
||||
Smoke particles are emitted from each tyre when skidding.
|
||||
|
||||
Many existing games are not suitable as a demonstration environment for 'driftcar' as they use intensive ABMs or other intensive code that interferes with the control response of the vehicle.
|
||||
|
||||
Earlier versions of 'driftcar' mod
|
||||
----------------------------------
|
||||
'Driftcar' mod was previously released as a mod for 'Minetest Game' game.
|
||||
The version in 'driftgame' game is an improved version and development of 'driftcar' will now continue in 'driftgame'.
|
||||
My GitHub repository for the 'Minetest Game' mod version will soon be deleted.
|
||||
|
||||
Using 'driftcar' mod outside this game
|
||||
--------------------------------------
|
||||
This mod can be used in other Minetest games.
|
||||
Keep in mind that the vehicle's tyre grip is reduced on nodes with the 'crumbly' group, so it is a good idea for road nodes to belong to the 'cracky' group.
|
||||
As mentioned earlier, the vehicle responds best when used in games that do not run intensive code while the vehicle is being driven. If a non-lightweght Lua mapgen is used it is best to pre-generate an area before driving in that area.
|
||||
The vehicle's tyre grip is reduced on nodes with the 'crumbly' group, so it is a good idea for road nodes to belong to the 'cracky' group.
|
||||
The vehicle responds best when used in games that do not run intensive code while the vehicle is being driven. If a non-lightweght Lua mapgen is used it is best to pre-generate an area before driving in that area.
|
||||
|
||||
Using this game
|
||||
---------------
|
||||
Due to client->server->client control delay it is recommended that this game is used in singleplayer or in local multiplayer.
|
||||
Generation of new areas of world may slightly affect the control response of the vehicle, the best control response will occur in previously generated areas.
|
||||
Third-person camera mode is recommended when driving for a better view.
|
||||
Arrow blocks are provided to mark out courses if desired.
|
||||
|
||||
How to start playing this game
|
||||
------------------------------
|
||||
Core mapgen decoration placement must be disabled (because the registered decorations are placed by Lua code in the 'track' mod instead). This can be done in the 'All Settings' menu (Settings tab -> All Settings -> Mapgen -> Mapgen flags) or by adding the line below to your minetet.conf file:
|
||||
mg_flags = caves,dungeons,light,nodecorations,biomes
|
||||
|
||||
Start a new world, the game will only allow 'Mapgen Flat' to be selected.
|
||||
The optional features of Mapgen Flat: lakes and hills, should be left disabled.
|
||||
|
||||
@ -47,9 +45,9 @@ Type '/grantme all' to obtain all privileges.
|
||||
|
||||
Press 'K' to enable fly mode, and 'J' to enable fast mode.
|
||||
|
||||
Fly fast to find some track.
|
||||
Fly fast to find a road.
|
||||
|
||||
Place the car on the track, enter it. Press 'F7' to use third-person camera mode.
|
||||
Place the car on the road, enter it. Press 'F7' to use third-person camera mode.
|
||||
|
||||
Car controls
|
||||
------------
|
||||
@ -61,3 +59,17 @@ Backward = Slow down.
|
||||
Speed up when moving backwards.
|
||||
Left = Rotate anticlockwise.
|
||||
Right = Rotate clockwise.
|
||||
|
||||
How this game was created
|
||||
-------------------------
|
||||
This game is derived from my 'minipeli' game.
|
||||
|
||||
Minipeli mods used unaltered:
|
||||
gui
|
||||
hand
|
||||
light
|
||||
player_api
|
||||
|
||||
Minipeli mods used and altered:
|
||||
mapgen (Remove sounds folder. Remove sounds tables. Remove river water nodes as mapgen valleys is unused. Alias "mapgen_river_water_source" to "mapgen:water_source" to avoid warnings)
|
||||
media (remove sounds folder)
|
||||
|
@ -98,13 +98,13 @@ end
|
||||
|
||||
local car = {
|
||||
initial_properties = {
|
||||
visual = "wielditem",
|
||||
wield_item = "driftcar:blue_nodebox",
|
||||
visual_size = {x = 1.667, y = 1.667}, -- Scale-up of nodebox is these * 1.5
|
||||
collisionbox = {-0.53, -0.75, -0.53, 0.53, 0.75, 0.53},
|
||||
stepheight = 0.6,
|
||||
physical = true,
|
||||
collide_with_objects = false,
|
||||
collisionbox = {-0.53, -0.75, -0.53, 0.53, 0.75, 0.53},
|
||||
visual = "wielditem",
|
||||
visual_size = {x = 1.667, y = 1.667}, -- Scale-up of nodebox is these * 1.5
|
||||
textures = {"driftcar:blue_nodebox"},
|
||||
stepheight = 0.6,
|
||||
},
|
||||
|
||||
-- Custom fields
|
||||
@ -446,13 +446,19 @@ minetest.register_on_newplayer(function(player)
|
||||
end)
|
||||
|
||||
|
||||
-- Nodeboxes
|
||||
-- Nodebox
|
||||
|
||||
-- Smart Fortwo dim: L 2.695 W 1.663 H 1.555
|
||||
-- Size in pixels L 21.56 W 13.304 H 12.44
|
||||
-- Alter to L 20 W 12 H 12
|
||||
-- 20 = full cube of unscaled nodebox, 1 pixel = 0.05
|
||||
-- Required nodebox scale up 2.5, visual_size = 2.5 / 1.5 = 1.667
|
||||
-- If a nodebox exceeds {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, the textures repeat and tile,
|
||||
-- so the nodebox is defined within that volume and scaled-up using 'visual_size'.
|
||||
|
||||
-- Smart Fortwo dimensions: L 2.695 W 1.663 H 1.555.
|
||||
-- Size in world pixels (with 8px textures) L 21.56 W 13.304 H 12.44.
|
||||
-- Alter to L 20 W 12 H 12 (2.5 nodes long).
|
||||
-- 20 = full cube of unscaled nodebox, 1 pixel = 0.05.
|
||||
|
||||
-- Required nodebox scale-up 2.5.
|
||||
-- 'wielditem'-visual entity 'visual_size' = 2.5 / 1.5 = 1.667, because a
|
||||
-- 'wielditem'-visual entity is automatically scaled up by 1.5.
|
||||
|
||||
minetest.register_node("driftcar:blue_nodebox", {
|
||||
description = "Drift Car Blue Nodebox",
|
||||
|
@ -9,10 +9,4 @@ Various Minetest developers and contributors (LGPL 2.1)
|
||||
|
||||
Authors of media
|
||||
----------------
|
||||
BlockMen (CC BY-SA 3.0):
|
||||
gui_formbg.png
|
||||
gui_hb_bg.png
|
||||
|
||||
Paramat (CC BY-SA 3.0):
|
||||
bubble.png
|
||||
heart.png
|
||||
All textures by paramat (CC BY-SA 3.0)
|
||||
|
@ -1,21 +1,10 @@
|
||||
-- Set formspec prepend and hotbar textures
|
||||
-- Set formspec prepended string, used for theming
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local formspec = [[
|
||||
bgcolor[#080808BB;true]
|
||||
listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] ]]
|
||||
local name = player:get_player_name()
|
||||
local info = minetest.get_player_information(name)
|
||||
if info.formspec_version > 1 then
|
||||
formspec = formspec .. "background9[5,5;1,1;gui_formbg.png;true;10]"
|
||||
else
|
||||
formspec = formspec .. "background[5,5;1,1;gui_formbg.png;true]"
|
||||
end
|
||||
-- Set the string to be added to every mainmenu formspec, used for theming
|
||||
listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]
|
||||
background[5,5;1,1;gui_formbg.png;true]
|
||||
]]
|
||||
player:set_formspec_prepend(formspec)
|
||||
|
||||
-- Set hotbar textures.
|
||||
-- To use, uncomment these 2 lines and add textures to the textures folder.
|
||||
--player:hud_set_hotbar_image("gui_hotbar.png")
|
||||
--player:hud_set_hotbar_selected_image("gui_hotbar_selected.png")
|
||||
end)
|
||||
|
@ -2,8 +2,8 @@ License of source code
|
||||
----------------------
|
||||
|
||||
GNU Lesser General Public License, version 2.1
|
||||
Copyright (C) 2019 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
Copyright (C) 2019 Various Minetest developers and contributors
|
||||
Copyright (C) 2011-2020 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
Copyright (C) 2011-2020 Various Minetest developers and contributors
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the Free
|
||||
@ -21,8 +21,7 @@ License of media
|
||||
----------------
|
||||
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
||||
Copyright (C) 2019 paramat
|
||||
Copyright (C) 2019 BlockMen
|
||||
Copyright (C) 2020 paramat
|
||||
|
||||
You are free to:
|
||||
Share — copy and redistribute the material in any medium or format.
|
||||
|
Before Width: | Height: | Size: 971 B After Width: | Height: | Size: 83 B |
Before Width: | Height: | Size: 98 B |
@ -2,4 +2,4 @@ Minipeli mod: light
|
||||
===================
|
||||
|
||||
Source code by paramat (MIT).
|
||||
Media by paramat (CC BY-SA 3.0).
|
||||
Textures by paramat (CC BY-SA 3.0).
|
||||
|
Before Width: | Height: | Size: 99 B |
@ -1,10 +1,4 @@
|
||||
Minipeli mod: media
|
||||
===================
|
||||
|
||||
Authors of media
|
||||
----------------
|
||||
All textures by paramat (CC BY-SA 3.0).
|
||||
|
||||
sonictechtonic (CC BY 3.0):
|
||||
https://www.freesound.org/people/sonictechtonic/sounds/241872/
|
||||
player_damage.ogg
|
||||
|
@ -35,33 +35,3 @@ privacy, or moral rights may limit how you use the material.
|
||||
|
||||
For more details:
|
||||
http://creativecommons.org/licenses/by-sa/3.0/
|
||||
|
||||
-----------------------
|
||||
|
||||
Attribution 3.0 Unported (CC BY 3.0)
|
||||
Copyright (C) 2014 sonictechtonic
|
||||
|
||||
You are free to:
|
||||
Share — copy and redistribute the material in any medium or format.
|
||||
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
|
||||
The licensor cannot revoke these freedoms as long as you follow the license terms.
|
||||
|
||||
Under the following terms:
|
||||
|
||||
Attribution — You must give appropriate credit, provide a link to the license, and
|
||||
indicate if changes were made. You may do so in any reasonable manner, but not in any way
|
||||
that suggests the licensor endorses you or your use.
|
||||
|
||||
No additional restrictions — You may not apply legal terms or technological measures that
|
||||
legally restrict others from doing anything the license permits.
|
||||
|
||||
Notices:
|
||||
|
||||
You do not have to comply with the license for elements of the material in the public
|
||||
domain or where your use is permitted by an applicable exception or limitation.
|
||||
No warranties are given. The license may not give you all of the permissions necessary
|
||||
for your intended use. For example, other rights such as publicity, privacy, or moral
|
||||
rights may limit how you use the material.
|
||||
|
||||
For more details:
|
||||
http://creativecommons.org/licenses/by/3.0/
|
||||
|
@ -2,21 +2,54 @@
|
||||
|
||||
local pathy = 8
|
||||
|
||||
-- Noises blended to create 'path'
|
||||
|
||||
local np_patha = {
|
||||
offset = 0,
|
||||
offset = 0.0,
|
||||
scale = 1,
|
||||
spread = {x = 256, y = 256, z = 256},
|
||||
spread = {x = 384, y = 384, z = 384},
|
||||
seed = 11711,
|
||||
octaves = 3,
|
||||
persist = 0.5
|
||||
octaves = 4,
|
||||
persist = 0.6
|
||||
}
|
||||
|
||||
local np_pathb = {
|
||||
offset = 0,
|
||||
offset = 0.0,
|
||||
scale = 1,
|
||||
spread = {x = 256, y = 256, z = 256},
|
||||
spread = {x = 384, y = 384, z = 384},
|
||||
seed = 303,
|
||||
octaves = 3,
|
||||
octaves = 1,
|
||||
persist = 0.5
|
||||
}
|
||||
|
||||
-- Noises blended to create 'path2'
|
||||
|
||||
local np_pathc = {
|
||||
offset = 0.0,
|
||||
scale = 1,
|
||||
spread = {x = 512, y = 512, z = 512},
|
||||
seed = 7755,
|
||||
octaves = 4,
|
||||
persist = 0.6
|
||||
}
|
||||
|
||||
local np_pathd = {
|
||||
offset = 0.0,
|
||||
scale = 1,
|
||||
spread = {x = 512, y = 512, z = 512},
|
||||
seed = 1001,
|
||||
octaves = 1,
|
||||
persist = 0.5
|
||||
}
|
||||
|
||||
-- Blend between low and high octave noises
|
||||
|
||||
local np_blend = {
|
||||
offset = 0.0,
|
||||
scale = 6.0,
|
||||
spread = {x = 256, y = 256, z = 256},
|
||||
seed = 95059,
|
||||
octaves = 1,
|
||||
persist = 0.5
|
||||
}
|
||||
|
||||
@ -39,36 +72,12 @@ minetest.register_node("track:road_white", {
|
||||
groups = {cracky = 3},
|
||||
})
|
||||
|
||||
minetest.register_node("track:arrow_left", {
|
||||
description = "Arrow Block Left",
|
||||
tiles = {"track_red.png", "track_red.png",
|
||||
"track_arrow_left.png", "track_red.png",
|
||||
"track_red.png", "track_arrow_left.png"},
|
||||
paramtype = "light",
|
||||
light_source = 14,
|
||||
paramtype2 = "facedir",
|
||||
groups = {dig_immediate = 2},
|
||||
})
|
||||
|
||||
minetest.register_node("track:arrow_right", {
|
||||
description = "Arrow Block Right",
|
||||
tiles = {"track_red.png", "track_red.png",
|
||||
"track_arrow_left.png^[transformFX", "track_red.png",
|
||||
"track_red.png", "track_arrow_left.png^[transformFX"},
|
||||
paramtype = "light",
|
||||
light_source = 14,
|
||||
paramtype2 = "facedir",
|
||||
groups = {dig_immediate = 2},
|
||||
})
|
||||
-- Set mapgen flags to disable core mapgen decoration placement.
|
||||
-- Tree decorations are placed using the Lua Voxel Manipulator after track generation
|
||||
-- to avoid trees on track.
|
||||
|
||||
|
||||
-- Give initial items
|
||||
|
||||
minetest.register_on_newplayer(function(player)
|
||||
local inv = player:get_inventory()
|
||||
inv:add_item("main", "track:arrow_left 512")
|
||||
inv:add_item("main", "track:arrow_right 512")
|
||||
end)
|
||||
minetest.set_mapgen_setting("mg_flags", "caves,dungeons,light,nodecorations,biomes", true)
|
||||
|
||||
|
||||
-- Constants
|
||||
@ -81,8 +90,14 @@ local c_roadwhite = minetest.get_content_id("track:road_white")
|
||||
|
||||
local nobj_patha = nil
|
||||
local nobj_pathb = nil
|
||||
local nobj_pathc = nil
|
||||
local nobj_pathd = nil
|
||||
local nobj_blend = nil
|
||||
local nvals_patha = {}
|
||||
local nvals_pathb = {}
|
||||
local nvals_pathc = {}
|
||||
local nvals_pathd = {}
|
||||
local nvals_blend = {}
|
||||
local data = {}
|
||||
|
||||
|
||||
@ -112,8 +127,14 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
|
||||
nobj_patha = nobj_patha or minetest.get_perlin_map(np_patha, pmapdims)
|
||||
nobj_pathb = nobj_pathb or minetest.get_perlin_map(np_pathb, pmapdims)
|
||||
nobj_pathc = nobj_pathc or minetest.get_perlin_map(np_pathc, pmapdims)
|
||||
nobj_pathd = nobj_pathd or minetest.get_perlin_map(np_pathd, pmapdims)
|
||||
nobj_blend = nobj_blend or minetest.get_perlin_map(np_blend, pmapdims)
|
||||
nobj_patha:get2dMap_flat(pmapminp, nvals_patha)
|
||||
nobj_pathb:get2dMap_flat(pmapminp, nvals_pathb)
|
||||
nobj_pathc:get2dMap_flat(pmapminp, nvals_pathc)
|
||||
nobj_pathd:get2dMap_flat(pmapminp, nvals_pathd)
|
||||
nobj_blend:get2dMap_flat(pmapminp, nvals_blend)
|
||||
|
||||
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
|
||||
local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax}
|
||||
@ -121,28 +142,33 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
|
||||
-- Track brush centre generation area extends from x0/z0 - 4 to x1/z1 + 4
|
||||
for z = z0 - 4, z1 + 4 do
|
||||
-- Initial noise index at x0 - 4 for this z
|
||||
-- Initial noise index at x0 - 4
|
||||
local ni = 1 + (z - (z0 - 5)) * pmapdim + 1
|
||||
local n_xprepatha = nvals_patha[(ni - 1)]
|
||||
local n_xprepathb = nvals_pathb[(ni - 1)]
|
||||
-- Initial blend, n_path and n_path2 values for adjacent node at x0 - 5
|
||||
local xpreblend = (math.tanh(nvals_blend[(ni - 1)]) + 1) / 2
|
||||
local n_xprepath = (1 - xpreblend) * nvals_patha[(ni - 1)] +
|
||||
xpreblend * nvals_pathb[(ni - 1)]
|
||||
local n_xprepath2 = (1 - xpreblend) * nvals_pathc[(ni - 1)] +
|
||||
xpreblend * nvals_pathd[(ni - 1)]
|
||||
for x = x0 - 4, x1 + 4 do
|
||||
local n_patha = nvals_patha[ni]
|
||||
local n_pathb = nvals_pathb[ni]
|
||||
local n_zprepatha = nvals_patha[(ni - pmapdim)]
|
||||
local n_zprepathb = nvals_pathb[(ni - pmapdim)]
|
||||
-- Detect sign change of noise
|
||||
if (n_patha >= 0 and n_xprepatha < 0)
|
||||
or (n_patha < 0 and n_xprepatha >= 0)
|
||||
or (n_patha >= 0 and n_zprepatha < 0)
|
||||
or (n_patha < 0 and n_zprepatha >= 0)
|
||||
|
||||
or (n_pathb >= 0 and n_xprepathb < 0)
|
||||
or (n_pathb < 0 and n_xprepathb >= 0)
|
||||
or (n_pathb >= 0 and n_zprepathb < 0)
|
||||
or (n_pathb < 0 and n_zprepathb >= 0)
|
||||
-- Smooth corners of junctions
|
||||
or math.pow(math.abs(n_patha), 0.1) *
|
||||
math.pow(math.abs(n_pathb), 0.1) < 0.5 then
|
||||
local blend = (math.tanh(nvals_blend[ni]) + 1) / 2
|
||||
local n_path = (1 - blend) * nvals_patha[ni] + blend * nvals_pathb[ni]
|
||||
local n_path2 = (1 - blend) * nvals_pathc[ni] + blend * nvals_pathd[ni]
|
||||
-- blend, n_path and n_path2 values for adjacent node at z - 1
|
||||
local zpreblend = (math.tanh(nvals_blend[(ni - pmapdim)]) + 1) / 2
|
||||
local n_zprepath = (1 - zpreblend) * nvals_patha[(ni - pmapdim)] +
|
||||
zpreblend * nvals_pathb[(ni - pmapdim)]
|
||||
local n_zprepath2 = (1 - zpreblend) * nvals_pathc[(ni - pmapdim)] +
|
||||
zpreblend * nvals_pathd[(ni - pmapdim)]
|
||||
-- Detect sign change of n_path and n_path2 in x, z directions
|
||||
if (n_path * n_xprepath < 0)
|
||||
or (n_path * n_zprepath < 0)
|
||||
or (n_path2 * n_xprepath2 < 0)
|
||||
or (n_path2 * n_zprepath2 < 0)
|
||||
-- Detect when n_path and n_path2 are simultaneously
|
||||
-- very small, to smooth corners of junctions
|
||||
or math.pow(math.abs(n_path), 0.1) *
|
||||
math.pow(math.abs(n_path2), 0.1) < 0.5 then
|
||||
-- Place track brush of radius 4
|
||||
for k = -4, 4 do
|
||||
local vi = area:index(x - 4, pathy, z + k)
|
||||
@ -162,8 +188,9 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
end
|
||||
|
||||
ni = ni + 1
|
||||
n_xprepatha = n_patha
|
||||
n_xprepathb = n_pathb
|
||||
-- Set adjacent node values to current values
|
||||
n_xprepath = n_path
|
||||
n_xprepath2 = n_path2
|
||||
end
|
||||
end
|
||||
|
||||
|
Before Width: | Height: | Size: 96 B |
Before Width: | Height: | Size: 83 B |
Before Width: | Height: | Size: 83 B After Width: | Height: | Size: 124 B |
@ -2,7 +2,4 @@ driftgame mod: trees
|
||||
====================
|
||||
|
||||
Source code by paramat (MIT).
|
||||
Schematics by paramat (CC BY-SA 3.0).
|
||||
All textures by paramat (CC BY-SA 3.0) and derived from Minetest Game textures by
|
||||
paramat (CC BY-SA 3.0), except:
|
||||
trees_pine_needles.png is derived from a Minetest Game texture by Splizard (CC BY-SA 3.0).
|
||||
Textures and schematics by paramat (CC BY-SA 3.0).
|
||||
|
@ -34,6 +34,7 @@ minetest.register_decoration({
|
||||
octaves = 3,
|
||||
persist = 0.7
|
||||
},
|
||||
biomes = {"grassland"},
|
||||
y_min = -31000,
|
||||
y_max = 31000,
|
||||
schematic = minetest.get_modpath("trees").."/schematics/trees_pine_tree.mts",
|
||||
|
Before Width: | Height: | Size: 506 B After Width: | Height: | Size: 102 B |
Before Width: | Height: | Size: 161 B After Width: | Height: | Size: 103 B |
BIN
screenshot.png
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 18 KiB |