Cleaner and more efficient generation loop. Add second noise. Add smoothing of junction corners
This commit is contained in:
parent
b567dfe559
commit
9828a843b6
41
README.txt
41
README.txt
@ -1,9 +1,44 @@
|
||||
driftgame 0.1.0 by paramat.
|
||||
A game for Minetest Engine 5.2.0 and later.
|
||||
See each mod for mod-specific credits and licenses.
|
||||
driftgame 0.1.1 by paramat
|
||||
A game for Minetest Engine 5.2.0 and later
|
||||
Built on the 'minipeli' game by paramat
|
||||
|
||||
Authors of media
|
||||
----------------
|
||||
paramat (CC BY-SA 3.0):
|
||||
header.png
|
||||
icon.png
|
||||
|
||||
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.
|
||||
Left arrow and right arrow blocks are given to a new player to mark out a race track.
|
||||
Third-person camera mode is recommended when driving for a better view.
|
||||
|
||||
How to start playing this game
|
||||
------------------------------
|
||||
Decoration placement must be disabled, 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.
|
||||
|
||||
When you enter the world, if the screen is black you are probably inside a tree, walk in various directions to exit the tree.
|
||||
|
||||
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, it might take a minute or more to find it.
|
||||
|
||||
Place the car on the track, enter it. Press 'F7' to use third-person camera mode.
|
||||
|
||||
Car controls
|
||||
------------
|
||||
Left mouse button = Place car in inventory when pointing at car.
|
||||
Right mouse button = Place car in world. Enter or exit car when pointing at car.
|
||||
Forward = Speed up.
|
||||
Slow down when moving backwards.
|
||||
Backward = Slow down.
|
||||
Speed up when moving backwards.
|
||||
Left = Rotate anticlockwise.
|
||||
Right = Rotate clockwise.
|
||||
|
@ -1,16 +1,16 @@
|
||||
-- Parameters
|
||||
|
||||
local MAXGRIP = 7 -- Maximum linear and lateral acceleration, in nodes/s^2
|
||||
-- Halved on 'crumbly' nodes.
|
||||
local GRIP = 8 -- On road maximum linear and lateral acceleration, in nodes/s^2
|
||||
local ORGRIP = 5 -- Off road maximum linear and lateral acceleration, in nodes/s^2
|
||||
local SZTORQ = 22 -- Car speed where motor torque drops to zero, in nodes/s
|
||||
local DRAG = 0.04 -- Air drag
|
||||
local ROLRES = 0.6 -- Rolling resistence TODO increase in crumbly
|
||||
local ROLRES = 0.6 -- Rolling resistence, in nodes/s^2
|
||||
local ORROLRES = 1.8 -- Off road Rolling resistence, in nodes/s^2
|
||||
local GRAV = 9.81 -- Acceleration of gravity, in nodes/s^2
|
||||
-- Turn parameters, in radians/s or radians/s^2
|
||||
local TINIT = 0.36 -- Initial turn speed on first control input
|
||||
local TACC = 0.12 -- Turn acceleration on control input
|
||||
local TMAX = 1.6 -- Maximum turn speed (Smart fortwo turning circle 7 nodes)
|
||||
local TDEC = 0.24 -- Turn deceleration on no control input
|
||||
local TINIT = 0.36 -- Initial turn speed on first control input, in radians/s
|
||||
local TACC = 0.12 -- Turn acceleration on control input, in radians/s^2
|
||||
local TMAX = 1.6 -- Maximum turn speed, in radians/s
|
||||
local TDEC = 0.24 -- Turn deceleration on no control input, in radians/s^2
|
||||
|
||||
-- End of parameters
|
||||
|
||||
@ -220,10 +220,13 @@ function car.on_step(self, dtime)
|
||||
local node_under = minetest.get_node(under_pos)
|
||||
local nodedef_under = minetest.registered_nodes[node_under.name]
|
||||
local touch = nodedef_under.walkable
|
||||
-- On road bool
|
||||
local onroad = true
|
||||
-- Modify grip according to 'crumbly' group
|
||||
local grip = MAXGRIP
|
||||
local grip = GRIP
|
||||
if nodedef_under.groups.crumbly then
|
||||
grip = MAXGRIP / 2
|
||||
grip = ORGRIP
|
||||
onroad = false
|
||||
end
|
||||
|
||||
-- Torque acceleration applied linear to car
|
||||
@ -306,9 +309,17 @@ function car.on_step(self, dtime)
|
||||
local rraccmag = 0
|
||||
if touch then
|
||||
if linvel > 0 then
|
||||
if onroad then
|
||||
rraccmag = -ROLRES
|
||||
else
|
||||
rraccmag = -ORROLRES
|
||||
end
|
||||
elseif linvel < 0 then
|
||||
if onroad then
|
||||
rraccmag = ROLRES
|
||||
else
|
||||
rraccmag = ORROLRES
|
||||
end
|
||||
end
|
||||
end
|
||||
--local rracc = get_veccomp(rraccmag, self.object:getyaw(), 0)
|
||||
@ -328,7 +339,7 @@ function car.on_step(self, dtime)
|
||||
tlfacc = get_veccomp(tlfaccmag, self.object:getyaw() + math.pi / 2, 0)
|
||||
|
||||
-- Tire smoke
|
||||
if self.driver and math.random() < -0.05 + math.abs(latvel) / 30 then
|
||||
if self.driver and onroad and math.random() < -0.05 + math.abs(latvel) / 30 then
|
||||
local opos = self.object:getpos()
|
||||
opos.y = opos.y - 0.5
|
||||
local yaw = self.object:getyaw()
|
||||
|
@ -5,9 +5,18 @@ local pathy = 8
|
||||
local np_patha = {
|
||||
offset = 0,
|
||||
scale = 1,
|
||||
spread = {x = 1024, y = 1024, z = 1024},
|
||||
spread = {x = 256, y = 256, z = 256},
|
||||
seed = 11711,
|
||||
octaves = 5,
|
||||
octaves = 3,
|
||||
persist = 0.5
|
||||
}
|
||||
|
||||
local np_pathb = {
|
||||
offset = 0,
|
||||
scale = 1,
|
||||
spread = {x = 256, y = 256, z = 256},
|
||||
seed = 303,
|
||||
octaves = 3,
|
||||
persist = 0.5
|
||||
}
|
||||
|
||||
@ -30,6 +39,37 @@ 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_red.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_red.png", "track_red.png",
|
||||
"track_red.png", "track_arrow_left.png^[transformFX"},
|
||||
paramtype = "light",
|
||||
light_source = 14,
|
||||
paramtype2 = "facedir",
|
||||
groups = {dig_immediate = 2},
|
||||
})
|
||||
|
||||
|
||||
-- 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)
|
||||
|
||||
|
||||
-- Constants
|
||||
|
||||
@ -40,7 +80,9 @@ local c_roadwhite = minetest.get_content_id("track:road_white")
|
||||
-- Initialise noise object, noise table, voxelmanip table
|
||||
|
||||
local nobj_patha = nil
|
||||
local nobj_pathb = nil
|
||||
local nvals_patha = {}
|
||||
local nvals_pathb = {}
|
||||
local data = {}
|
||||
|
||||
|
||||
@ -60,33 +102,48 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
local y0 = minp.y
|
||||
local z0 = minp.z
|
||||
|
||||
local sidelen = x1 - x0 + 1
|
||||
local emerlen = sidelen + 32
|
||||
local overlen = sidelen + 9
|
||||
local pmapdims = {x = overlen, y = overlen, z = 1}
|
||||
-- Noise map extends from x0/z0 - 5 to x1/z1 + 4, one node larger than the track brush
|
||||
-- centre generation area, to allow sign change of noise to be detected along minimum
|
||||
-- edges of track brush centre generation area.
|
||||
local mchudim = x1 - x0 + 1
|
||||
local pmapdim = mchudim + 9
|
||||
local pmapdims = {x = pmapdim, y = pmapdim, z = 1}
|
||||
local pmapminp = {x = x0 - 5, y = z0 - 5}
|
||||
|
||||
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_patha:get2dMap_flat(pmapminp, nvals_patha)
|
||||
nobj_pathb:get2dMap_flat(pmapminp, nvals_pathb)
|
||||
|
||||
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
|
||||
local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax}
|
||||
vm:get_data(data)
|
||||
|
||||
local ni = 1
|
||||
for z = z0 - 5, z1 + 4 do
|
||||
local n_xprepatha = false
|
||||
-- x0 - 5, z0 - 5 is to setup initial values of 'xprepath_', 'zprepath_'
|
||||
for x = x0 - 5, x1 + 4 do
|
||||
-- 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
|
||||
local ni = 1 + (z - (z0 - 5)) * pmapdim + 1
|
||||
local n_xprepatha = nvals_patha[(ni - 1)]
|
||||
local n_xprepathb = nvals_pathb[(ni - 1)]
|
||||
for x = x0 - 4, x1 + 4 do
|
||||
local n_patha = nvals_patha[ni]
|
||||
local n_zprepatha = nvals_patha[(ni - overlen)]
|
||||
|
||||
if x >= x0 - 4 and z >= z0 - 4 then
|
||||
if (n_patha >= 0 and n_xprepatha < 0) -- detect sign change of noise
|
||||
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) then
|
||||
-- place path node brush
|
||||
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)-- then
|
||||
-- Smooth corners of junctions
|
||||
or math.pow(math.abs(n_patha), 0.1) *
|
||||
math.pow(math.abs(n_pathb), 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)
|
||||
for i = -4, 4 do
|
||||
@ -103,10 +160,10 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
n_xprepatha = n_patha
|
||||
ni = ni + 1
|
||||
n_xprepatha = n_patha
|
||||
n_xprepathb = n_pathb
|
||||
end
|
||||
end
|
||||
|
||||
|
BIN
mods/track/textures/track_arrow_left.png
Normal file
BIN
mods/track/textures/track_arrow_left.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 96 B |
BIN
mods/track/textures/track_red.png
Normal file
BIN
mods/track/textures/track_red.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 83 B |
Loading…
x
Reference in New Issue
Block a user