From 9828a843b635faf19a8029a03e8564040d5666e6 Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 4 Jun 2020 01:38:45 +0100 Subject: [PATCH] Cleaner and more efficient generation loop. Add second noise. Add smoothing of junction corners --- README.txt | 41 +++++++- mods/driftcar/init.lua | 37 ++++--- mods/track/init.lua | 119 +++++++++++++++++------ mods/track/textures/track_arrow_left.png | Bin 0 -> 96 bytes mods/track/textures/track_red.png | Bin 0 -> 83 bytes 5 files changed, 150 insertions(+), 47 deletions(-) create mode 100644 mods/track/textures/track_arrow_left.png create mode 100644 mods/track/textures/track_red.png diff --git a/README.txt b/README.txt index 15742fb..bdf1f98 100644 --- a/README.txt +++ b/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. diff --git a/mods/driftcar/init.lua b/mods/driftcar/init.lua index af37e83..ab8c1d3 100644 --- a/mods/driftcar/init.lua +++ b/mods/driftcar/init.lua @@ -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 - rraccmag = -ROLRES + if onroad then + rraccmag = -ROLRES + else + rraccmag = -ORROLRES + end elseif linvel < 0 then - rraccmag = ROLRES + 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() diff --git a/mods/track/init.lua b/mods/track/init.lua index b9a1839..e323a66 100644 --- a/mods/track/init.lua +++ b/mods/track/init.lua @@ -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,53 +102,68 @@ 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)] + 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) - if x >= x0 - 4 and z >= z0 - 4 then - if (n_patha >= 0 and n_xprepatha < 0) -- detect sign change of noise - 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 - for k = -4, 4 do - local vi = area:index(x - 4, pathy, z + k) - for i = -4, 4 do - local radsq = (math.abs(i)) ^ 2 + (math.abs(k)) ^ 2 - if radsq <= 15 then - data[vi] = c_roadblack - elseif radsq <= 20 then - local nodid = data[vi] - if nodid ~= c_roadblack then - data[vi] = c_roadwhite - end + 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 + local radsq = (math.abs(i)) ^ 2 + (math.abs(k)) ^ 2 + if radsq <= 15 then + data[vi] = c_roadblack + elseif radsq <= 20 then + local nodid = data[vi] + if nodid ~= c_roadblack then + data[vi] = c_roadwhite end - vi = vi + 1 end + vi = vi + 1 end end end - n_xprepatha = n_patha ni = ni + 1 + n_xprepatha = n_patha + n_xprepathb = n_pathb end end diff --git a/mods/track/textures/track_arrow_left.png b/mods/track/textures/track_arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3fbb1f8a53dddf257477be4690ffaa8e754fff GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^93afd3?%;@)Hwm9*aCb)T>mpL{Qv*oQPxBdC?e|V s;uyklJ-OmU!Hk7-8|67}H?C=CP~N~&x=yTo0Z;*hr>mdKI;Vst07Xt3&Hw-a literal 0 HcmV?d00001 diff --git a/mods/track/textures/track_red.png b/mods/track/textures/track_red.png new file mode 100644 index 0000000000000000000000000000000000000000..f8224e7957c0786ac8dab4dd3e6488bd8e5d0078 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^93afd3?%;@)Hwm9m;-!5T>mpLNIv2;2XeVRT^vI= et|uorure?RFfcAWs(276%;4$j=d#Wzp$PzeR}ppq literal 0 HcmV?d00001