2017-04-21 09:40:51 -07:00
-- tunnelmaker
-- Another tunnel digging mod for minetest.
-- by David G (kestral246@gmail.com)
2018-07-17 14:26:55 -07:00
-- Version 0.9.4
-- Major update to build in support for digging up and down.
-- Digging up and down only supports orthogonal and 45deg directions to match advtrains track.
-- To select updown direction, hold sneak key (shift) while right-clicking tunnelmaker.
-- One click selects up (Yellow 'U' on icon), second click selects down (Yellow 'D' on icon),
-- third click returns back to horizontal (no letter on icon).
-- Updown state can also be reset by rotating to different icon, or moving by some amount (still tuning this).
-- Once updown state is selected, release sneak key and use right-click like normal.
-- After digging, updown state will also be reset to horizontal.
2018-07-15 17:29:51 -07:00
-- Version 0.9.3
-- Tweak cdir == 2 (nw) digging pattern.
-- Clean up some old debug statements.
2018-06-25 19:54:34 -07:00
-- Version 0.9.2
-- Continue work making tunnelmaker play nice with advtrains track.
-- Per Orwell's request, changed method for determining if node is advtrains track.
-- Instead of searching for dtrack in name of node,
-- I check whether the node belongs to the advtrains_track group using:
-- if minetest.registered_nodes[name].groups.advtrains_track == 1 then
--
-- Note that one can't right click ATC track with tunnelmaker, that track overrides right click.
-- Trying to right click on slope track probably won't do what is wanted. Right now it treats
-- it like any other track, and digs the ground level.
2018-06-21 10:09:30 -07:00
-- Version 0.9.1
-- 1. Try to play nicer with already placed advtrains track (dtrack*).
-- A. Don't dig dtrack nodes.
-- This allows expanding or extending tunnels where track has already been laid.
-- However this causes issues when using tunnelmaker to raise or lower track.
-- Trying to dig tunnel one node above track won't fill where placed track exists.
-- Trying to dig tunnel one node below track will cause existing track to drop.
-- B. If pointing to dtrack node, assume user actually wants to point to ground below track.
-- Lower positions of pointed_thing by one node, while keeping name the same.
-- This assumes that existing track is sitting on valid node.
-- 2. Restruction direction code to make it much shorter.
-- 3. Fixed bug in implementation of SSW digging pattern.
--
2018-06-17 08:46:47 -07:00
-- Version 0.9.0
-- 1. Updated digging patterns to fix minor irregularities.
-- 2. Added protections for tunneling in water.
-- Adds glass walls around tunnel whenever there is water.
-- Adds glass endcap at end to protect from flooding while tunneling.
2018-06-21 10:09:30 -07:00
-- Note that this can place undesired glass when digging next to ground-level water. This
-- won't happen as long as you're one node higher than the water.
2018-06-17 08:46:47 -07:00
-- 3. Restructured code again. Code is longer, but simpler to understand.
2018-05-28 11:47:29 -07:00
-- Version 0.8.1
-- Test if air before digging. Cleans up air not diggable INFO messages.
-- Added test for desert-type biomes, which lets me start using biome-appropriate fill.
-- needs minetest 0.5.0+ to correctly flag desert biomes
-- however, if api doesn't exist (using 0.4.x), test just always returns false
2018-05-24 10:39:54 -07:00
-- Version 0.8.0
-- Changed from dig_node to node_dig (based on what matyilona200 did for the Tunneltest mod)
-- Places only a single instance of each type of block dug in inventory
-- Doesn't cause blocks to drop in 0.5.0-dev
-- Works with digall mod, but make sure it's deactivated before tunneling!
2018-05-22 14:04:29 -07:00
-- Version 0.7.0
-- Added test for fallable blocks in ceiling and replace them with cobblestone.
-- Fixed bug where I was digging from lower blocks to higher blocks.
-- Simplified and cleaned up tunneling code.
2018-05-17 14:13:49 -07:00
-- Version 0.6.0
-- Increased width and height of tunnel created.
2017-04-21 09:40:51 -07:00
-- based on compassgps 2.7 and compass 0.5
-- To the extent possible under law, the author(s) have dedicated all copyright and related
-- and neighboring rights to this software to the public domain worldwide. This software is
-- distributed without any warranty.
-- You should have received a copy of the CC0 Public Domain Dedication along with this
-- software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
minetest.register_privilege ( " tunneling " , { description = " Allow use of tunnelmaker tool " } )
2018-07-17 14:26:55 -07:00
-- Define a global variable to maintain per player state
tunnelmaker = { }
-- Initialize players global state on player join
minetest.register_on_joinplayer ( function ( player )
local pname = player : get_player_name ( )
tunnelmaker [ pname ] = { updown = 0 , lastdir = - 1 , lastpos = { x = 0 , y = 0 , z = 0 } }
end )
2017-04-21 09:40:51 -07:00
local activewidth = 8 --until I can find some way to get it from minetest
minetest.register_globalstep ( function ( dtime )
local players = minetest.get_connected_players ( )
for i , player in ipairs ( players ) do
local gotatunnelmaker = false
local wielded = false
local activeinv = nil
local stackidx = 0
--first check to see if the user has a tunnelmaker, because if they don't
--there is no reason to waste time calculating bookmarks or spawnpoints.
local wielded_item = player : get_wielded_item ( ) : get_name ( )
if string.sub ( wielded_item , 0 , 12 ) == " tunnelmaker: " then
--if the player is wielding a tunnelmaker, change the wielded image
wielded = true
stackidx = player : get_wield_index ( )
gotatunnelmaker = true
else
--check to see if tunnelmaker is in active inventory
if player : get_inventory ( ) then
--is there a way to only check the activewidth items instead of entire list?
--problem being that arrays are not sorted in lua
for i , stack in ipairs ( player : get_inventory ( ) : get_list ( " main " ) ) do
if i <= activewidth and string.sub ( stack : get_name ( ) , 0 , 12 ) == " tunnelmaker: " then
activeinv = stack --store the stack so we can update it later with new image
stackidx = i --store the index so we can add image at correct location
gotatunnelmaker = true
break
end --if i<=activewidth
end --for loop
end -- get_inventory
end --if wielded else
--don't mess with the rest of this if they don't have a tunnelmaker
2018-06-22 10:20:56 -07:00
--update to remove legacy get_look_yaw function
2017-04-21 09:40:51 -07:00
if gotatunnelmaker then
2018-07-17 14:26:55 -07:00
local pname = player : get_player_name ( )
2018-06-22 10:20:56 -07:00
local dir = player : get_look_horizontal ( )
local angle_relative = math.deg ( dir )
2018-07-17 14:26:55 -07:00
local rawdir = math.floor ( ( angle_relative / 22.5 ) + 0.5 ) % 16
2017-04-21 09:40:51 -07:00
2018-07-17 14:26:55 -07:00
local distance2 = function ( x , y , z )
return x * x + y * y + z * z
end
local delta = distance2 ( ( player : getpos ( ) . x - tunnelmaker [ pname ] . lastpos.x ) ,
( player : getpos ( ) . y - tunnelmaker [ pname ] . lastpos.y ) ,
( player : getpos ( ) . z - tunnelmaker [ pname ] . lastpos.z ) )
-- if rawdir ~= tunnelmaker[pname].lastdir or pos.x ~= tunnelmaker[pname].lastpos.x or pos.y ~= tunnelmaker[pname].lastpos.y or pos.z ~= tunnelmaker[pname].lastpos.z then
-- If rotate to different direction, or move far enough from set position, reset to horizontal
if rawdir ~= tunnelmaker [ pname ] . lastdir or delta > 0.2 then -- tune to make distance moved feel right
tunnelmaker [ pname ] . lastdir = rawdir
-- tunnelmaker[pname].lastpos = pos
tunnelmaker [ pname ] . updown = 0 -- reset updown to horizontal
end
local tunnelmaker_image = rawdir -- horizontal digging maps to 0-15
if tunnelmaker [ pname ] . updown ~= 0 and rawdir % 2 == 0 then -- only 0,45,90 are updown capable (U:16-23,D:24-31)
tunnelmaker_image = 16 + ( tunnelmaker [ pname ] . updown - 1 ) * 8 + ( rawdir / 2 )
end
2017-04-21 09:40:51 -07:00
--update tunnelmaker image to point at target
if wielded then
player : set_wielded_item ( " tunnelmaker: " .. tunnelmaker_image )
elseif activeinv then
player : get_inventory ( ) : set_stack ( " main " , stackidx , " tunnelmaker: " .. tunnelmaker_image )
end --if wielded elsif activin
end --if gotatunnelmaker
end --for i,player in ipairs(players)
end ) -- register_globalstep
local images = {
" tunnelmaker_0.png " ,
" tunnelmaker_1.png " ,
" tunnelmaker_2.png " ,
" tunnelmaker_3.png " ,
" tunnelmaker_4.png " ,
" tunnelmaker_5.png " ,
" tunnelmaker_6.png " ,
" tunnelmaker_7.png " ,
" tunnelmaker_8.png " ,
" tunnelmaker_9.png " ,
" tunnelmaker_10.png " ,
" tunnelmaker_11.png " ,
" tunnelmaker_12.png " ,
" tunnelmaker_13.png " ,
" tunnelmaker_14.png " ,
" tunnelmaker_15.png " ,
2018-07-17 14:26:55 -07:00
" tunnelmaker_16.png " , -- 0 up
" tunnelmaker_17.png " , -- 2 up
" tunnelmaker_18.png " , -- 4 up
" tunnelmaker_19.png " , -- 6 up
" tunnelmaker_20.png " , -- 8 up
" tunnelmaker_21.png " , -- 10 up
" tunnelmaker_22.png " , -- 12 up
" tunnelmaker_23.png " , -- 14 up
" tunnelmaker_24.png " , -- 0 down
" tunnelmaker_25.png " , -- 2 down
" tunnelmaker_26.png " , -- 4 down
" tunnelmaker_27.png " , -- 6 down
" tunnelmaker_28.png " , -- 8 down
" tunnelmaker_29.png " , -- 10 down
" tunnelmaker_30.png " , -- 12 down
" tunnelmaker_31.png " , -- 14 down
2017-04-21 09:40:51 -07:00
}
2018-05-28 11:47:29 -07:00
-- tests whether position is in desert-type biomes, such as desert, sandstone_desert, cold_desert, etc
-- always just returns false if can't determine biome (i.e., using 0.4.x version)
local is_desert = function ( pos )
if minetest.get_biome_data then
local cur_biome = minetest.get_biome_name ( minetest.get_biome_data ( pos ) . biome )
return string.match ( cur_biome , " desert " )
else
return false
end
end
-- add cobble reference block to point to next target location and to aid laying track
-- in minetest 0.5.0+, desert biomes will use desert_cobble
2018-07-17 14:26:55 -07:00
local add_ref = function ( x , y0 , y1 , z , user , pointed_thing )
local pos = vector.add ( pointed_thing.under , { x = x , y = y0 , z = z } )
2018-05-17 14:13:49 -07:00
if not minetest.is_protected ( pos , user ) then
2018-05-28 11:47:29 -07:00
if is_desert ( pos ) then
minetest.set_node ( pos , { name = " default:desert_cobble " } )
else
minetest.set_node ( pos , { name = " default:cobble " } )
end
2018-05-17 14:13:49 -07:00
end
end
2018-06-17 08:46:47 -07:00
-- delete single node, including water, but not torches or air
2018-05-28 11:47:29 -07:00
-- test for air, since air is not diggable
2018-06-21 10:09:30 -07:00
-- update: don't dig advtrain track
2018-05-17 14:13:49 -07:00
local dig_single = function ( x , y , z , user , pointed_thing )
local pos = vector.add ( pointed_thing.under , { x = x , y = y , z = z } )
2018-05-28 11:47:29 -07:00
local name = minetest.get_node ( pos ) . name
2018-06-25 19:54:34 -07:00
local isAdvtrack = minetest.registered_nodes [ name ] . groups.advtrains_track == 1
2018-06-17 08:46:47 -07:00
if not minetest.is_protected ( pos , user ) then
if string.match ( name , " water " ) then
minetest.set_node ( pos , { name = " air " } )
2018-06-25 19:54:34 -07:00
elseif name ~= " air " and name ~= " default:torch_ceiling " and not isAdvtrack then
2018-06-17 08:46:47 -07:00
minetest.node_dig ( pos , minetest.get_node ( pos ) , user )
end
2018-05-17 14:13:49 -07:00
end
end
2018-06-17 08:46:47 -07:00
-- add stone floor, if air or water or glass
2018-05-28 11:47:29 -07:00
-- in minetest 0.5.0+, desert biomes will use desert_stone
2018-05-22 14:04:29 -07:00
local replace_floor = function ( x , y , z , user , pointed_thing )
2018-07-17 14:26:55 -07:00
local pos = vector.add ( pointed_thing.under , { x = x , y = y , z = z } )
2018-06-17 08:46:47 -07:00
if not minetest.is_protected ( pos , user ) then
local name = minetest.get_node ( pos ) . name
if name == " air " or string.match ( name , " water " ) or name == " default:glass " then
if is_desert ( pos ) then
minetest.set_node ( pos , { name = " default:desert_stone " } )
else
minetest.set_node ( pos , { name = " default:stone " } )
end
2018-05-28 11:47:29 -07:00
end
2018-05-17 14:13:49 -07:00
end
end
2018-05-28 11:47:29 -07:00
-- check for blocks that can fall in future ceiling and convert to cobble before digging
-- in minetest 0.5.0+, desert biomes will use desert_cobble
2018-05-22 14:04:29 -07:00
local replace_ceiling = function ( x , y , z , user , pointed_thing )
local pos = vector.add ( pointed_thing.under , { x = x , y = y , z = z } )
local ceiling = minetest.get_node ( pos ) . name
if ( ceiling == " default:sand " or ceiling == " default:desert_sand " or ceiling == " default:silver_sand " or
ceiling == " default:gravel " ) and not minetest.is_protected ( pos , user ) then
2018-05-28 11:47:29 -07:00
if is_desert ( pos ) then
minetest.set_node ( pos , { name = " default:desert_cobble " } )
else
minetest.set_node ( pos , { name = " default:cobble " } )
end
2018-05-22 14:04:29 -07:00
end
end
2018-05-17 14:13:49 -07:00
-- add torch
local add_light = function ( spacing , user , pointed_thing )
local pos = vector.add ( pointed_thing.under , { x = 0 , y = 5 , z = 0 } )
local ceiling = minetest.get_node ( vector.add ( pos , { x = 0 , y = 1 , z = 0 } ) ) . name
if ( ceiling == " default:stone " or ceiling == " default:desert_stone " ) and
minetest.get_node ( pos ) . name == " air " and not minetest.is_protected ( pos , user ) and
minetest.find_node_near ( pos , spacing , { name = " default:torch_ceiling " } ) == nil then
minetest.set_node ( pos , { name = " default:torch_ceiling " } )
end
2018-07-17 14:26:55 -07:00
-- roof height can now be 5 or six so try again one higher
pos = vector.add ( pointed_thing.under , { x = 0 , y = 6 , z = 0 } )
ceiling = minetest.get_node ( vector.add ( pos , { x = 0 , y = 1 , z = 0 } ) ) . name
if ( ceiling == " default:stone " or ceiling == " default:desert_stone " ) and
minetest.get_node ( pos ) . name == " air " and not minetest.is_protected ( pos , user ) and
minetest.find_node_near ( pos , spacing , { name = " default:torch_ceiling " } ) == nil then
minetest.set_node ( pos , { name = " default:torch_ceiling " } )
end
2018-05-17 14:13:49 -07:00
end
2017-04-21 09:40:51 -07:00
2018-06-17 08:46:47 -07:00
-- build glass barrier to water
-- if node is water, replace with glass
local check_for_water = function ( x , y , z , user , pointed_thing )
local pos = vector.add ( pointed_thing.under , { x = x , y = y , z = z } )
if not minetest.is_protected ( pos , user ) then
local name = minetest.get_node ( pos ) . name
if string.match ( name , " water " ) then
minetest.set_node ( pos , { name = " default:glass " } )
2017-04-21 09:40:51 -07:00
end
end
end
2018-06-17 08:46:47 -07:00
-- convenience function to call all the ceiling checks
local check_ceiling = function ( x , y , z , user , pointed_thing )
-- first check that ceiling isn't node that can fall
replace_ceiling ( x , y , z , user , pointed_thing )
-- then make sure ceiling isn't water
check_for_water ( x , y , z , user , pointed_thing )
end
-- add wall if necessary to protect from water (pink)
2018-07-17 14:26:55 -07:00
local aw = function ( x , y0 , y1 , z , user , pointed_thing )
for y = y0 , y1 do
2018-06-17 08:46:47 -07:00
check_for_water ( x , y , z , user , pointed_thing )
end
end
-- add short endcap (light orange)
2018-07-17 14:26:55 -07:00
local es = function ( x , y0 , y1 , z , user , pointed_thing )
for y = y0 , y1 do
2018-06-17 08:46:47 -07:00
check_for_water ( x , y , z , user , pointed_thing )
end
end
-- add tall endcap (darker orange)
2018-07-17 14:26:55 -07:00
local et = function ( x , y0 , y1 , z , user , pointed_thing )
for y = y0 , y1 do
2018-06-17 08:46:47 -07:00
check_for_water ( x , y , z , user , pointed_thing )
end
end
-- dig short tunnel (light gray)
2018-07-17 14:26:55 -07:00
local ds = function ( x , y0 , y1 , z , user , pointed_thing )
local height = y1
2018-06-17 08:46:47 -07:00
check_ceiling ( x , height + 1 , z , user , pointed_thing )
check_for_water ( x , height + 2 , z , user , pointed_thing )
2018-07-17 14:26:55 -07:00
-- add_ref(x, height+2, 0, z, user, pointed_thing) -- debug debug
for y = height , y0 + 1 , - 1 do -- dig from high to low
2018-06-17 08:46:47 -07:00
dig_single ( x , y , z , user , pointed_thing )
end
2018-07-17 14:26:55 -07:00
check_for_water ( x , y0 , z , user , pointed_thing )
2018-06-17 08:46:47 -07:00
end
-- dig tall tunnel (light yellow)
2018-07-17 14:26:55 -07:00
local dt = function ( x , y0 , y1 , z , user , pointed_thing )
local height = y1
2018-06-17 08:46:47 -07:00
check_ceiling ( x , height + 1 , z , user , pointed_thing )
2018-07-17 14:26:55 -07:00
for y = height , y0 + 1 , - 1 do -- dig from high to low
2018-06-17 08:46:47 -07:00
dig_single ( x , y , z , user , pointed_thing )
end
2018-07-17 14:26:55 -07:00
replace_floor ( x , y0 , z , user , pointed_thing )
2018-06-17 08:46:47 -07:00
end
2018-06-21 10:09:30 -07:00
-- To shorten the code, this function takes a list of lists with {function, x-coord, y-coord} and executes them in sequence.
local run_list = function ( dir_list , user , pointed_thing )
for i , v in ipairs ( dir_list ) do
2018-07-17 14:26:55 -07:00
v [ 1 ] ( v [ 2 ] , v [ 3 ] , v [ 4 ] , v [ 5 ] , user , pointed_thing )
2018-06-21 10:09:30 -07:00
end
end
2018-06-17 08:46:47 -07:00
2017-04-21 09:40:51 -07:00
-- dig tunnel based on direction given
local dig_tunnel = function ( cdir , user , pointed_thing )
if minetest.check_player_privs ( user , " tunneling " ) then
2018-07-17 14:26:55 -07:00
-- Dig horizontal
if cdir == 0 then -- pointed north
run_list ( { { aw , - 3 , 0 , 5 , 0 } , { aw , 3 , 0 , 5 , 0 } , { aw , - 3 , 0 , 5 , 1 } ,
{ aw , 3 , 0 , 5 , 1 } , { aw , - 3 , 0 , 5 , 2 } , { aw , 3 , 0 , 5 , 2 } ,
{ es , - 3 , 0 , 5 , 3 } , { et , - 2 , 0 , 6 , 3 } , { et , - 1 , 0 , 6 , 3 } , { et , 0 , 0 , 6 , 3 } , { et , 1 , 0 , 6 , 3 } , { et , 2 , 0 , 6 , 3 } , { es , 3 , 0 , 5 , 3 } ,
{ ds , - 2 , 0 , 4 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { ds , 2 , 0 , 4 , 0 } ,
{ ds , - 2 , 0 , 4 , 1 } , { dt , - 1 , 0 , 5 , 1 } , { dt , 0 , 0 , 5 , 1 } , { dt , 1 , 0 , 5 , 1 } , { ds , 2 , 0 , 4 , 1 } ,
{ ds , - 2 , 0 , 4 , 2 } , { dt , - 1 , 0 , 5 , 2 } , { dt , 0 , 0 , 5 , 2 } , { dt , 1 , 0 , 5 , 2 } , { ds , 2 , 0 , 4 , 2 } ,
{ add_ref , 0 , 0 , 0 , 2 } } , user , pointed_thing )
elseif cdir == 1 then -- pointed north-northwest
run_list ( { { aw , - 3 , 0 , 5 , - 1 } , { aw , - 3 , 0 , 5 , 0 } , { aw , - 4 , 0 , 5 , 0 } , { aw , - 4 , 0 , 5 , 1 } , { aw , - 4 , 0 , 5 , 2 } ,
{ aw , 3 , 0 , 5 , 1 } , { aw , 3 , 0 , 5 , 2 } , { aw , 2 , 0 , 5 , 2 } , { aw , 2 , 0 , 5 , 3 } ,
{ es , - 4 , 0 , 5 , 3 } , { et , - 3 , 0 , 6 , 3 } , { et , - 2 , 0 , 6 , 3 } , { et , - 1 , 0 , 6 , 3 } , { et , 0 , 0 , 6 , 3 } , { et , 1 , 0 , 6 , 3 } ,
{ ds , - 2 , 0 , 4 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } ,
{ ds , - 3 , 0 , 4 , 1 } , { dt , - 2 , 0 , 5 , 1 } , { dt , - 1 , 0 , 5 , 1 } , { dt , 0 , 0 , 5 , 1 } , { dt , 1 , 0 , 5 , 1 } , { ds , 2 , 0 , 4 , 1 } ,
{ ds , - 3 , 0 , 4 , 2 } , { dt , - 2 , 0 , 5 , 2 } , { dt , - 1 , 0 , 5 , 2 } , { dt , 0 , 0 , 5 , 2 } , { ds , 1 , 0 , 4 , 2 } ,
{ add_ref , - 1 , 0 , 0 , 2 } } , user , pointed_thing )
elseif cdir == 2 then -- pointed northwest
run_list ( { { aw , - 2 , 0 , 5 , - 3 } , { aw , - 2 , 0 , 5 , - 2 } , { aw , - 3 , 0 , 5 , - 2 } , { aw , - 3 , 0 , 5 , - 1 } , { aw , - 3 , 0 , 5 , - 2 } ,
{ aw , 3 , 0 , 5 , 2 } , { aw , 2 , 0 , 5 , 2 } , { aw , 2 , 0 , 5 , 3 } , { aw , 1 , 0 , 5 , 3 } , { aw , 1 , 0 , 5 , 4 } ,
{ es , - 4 , 0 , 5 , 0 } , { es , - 4 , 0 , 5 , 1 } , { et , - 3 , 0 , 6 , 1 } , { et , - 2 , 0 , 6 , 1 } , { et , - 2 , 0 , 6 , 2 } , { et , - 1 , 0 , 6 , 2 } , { et , - 1 , 0 , 6 , 3 } , { es , - 1 , 0 , 5 , 4 } , { es , 0 , 0 , 5 , 4 } ,
{ ds , - 1 , 0 , 4 , - 2 } ,
{ ds , - 2 , 0 , 4 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } ,
{ ds , - 3 , 0 , 4 , 0 } , { dt , - 2 , 0 , 5 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } ,
{ dt , - 1 , 0 , 5 , 1 } , { dt , 0 , 0 , 5 , 1 } , { dt , 1 , 0 , 5 , 1 } , { ds , 2 , 0 , 4 , 1 } ,
{ dt , 0 , 0 , 5 , 2 } , { ds , 1 , 0 , 4 , 2 } ,
{ ds , 0 , 0 , 4 , 3 } ,
{ add_ref , - 1 , 0 , 0 , 1 } } , user , pointed_thing )
elseif cdir == 3 then -- pointed west-northwest
run_list ( { { aw , - 1 , 0 , 5 , - 3 } , { aw , - 2 , 0 , 5 , - 3 } , { aw , - 2 , 0 , 5 , - 2 } , { aw , - 3 , 0 , 5 , - 2 } ,
{ aw , 1 , 0 , 5 , 3 } , { aw , 0 , 0 , 5 , 3 } , { aw , 0 , 0 , 5 , 4 } , { aw , - 1 , 0 , 5 , 4 } , { aw , - 2 , 0 , 5 , 4 } ,
{ et , - 3 , 0 , 6 , - 1 } , { et , - 3 , 0 , 6 , 0 } , { et , - 3 , 0 , 6 , 1 } , { et , - 3 , 0 , 6 , 2 } , { et , - 3 , 0 , 6 , 3 } , { es , - 3 , 0 , 5 , 4 } ,
{ ds , - 1 , 0 , 4 , - 2 } ,
{ ds , - 2 , 0 , 4 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } , { dt , 0 , 0 , 5 , - 1 } ,
{ dt , - 2 , 0 , 5 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } ,
{ dt , - 2 , 0 , 5 , 1 } , { dt , - 1 , 0 , 5 , 1 } , { dt , 0 , 0 , 5 , 1 } ,
{ dt , - 2 , 0 , 5 , 2 } , { dt , - 1 , 0 , 5 , 2 } , { ds , 0 , 0 , 4 , 2 } ,
{ ds , - 2 , 0 , 4 , 3 } , { ds , - 1 , 0 , 4 , 3 } ,
{ add_ref , - 2 , 0 , 0 , 1 } } , user , pointed_thing )
elseif cdir == 4 then -- pointed west
run_list ( { { aw , 0 , 0 , 5 , - 3 } , { aw , - 1 , 0 , 5 , - 3 } , { aw , - 2 , 0 , 5 , - 3 } ,
{ aw , 0 , 0 , 5 , 3 } , { aw , - 1 , 0 , 5 , 3 } , { aw , - 2 , 0 , 5 , 3 } ,
{ es , - 3 , 0 , 5 , - 3 } , { et , - 3 , 0 , 6 , - 2 } , { et , - 3 , 0 , 6 , - 1 } , { et , - 3 , 0 , 6 , 0 } , { et , - 3 , 0 , 6 , 1 } , { et , - 3 , 0 , 6 , 2 } , { es , - 3 , 0 , 5 , 3 } ,
{ ds , - 2 , 0 , 4 , - 2 } , { ds , - 1 , 0 , 4 , - 2 } , { ds , 0 , 0 , 4 , - 2 } ,
{ dt , - 2 , 0 , 5 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } , { dt , 0 , 0 , 5 , - 1 } ,
{ dt , - 2 , 0 , 5 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } ,
{ dt , - 2 , 0 , 5 , 1 } , { dt , - 1 , 0 , 5 , 1 } , { dt , 0 , 0 , 5 , 1 } ,
{ ds , - 2 , 0 , 4 , 2 } , { ds , - 1 , 0 , 4 , 2 } , { ds , 0 , 0 , 4 , 2 } ,
{ add_ref , - 2 , 0 , 0 , 0 } } , user , pointed_thing )
elseif cdir == 5 then -- pointed west-southwest
run_list ( { { aw , 1 , 0 , 5 , - 3 } , { aw , 0 , 0 , 5 , - 3 } , { aw , 0 , 0 , 5 , - 4 } , { aw , - 1 , 0 , 5 , - 4 } , { aw , - 2 , 0 , 5 , - 4 } ,
{ aw , - 1 , 0 , 5 , 3 } , { aw , - 2 , 0 , 5 , 3 } , { aw , - 2 , 0 , 5 , 2 } , { aw , - 3 , 0 , 5 , 2 } ,
{ es , - 3 , 0 , 5 , - 4 } , { et , - 3 , 0 , 6 , - 3 } , { et , - 3 , 0 , 6 , - 2 } , { et , - 3 , 0 , 6 , - 1 } , { et , - 3 , 0 , 6 , 0 } , { et , - 3 , 0 , 6 , 1 } ,
{ ds , - 2 , 0 , 4 , - 3 } , { ds , - 1 , 0 , 4 , - 3 } ,
{ dt , - 2 , 0 , 5 , - 2 } , { dt , - 1 , 0 , 5 , - 2 } , { ds , 0 , 0 , 4 , - 2 } ,
{ dt , - 2 , 0 , 5 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } , { dt , 0 , 0 , 5 , - 1 } ,
{ dt , - 2 , 0 , 5 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } ,
{ ds , - 2 , 0 , 4 , 1 } , { dt , - 1 , 0 , 5 , 1 } , { dt , 0 , 0 , 5 , 1 } ,
{ ds , - 1 , 0 , 4 , 2 } ,
{ add_ref , - 2 , 0 , 0 , - 1 } } , user , pointed_thing )
elseif cdir == 6 then -- pointed southwest
run_list ( { { aw , 3 , 0 , 5 , - 2 } , { aw , 2 , 0 , 5 , - 2 } , { aw , 2 , 0 , 5 , - 3 } , { aw , 1 , 0 , 5 , - 3 } , { aw , 1 , 0 , 5 , - 4 } ,
{ aw , - 2 , 0 , 5 , 3 } , { aw , - 2 , 0 , 5 , 2 } , { aw , - 3 , 0 , 5 , 2 } , { aw , - 3 , 0 , 5 , 1 } , { aw , - 4 , 0 , 5 , 1 } ,
{ es , 0 , 0 , 5 , - 4 } , { es , - 1 , 0 , 5 , - 4 } , { et , - 1 , 0 , 6 , - 3 } , { et , - 1 , 0 , 6 , - 2 } , { et , - 2 , 0 , 6 , - 2 } , { et , - 2 , 0 , 6 , - 1 } , { et , - 3 , 0 , 6 , - 1 } , { es , - 4 , 0 , 5 , - 1 } , { es , - 4 , 0 , 5 , 0 } ,
{ ds , 0 , 0 , 4 , - 3 } ,
{ dt , 0 , 0 , 5 , - 2 } , { ds , 1 , 0 , 4 , - 2 } ,
{ dt , - 1 , 0 , 5 , - 1 } , { dt , 0 , 0 , 5 , - 1 } , { dt , 1 , 0 , 5 , - 1 } , { ds , 2 , 0 , 4 , - 1 } ,
{ ds , - 3 , 0 , 4 , 0 } , { dt , - 2 , 0 , 5 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } ,
{ ds , - 2 , 0 , 4 , 1 } , { dt , - 1 , 0 , 5 , 1 } ,
{ ds , - 1 , 0 , 4 , 2 } ,
{ add_ref , - 1 , 0 , 0 , - 1 } } , user , pointed_thing )
elseif cdir == 7 then -- pointed south-southwest
run_list ( { { aw , 3 , 0 , 5 , - 1 } , { aw , 3 , 0 , 5 , - 2 } , { aw , 2 , 0 , 5 , - 2 } , { aw , 2 , 0 , 5 , - 3 } ,
{ aw , - 3 , 0 , 5 , 1 } , { aw , - 3 , 0 , 5 , 0 } , { aw , - 4 , 0 , 5 , 0 } , { aw , - 4 , 0 , 5 , - 1 } , { aw , - 4 , 0 , 5 , - 2 } ,
{ et , 1 , 0 , 6 , - 3 } , { et , 0 , 0 , 6 , - 3 } , { et , - 1 , 0 , 6 , - 3 } , { et , - 2 , 0 , 6 , - 3 } , { et , - 3 , 0 , 6 , - 3 } , { es , - 4 , 0 , 5 , - 3 } ,
{ ds , - 3 , 0 , 4 , - 2 } , { dt , - 2 , 0 , 5 , - 2 } , { dt , - 1 , 0 , 5 , - 2 } , { dt , 0 , 0 , 5 , - 2 } , { ds , 1 , 0 , 4 , - 2 } ,
{ ds , - 3 , 0 , 4 , - 1 } , { dt , - 2 , 0 , 5 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } , { dt , 0 , 0 , 5 , - 1 } , { dt , 1 , 0 , 5 , - 1 } , { ds , 2 , 0 , 4 , - 1 } ,
{ ds , - 2 , 0 , 4 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } ,
{ add_ref , - 1 , 0 , 0 , - 2 } } , user , pointed_thing )
elseif cdir == 8 then -- pointed south
run_list ( { { aw , 3 , 0 , 5 , 0 } , { aw , 3 , 0 , 5 , - 1 } , { aw , 3 , 0 , 5 , - 2 } ,
{ aw , - 3 , 0 , 5 , 0 } , { aw , - 3 , 0 , 5 , - 1 } , { aw , - 3 , 0 , 5 , - 2 } ,
{ es , 3 , 0 , 5 , - 3 } , { et , 2 , 0 , 6 , - 3 } , { et , 1 , 0 , 6 , - 3 } , { et , 0 , 0 , 6 , - 3 } , { et , - 1 , 0 , 6 , - 3 } , { et , - 2 , 0 , 6 , - 3 } , { es , - 3 , 0 , 5 , - 3 } ,
{ ds , - 2 , 0 , 4 , - 2 } , { dt , - 1 , 0 , 5 , - 2 } , { dt , 0 , 0 , 5 , - 2 } , { dt , 1 , 0 , 5 , - 2 } , { ds , 2 , 0 , 4 , - 2 } ,
{ ds , - 2 , 0 , 4 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } , { dt , 0 , 0 , 5 , - 1 } , { dt , 1 , 0 , 5 , - 1 } , { ds , 2 , 0 , 4 , - 1 } ,
{ ds , - 2 , 0 , 4 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { ds , 2 , 0 , 4 , 0 } ,
{ add_ref , 0 , 0 , 0 , - 2 } } , user , pointed_thing )
elseif cdir == 9 then -- pointed south-southeast
run_list ( { { aw , 3 , 0 , 5 , 1 } , { aw , 3 , 0 , 5 , 0 } , { aw , 4 , 0 , 5 , 0 } , { aw , 4 , 0 , 5 , - 1 } , { aw , 4 , 0 , 5 , - 2 } ,
{ aw , - 3 , 0 , 5 , - 1 } , { aw , - 3 , 0 , 5 , - 2 } , { aw , - 2 , 0 , 5 , - 2 } , { aw , - 2 , 0 , 5 , - 3 } ,
{ es , 4 , 0 , 5 , - 3 } , { et , 3 , 0 , 6 , - 3 } , { et , 2 , 0 , 6 , - 3 } , { et , 1 , 0 , 6 , - 3 } , { et , 0 , 0 , 6 , - 3 } , { et , - 1 , 0 , 6 , - 3 } ,
{ ds , - 1 , 0 , 4 , - 2 } , { dt , 0 , 0 , 5 , - 2 } , { dt , 1 , 0 , 5 , - 2 } , { dt , 2 , 0 , 5 , - 2 } , { ds , 3 , 0 , 4 , - 2 } ,
{ ds , - 2 , 0 , 4 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } , { dt , 0 , 0 , 5 , - 1 } , { dt , 1 , 0 , 5 , - 1 } , { dt , 2 , 0 , 5 , - 1 } , { ds , 3 , 0 , 4 , - 1 } ,
{ dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { ds , 2 , 0 , 4 , 0 } ,
{ add_ref , 1 , 0 , 0 , - 2 } } , user , pointed_thing )
elseif cdir == 10 then -- pointed southeast
run_list ( { { aw , 2 , 0 , 5 , 3 } , { aw , 2 , 0 , 5 , 2 } , { aw , 3 , 0 , 5 , 2 } , { aw , 3 , 0 , 5 , 1 } , { aw , 4 , 0 , 5 , 1 } ,
{ aw , - 3 , 0 , 5 , - 2 } , { aw , - 2 , 0 , 5 , - 2 } , { aw , - 2 , 0 , 5 , - 3 } , { aw , - 1 , 0 , 5 , - 3 } , { aw , - 1 , 0 , 5 , - 4 } ,
{ es , 4 , 0 , 5 , 0 } , { es , 4 , 0 , 5 , - 1 } , { et , 3 , 0 , 6 , - 1 } , { et , 2 , 0 , 6 , - 1 } , { et , 2 , 0 , 6 , - 2 } , { et , 1 , 0 , 6 , - 2 } , { et , 1 , 0 , 6 , - 3 } , { es , 1 , 0 , 5 , - 4 } , { es , 0 , 0 , 5 , - 4 } ,
{ ds , 0 , 0 , 4 , - 3 } ,
{ ds , - 1 , 0 , 4 , - 2 } , { dt , 0 , 0 , 5 , - 2 } ,
{ ds , - 2 , 0 , 4 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } , { dt , 0 , 0 , 5 , - 1 } , { dt , 1 , 0 , 5 , - 1 } ,
{ dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { dt , 2 , 0 , 5 , 0 } , { ds , 3 , 0 , 4 , 0 } ,
{ dt , 1 , 0 , 5 , 1 } , { ds , 2 , 0 , 4 , 1 } ,
{ ds , 1 , 0 , 4 , 2 } ,
{ add_ref , 1 , 0 , 0 , - 1 } } , user , pointed_thing )
elseif cdir == 11 then -- pointed east-southeast
run_list ( { { aw , 1 , 0 , 5 , 3 } , { aw , 2 , 0 , 5 , 3 } , { aw , 2 , 0 , 5 , 2 } , { aw , 3 , 0 , 5 , 2 } ,
{ aw , - 1 , 0 , 5 , - 3 } , { aw , 0 , 0 , 5 , - 3 } , { aw , 0 , 0 , 5 , - 4 } , { aw , 1 , 0 , 5 , - 4 } , { aw , 2 , 0 , 5 , - 4 } ,
{ et , 3 , 0 , 6 , 1 } , { et , 3 , 0 , 6 , 0 } , { et , 3 , 0 , 6 , - 1 } , { et , 3 , 0 , 6 , - 2 } , { et , 3 , 0 , 6 , - 3 } , { es , 3 , 0 , 5 , - 4 } ,
{ ds , 1 , 0 , 4 , - 3 } , { ds , 2 , 0 , 4 , - 3 } ,
{ ds , 0 , 0 , 4 , - 2 } , { dt , 1 , 0 , 5 , - 2 } , { dt , 2 , 0 , 5 , - 2 } ,
{ dt , 0 , 0 , 5 , - 1 } , { dt , 1 , 0 , 5 , - 1 } , { dt , 2 , 0 , 5 , - 1 } ,
{ dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { dt , 2 , 0 , 5 , 0 } ,
{ dt , 0 , 0 , 5 , 1 } , { dt , 1 , 0 , 5 , 1 } , { ds , 2 , 0 , 4 , 1 } ,
{ ds , 1 , 0 , 4 , 2 } ,
{ add_ref , 2 , 0 , 0 , - 1 } } , user , pointed_thing )
elseif cdir == 12 then -- pointed east
run_list ( { { aw , 0 , 0 , 5 , 3 } , { aw , 1 , 0 , 5 , 3 } , { aw , 2 , 0 , 5 , 3 } ,
{ aw , 0 , 0 , 5 , - 3 } , { aw , 1 , 0 , 5 , - 3 } , { aw , 2 , 0 , 5 , - 3 } ,
{ es , 3 , 0 , 5 , 3 } , { et , 3 , 0 , 6 , 2 } , { et , 3 , 0 , 6 , 1 } , { et , 3 , 0 , 6 , 0 } , { et , 3 , 0 , 6 , - 1 } , { et , 3 , 0 , 6 , - 2 } , { es , 3 , 0 , 5 , - 3 } ,
{ ds , 0 , 0 , 4 , - 2 } , { ds , 1 , 0 , 4 , - 2 } , { ds , 2 , 0 , 4 , - 2 } ,
{ dt , 0 , 0 , 5 , - 1 } , { dt , 1 , 0 , 5 , - 1 } , { dt , 2 , 0 , 5 , - 1 } ,
{ dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { dt , 2 , 0 , 5 , 0 } ,
{ dt , 0 , 0 , 5 , 1 } , { dt , 1 , 0 , 5 , 1 } , { dt , 2 , 0 , 5 , 1 } ,
{ ds , 0 , 0 , 4 , 2 } , { ds , 1 , 0 , 4 , 2 } , { ds , 2 , 0 , 4 , 2 } ,
{ add_ref , 2 , 0 , 0 , 0 } } , user , pointed_thing )
elseif cdir == 13 then -- pointed east-northeast
run_list ( { { aw , - 1 , 0 , 5 , 3 } , { aw , 0 , 0 , 5 , 3 } , { aw , 0 , 0 , 5 , 4 } , { aw , 1 , 0 , 5 , 4 } , { aw , 2 , 0 , 5 , 4 } ,
{ aw , 1 , 0 , 5 , - 3 } , { aw , 2 , 0 , 5 , - 3 } , { aw , 2 , 0 , 5 , - 2 } , { aw , 3 , 0 , 5 , - 2 } ,
{ es , 3 , 0 , 5 , 4 } , { et , 3 , 0 , 6 , 3 } , { et , 3 , 0 , 6 , 2 } , { et , 3 , 0 , 6 , 1 } , { et , 3 , 0 , 6 , 0 } , { et , 3 , 0 , 6 , - 1 } ,
{ ds , 1 , 0 , 4 , - 2 } ,
{ dt , 0 , 0 , 5 , - 1 } , { dt , 1 , 0 , 5 , - 1 } , { ds , 2 , 0 , 4 , - 1 } ,
{ dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { dt , 2 , 0 , 5 , 0 } ,
{ dt , 0 , 0 , 5 , 1 } , { dt , 1 , 0 , 5 , 1 } , { dt , 2 , 0 , 5 , 1 } ,
{ ds , 0 , 0 , 4 , 2 } , { dt , 1 , 0 , 5 , 2 } , { dt , 2 , 0 , 5 , 2 } ,
{ ds , 1 , 0 , 4 , 3 } , { ds , 2 , 0 , 4 , 3 } ,
{ add_ref , 2 , 0 , 0 , 1 } } , user , pointed_thing )
elseif cdir == 14 then -- pointed northeast
run_list ( { { aw , - 3 , 0 , 5 , 2 } , { aw , - 2 , 0 , 5 , 2 } , { aw , - 2 , 0 , 5 , 3 } , { aw , - 1 , 0 , 5 , 3 } , { aw , - 1 , 0 , 5 , 4 } ,
{ aw , 2 , 0 , 5 , - 3 } , { aw , 2 , 0 , 5 , - 2 } , { aw , 3 , 0 , 5 , - 2 } , { aw , 3 , 0 , 5 , - 1 } , { aw , 4 , 0 , 5 , - 1 } ,
{ es , 0 , 0 , 5 , 4 } , { es , 1 , 0 , 5 , 4 } , { et , 1 , 0 , 6 , 3 } , { et , 1 , 0 , 6 , 2 } , { et , 2 , 0 , 6 , 2 } , { et , 2 , 0 , 6 , 1 } , { et , 3 , 0 , 6 , 1 } , { es , 4 , 0 , 5 , 1 } , { es , 4 , 0 , 5 , 0 } ,
{ ds , 1 , 0 , 4 , - 2 } ,
{ dt , 1 , 0 , 5 , - 1 } , { ds , 2 , 0 , 4 , - 1 } ,
{ dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { dt , 2 , 0 , 5 , 0 } , { ds , 3 , 0 , 4 , 0 } ,
{ ds , - 2 , 0 , 4 , 1 } , { dt , - 1 , 0 , 5 , 1 } , { dt , 0 , 0 , 5 , 1 } , { dt , 1 , 0 , 5 , 1 } ,
{ ds , - 1 , 0 , 4 , 2 } , { dt , 0 , 0 , 5 , 2 } ,
{ ds , 0 , 0 , 4 , 3 } ,
{ add_ref , 1 , 0 , 0 , 1 } } , user , pointed_thing )
elseif cdir == 15 then -- pointed north-northeast
run_list ( { { aw , - 3 , 0 , 5 , 1 } , { aw , - 3 , 0 , 5 , 2 } , { aw , - 2 , 0 , 5 , 2 } , { aw , - 2 , 0 , 5 , 3 } ,
{ aw , 3 , 0 , 5 , - 1 } , { aw , 3 , 0 , 5 , 0 } , { aw , 4 , 0 , 5 , 0 } , { aw , 4 , 0 , 5 , 1 } , { aw , 4 , 0 , 5 , 2 } ,
{ et , - 1 , 0 , 6 , 3 } , { et , 0 , 0 , 6 , 3 } , { et , 1 , 0 , 6 , 3 } , { et , 2 , 0 , 6 , 3 } , { et , 3 , 0 , 6 , 3 } , { es , 4 , 0 , 5 , 3 } ,
{ dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { ds , 2 , 0 , 4 , 0 } ,
{ ds , - 2 , 0 , 4 , 1 } , { dt , - 1 , 0 , 5 , 1 } , { dt , 0 , 0 , 5 , 1 } , { dt , 1 , 0 , 5 , 1 } , { dt , 2 , 0 , 5 , 1 } , { ds , 3 , 0 , 4 , 1 } ,
{ ds , - 1 , 0 , 4 , 2 } , { dt , 0 , 0 , 5 , 2 } , { dt , 1 , 0 , 5 , 2 } , { dt , 2 , 0 , 5 , 2 } , { ds , 3 , 0 , 4 , 2 } ,
{ add_ref , 1 , 0 , 0 , 2 } } , user , pointed_thing )
-- Dig up
elseif cdir == 16 then -- pointed north (0, dig up)
run_list ( { { aw , - 3 , 0 , 5 , 0 } , { aw , 3 , 0 , 5 , 0 } , { aw , - 3 , 0 , 6 , 1 } ,
{ aw , 3 , 0 , 6 , 1 } , { aw , - 3 , 1 , 6 , 2 } , { aw , 3 , 1 , 6 , 2 } ,
{ es , - 3 , 1 , 6 , 3 } , { et , - 2 , 1 , 7 , 3 } , { et , - 1 , 1 , 7 , 3 } , { et , 0 , 1 , 7 , 3 } , { et , 1 , 1 , 7 , 3 } , { et , 2 , 1 , 7 , 3 } , { es , 3 , 1 , 6 , 3 } ,
{ ds , - 2 , 0 , 4 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { ds , 2 , 0 , 4 , 0 } ,
{ ds , - 2 , 0 , 5 , 1 } , { dt , - 1 , 0 , 6 , 1 } , { dt , 0 , 0 , 6 , 1 } , { dt , 1 , 0 , 6 , 1 } , { ds , 2 , 0 , 5 , 1 } ,
{ ds , - 2 , 1 , 5 , 2 } , { dt , - 1 , 1 , 6 , 2 } , { dt , 0 , 1 , 6 , 2 } , { dt , 1 , 1 , 6 , 2 } , { ds , 2 , 1 , 5 , 2 } ,
{ add_ref , 0 , 1 , 0 , 2 } ,
{ add_ref , - 1 , 0 , 0 , 2 } , -- bridge support (left and right of nextref)
{ add_ref , 1 , 0 , 0 , 2 } } , user , pointed_thing )
elseif cdir == 17 then -- pointed northwest (2, dig up)
run_list ( { { aw , - 2 , 0 , 5 , - 3 } , { aw , - 2 , 0 , 6 , - 2 } , { aw , - 3 , 0 , 6 , - 2 } , { aw , - 3 , 0 , 6 , - 1 } , { aw , - 3 , 1 , 6 , - 2 } ,
{ aw , 3 , 0 , 5 , 2 } , { aw , 2 , 0 , 6 , 2 } , { aw , 2 , 0 , 6 , 3 } , { aw , 1 , 0 , 6 , 3 } , { aw , 1 , 1 , 6 , 4 } ,
{ es , - 4 , 1 , 6 , 0 } , { es , - 4 , 1 , 6 , 1 } , { et , - 3 , 1 , 7 , 1 } , { et , - 2 , 1 , 7 , 1 } , { et , - 2 , 1 , 7 , 2 } , { et , - 1 , 1 , 7 , 2 } , { et , - 1 , 1 , 7 , 3 } , { es , - 1 , 1 , 6 , 4 } , { es , 0 , 1 , 6 , 4 } ,
{ ds , - 1 , 0 , 4 , - 2 } ,
{ ds , - 2 , 0 , 5 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } ,
{ ds , - 3 , 1 , 5 , 0 } , { dt , - 2 , 1 , 6 , 0 } , { dt , - 1 , 0 , 6 , 0 } , { dt , 0 , 0 , 6 , 0 } ,
{ dt , - 1 , 1 , 6 , 1 } , { dt , 0 , 0 , 6 , 1 } , { dt , 1 , 0 , 5 , 1 } , { ds , 2 , 0 , 4 , 1 } ,
{ dt , 0 , 1 , 6 , 2 } , { ds , 1 , 0 , 5 , 2 } ,
{ ds , 0 , 1 , 5 , 3 } ,
{ add_ref , - 1 , 1 , 0 , 1 } ,
{ add_ref , - 2 , 0 , 0 , 0 } , -- bridge support (left and right of nextref)
{ add_ref , 0 , 0 , 0 , 2 } } , user , pointed_thing )
elseif cdir == 18 then -- pointed west (4, dig up)
run_list ( { { aw , 0 , 0 , 5 , - 3 } , { aw , - 1 , 0 , 6 , - 3 } , { aw , - 2 , 0 , 6 , - 3 } ,
{ aw , 0 , 0 , 5 , 3 } , { aw , - 1 , 0 , 6 , 3 } , { aw , - 2 , 0 , 6 , 3 } ,
{ es , - 3 , 1 , 6 , - 3 } , { et , - 3 , 1 , 7 , - 2 } , { et , - 3 , 1 , 7 , - 1 } , { et , - 3 , 1 , 7 , 0 } , { et , - 3 , 1 , 7 , 1 } , { et , - 3 , 1 , 7 , 2 } , { es , - 3 , 1 , 6 , 3 } ,
{ ds , - 2 , 1 , 5 , - 2 } , { ds , - 1 , 0 , 5 , - 2 } , { ds , 0 , 0 , 4 , - 2 } ,
{ dt , - 2 , 1 , 6 , - 1 } , { dt , - 1 , 0 , 6 , - 1 } , { dt , 0 , 0 , 5 , - 1 } ,
{ dt , - 2 , 1 , 6 , 0 } , { dt , - 1 , 0 , 6 , 0 } , { dt , 0 , 0 , 5 , 0 } ,
{ dt , - 2 , 1 , 6 , 1 } , { dt , - 1 , 0 , 6 , 1 } , { dt , 0 , 0 , 5 , 1 } ,
{ ds , - 2 , 1 , 5 , 2 } , { ds , - 1 , 0 , 5 , 2 } , { ds , 0 , 0 , 4 , 2 } ,
{ add_ref , - 2 , 1 , 0 , 0 } ,
{ add_ref , - 2 , 0 , 0 , - 1 } , -- bridge support (left and right of nextref)
{ add_ref , - 2 , 0 , 0 , 1 } } , user , pointed_thing )
elseif cdir == 19 then -- pointed southwest (6, dig up)
run_list ( { { aw , 3 , 0 , 5 , - 2 } , { aw , 2 , 0 , 6 , - 2 } , { aw , 2 , 0 , 6 , - 3 } , { aw , 1 , 0 , 6 , - 3 } , { aw , 1 , 1 , 6 , - 4 } ,
{ aw , - 2 , 0 , 5 , 3 } , { aw , - 2 , 0 , 6 , 2 } , { aw , - 3 , 0 , 6 , 2 } , { aw , - 3 , 0 , 6 , 1 } , { aw , - 4 , 1 , 6 , 1 } ,
{ es , 0 , 1 , 6 , - 4 } , { es , - 1 , 1 , 6 , - 4 } , { et , - 1 , 1 , 7 , - 3 } , { et , - 1 , 1 , 7 , - 2 } , { et , - 2 , 1 , 7 , - 2 } , { et , - 2 , 1 , 7 , - 1 } , { et , - 3 , 1 , 7 , - 1 } , { es , - 4 , 1 , 6 , - 1 } , { es , - 4 , 1 , 6 , 0 } ,
{ ds , 0 , 1 , 5 , - 3 } ,
{ dt , 0 , 1 , 6 , - 2 } , { ds , 1 , 0 , 5 , - 2 } ,
{ dt , - 1 , 1 , 6 , - 1 } , { dt , 0 , 0 , 6 , - 1 } , { dt , 1 , 0 , 5 , - 1 } , { ds , 2 , 0 , 4 , - 1 } ,
{ ds , - 3 , 1 , 5 , 0 } , { dt , - 2 , 1 , 6 , 0 } , { dt , - 1 , 0 , 6 , 0 } , { dt , 0 , 0 , 6 , 0 } ,
{ ds , - 2 , 0 , 5 , 1 } , { dt , - 1 , 0 , 5 , 1 } ,
{ ds , - 1 , 0 , 4 , 2 } ,
{ add_ref , - 1 , 1 , 0 , - 1 } ,
{ add_ref , - 2 , 0 , 0 , 0 } , -- bridge support (left and right of nextref)
{ add_ref , 0 , 0 , 0 , - 2 } } , user , pointed_thing )
elseif cdir == 20 then -- pointed south (8, dig up)
run_list ( { { aw , 3 , 0 , 5 , 0 } , { aw , 3 , 0 , 6 , - 1 } , { aw , 3 , 0 , 6 , - 2 } ,
{ aw , - 3 , 0 , 5 , 0 } , { aw , - 3 , 0 , 6 , - 1 } , { aw , - 3 , 0 , 6 , - 2 } ,
{ es , 3 , 1 , 6 , - 3 } , { et , 2 , 1 , 7 , - 3 } , { et , 1 , 1 , 7 , - 3 } , { et , 0 , 1 , 7 , - 3 } , { et , - 1 , 1 , 7 , - 3 } , { et , - 2 , 1 , 7 , - 3 } , { es , - 3 , 1 , 6 , - 3 } ,
{ ds , - 2 , 1 , 5 , - 2 } , { dt , - 1 , 1 , 6 , - 2 } , { dt , 0 , 1 , 6 , - 2 } , { dt , 1 , 1 , 6 , - 2 } , { ds , 2 , 1 , 5 , - 2 } ,
{ ds , - 2 , 0 , 5 , - 1 } , { dt , - 1 , 0 , 6 , - 1 } , { dt , 0 , 0 , 6 , - 1 } , { dt , 1 , 0 , 6 , - 1 } , { ds , 2 , 0 , 6 , - 1 } ,
{ ds , - 2 , 0 , 4 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { ds , 2 , 0 , 4 , 0 } ,
{ add_ref , 0 , 1 , 0 , - 2 } ,
{ add_ref , - 1 , 0 , 0 , - 2 } , -- bridge support (left and right of nextref)
{ add_ref , 1 , 0 , 0 , - 2 } } , user , pointed_thing )
elseif cdir == 21 then -- pointed southeast (10, dig up)
run_list ( { { aw , 2 , 0 , 5 , 3 } , { aw , 2 , 0 , 6 , 2 } , { aw , 3 , 0 , 6 , 2 } , { aw , 3 , 0 , 6 , 1 } , { aw , 4 , 1 , 6 , 1 } ,
{ aw , - 3 , 0 , 5 , - 2 } , { aw , - 2 , 0 , 6 , - 2 } , { aw , - 2 , 0 , 6 , - 3 } , { aw , - 1 , 0 , 6 , - 3 } , { aw , - 1 , 1 , 6 , - 4 } ,
{ es , 4 , 1 , 6 , 0 } , { es , 4 , 1 , 6 , - 1 } , { et , 3 , 1 , 7 , - 1 } , { et , 2 , 1 , 7 , - 1 } , { et , 2 , 1 , 7 , - 2 } , { et , 1 , 1 , 7 , - 2 } , { et , 1 , 1 , 7 , - 3 } , { es , 1 , 1 , 6 , - 4 } , { es , 0 , 1 , 6 , - 4 } ,
{ ds , 0 , 1 , 5 , - 3 } ,
{ ds , - 1 , 0 , 5 , - 2 } , { dt , 0 , 1 , 6 , - 2 } ,
{ ds , - 2 , 0 , 4 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } , { dt , 0 , 0 , 6 , - 1 } , { dt , 1 , 1 , 6 , - 1 } ,
{ dt , 0 , 0 , 6 , 0 } , { dt , 1 , 0 , 6 , 0 } , { dt , 2 , 1 , 6 , 0 } , { ds , 3 , 1 , 5 , 0 } ,
{ dt , 1 , 0 , 5 , 1 } , { ds , 2 , 0 , 5 , 1 } ,
{ ds , 1 , 0 , 4 , 2 } ,
{ add_ref , 1 , 1 , 0 , - 1 } ,
{ add_ref , 2 , 0 , 0 , 0 } , -- bridge support (left and right of nextref)
{ add_ref , 0 , 0 , 0 , - 2 } } , user , pointed_thing )
elseif cdir == 22 then -- pointed east (12, dig up)
run_list ( { { aw , 0 , 0 , 5 , 3 } , { aw , 1 , 0 , 6 , 3 } , { aw , 2 , 0 , 6 , 3 } ,
{ aw , 0 , 0 , 5 , - 3 } , { aw , 1 , 0 , 6 , - 3 } , { aw , 2 , 0 , 6 , - 3 } ,
{ es , 3 , 1 , 6 , 3 } , { et , 3 , 1 , 7 , 2 } , { et , 3 , 1 , 7 , 1 } , { et , 3 , 1 , 7 , 0 } , { et , 3 , 1 , 7 , - 1 } , { et , 3 , 1 , 7 , - 2 } , { es , 3 , 1 , 6 , - 3 } ,
{ ds , 0 , 0 , 4 , - 2 } , { ds , 1 , 0 , 5 , - 2 } , { ds , 2 , 1 , 5 , - 2 } ,
{ dt , 0 , 0 , 5 , - 1 } , { dt , 1 , 0 , 6 , - 1 } , { dt , 2 , 1 , 6 , - 1 } ,
{ dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 6 , 0 } , { dt , 2 , 1 , 6 , 0 } ,
{ dt , 0 , 0 , 5 , 1 } , { dt , 1 , 0 , 6 , 1 } , { dt , 2 , 1 , 6 , 1 } ,
{ ds , 0 , 0 , 4 , 2 } , { ds , 1 , 0 , 5 , 2 } , { ds , 2 , 1 , 5 , 2 } ,
{ add_ref , 2 , 1 , 0 , 0 } ,
{ add_ref , 2 , 0 , 0 , 1 } , -- bridge support (left and right of nextref)
{ add_ref , 2 , 0 , 0 , - 1 } } , user , pointed_thing )
elseif cdir == 23 then -- pointed northeast (14, dig up)
run_list ( { { aw , - 3 , 0 , 5 , 2 } , { aw , - 2 , 0 , 6 , 2 } , { aw , - 2 , 0 , 6 , 3 } , { aw , - 1 , 0 , 6 , 3 } , { aw , - 1 , 1 , 6 , 4 } ,
{ aw , 2 , 0 , 5 , - 3 } , { aw , 2 , 0 , 6 , - 2 } , { aw , 3 , 0 , 6 , - 2 } , { aw , 3 , 0 , 6 , - 1 } , { aw , 4 , 1 , 6 , - 1 } ,
{ es , 0 , 1 , 6 , 4 } , { es , 1 , 1 , 6 , 4 } , { et , 1 , 1 , 7 , 3 } , { et , 1 , 1 , 7 , 2 } , { et , 2 , 1 , 7 , 2 } , { et , 2 , 1 , 7 , 1 } , { et , 3 , 1 , 7 , 1 } , { es , 4 , 1 , 6 , 1 } , { es , 4 , 1 , 6 , 0 } ,
{ ds , 1 , 0 , 4 , - 2 } ,
{ dt , 1 , 0 , 5 , - 1 } , { ds , 2 , 0 , 5 , - 1 } ,
{ dt , 0 , 0 , 6 , 0 } , { dt , 1 , 0 , 6 , 0 } , { dt , 2 , 1 , 6 , 0 } , { ds , 3 , 1 , 5 , 0 } ,
{ ds , - 2 , 0 , 4 , 1 } , { dt , - 1 , 0 , 5 , 1 } , { dt , 0 , 0 , 6 , 1 } , { dt , 1 , 1 , 6 , 1 } ,
{ ds , - 1 , 0 , 5 , 2 } , { dt , 0 , 1 , 6 , 2 } ,
{ ds , 0 , 1 , 5 , 3 } ,
{ add_ref , 1 , 1 , 0 , 1 } ,
{ add_ref , 0 , 0 , 0 , 2 } , -- bridge support (left and right of nextref)
{ add_ref , 2 , 0 , 0 , 0 } } , user , pointed_thing )
-- Dig down
elseif cdir == 24 then -- pointed north (0, dig down)
run_list ( { { aw , - 3 , 0 , 5 , 0 } , { aw , 3 , 0 , 5 , 0 } , { aw , - 3 , - 1 , 5 , 1 } ,
{ aw , 3 , - 1 , 5 , 1 } , { aw , - 3 , - 1 , 4 , 2 } , { aw , 3 , - 1 , 4 , 2 } ,
{ es , - 3 , - 1 , 4 , 3 } , { et , - 2 , - 1 , 5 , 3 } , { et , - 1 , - 1 , 5 , 3 } , { et , 0 , - 1 , 5 , 3 } , { et , 1 , - 1 , 5 , 3 } , { et , 2 , - 1 , 5 , 3 } , { es , 3 , - 1 , 4 , 3 } ,
{ ds , - 2 , 0 , 4 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { ds , 2 , 0 , 4 , 0 } ,
{ ds , - 2 , - 1 , 4 , 1 } , { dt , - 1 , - 1 , 5 , 1 } , { dt , 0 , - 1 , 5 , 1 } , { dt , 1 , - 1 , 5 , 1 } , { ds , 2 , - 1 , 4 , 1 } ,
{ ds , - 2 , - 1 , 3 , 2 } , { dt , - 1 , - 1 , 4 , 2 } , { dt , 0 , - 1 , 4 , 2 } , { dt , 1 , - 1 , 4 , 2 } , { ds , 2 , - 1 , 3 , 2 } ,
{ add_ref , 0 , - 1 , 0 , 2 } ,
{ add_ref , - 1 , - 1 , 0 , 0 } , -- bridge support (left and right of origin)
{ add_ref , 1 , - 1 , 0 , 0 } } , user , pointed_thing )
elseif cdir == 25 then -- pointed northwest (2, dig down)
run_list ( { { aw , - 2 , 0 , 5 , - 3 } , { aw , - 2 , - 1 , 5 , - 2 } , { aw , - 3 , - 1 , 5 , - 2 } , { aw , - 3 , - 1 , 5 , - 1 } , { aw , - 4 , - 1 , 4 , - 1 } ,
{ aw , 3 , 0 , 5 , 2 } , { aw , 2 , - 1 , 5 , 2 } , { aw , 2 , - 1 , 5 , 3 } , { aw , 1 , - 1 , 5 , 3 } , { aw , 1 , - 1 , 4 , 4 } ,
{ es , - 4 , - 1 , 4 , 0 } , { es , - 4 , - 1 , 4 , 1 } , { et , - 3 , - 1 , 5 , 1 } , { et , - 2 , - 1 , 6 , 1 } , { et , - 2 , - 1 , 6 , 2 } , { et , - 1 , - 1 , 6 , 2 } , { et , - 1 , - 1 , 5 , 3 } , { es , - 1 , - 1 , 4 , 4 } , { es , 0 , - 1 , 4 , 4 } ,
{ ds , - 1 , 0 , 4 , - 2 } ,
{ ds , - 2 , - 1 , 4 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } ,
{ ds , - 3 , - 1 , 3 , 0 } , { dt , - 2 , - 1 , 4 , 0 } , { dt , - 1 , - 1 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } ,
{ dt , - 1 , - 1 , 5 , 1 } , { dt , 0 , - 1 , 5 , 1 } , { dt , 1 , 0 , 5 , 1 } , { ds , 2 , 0 , 4 , 1 } ,
{ dt , 0 , - 1 , 4 , 2 } , { ds , 1 , - 1 , 4 , 2 } ,
{ ds , 0 , - 1 , 3 , 3 } ,
{ add_ref , - 1 , - 1 , 0 , 1 } ,
{ add_ref , - 1 , - 1 , 0 , - 1 } , -- bridge support (left and right of origin)
{ add_ref , 1 , - 1 , 0 , 1 } } , user , pointed_thing )
elseif cdir == 26 then -- pointed west (4, dig down)
run_list ( { { aw , 0 , 0 , 5 , - 3 } , { aw , - 1 , - 1 , 5 , - 3 } , { aw , - 2 , - 1 , 4 , - 3 } ,
{ aw , 0 , 0 , 5 , 3 } , { aw , - 1 , - 1 , 5 , 3 } , { aw , - 2 , - 1 , 4 , 3 } ,
{ es , - 3 , - 1 , 4 , - 3 } , { et , - 3 , - 1 , 5 , - 2 } , { et , - 3 , - 1 , 5 , - 1 } , { et , - 3 , - 1 , 5 , 0 } , { et , - 3 , - 1 , 5 , 1 } , { et , - 3 , - 1 , 5 , 2 } , { es , - 3 , - 1 , 4 , 3 } ,
{ ds , - 2 , - 1 , 3 , - 2 } , { ds , - 1 , - 1 , 4 , - 2 } , { ds , 0 , 0 , 4 , - 2 } ,
{ dt , - 2 , - 1 , 4 , - 1 } , { dt , - 1 , - 1 , 5 , - 1 } , { dt , 0 , 0 , 5 , - 1 } ,
{ dt , - 2 , - 1 , 4 , 0 } , { dt , - 1 , - 1 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } ,
{ dt , - 2 , - 1 , 4 , 1 } , { dt , - 1 , - 1 , 5 , 1 } , { dt , 0 , 0 , 5 , 1 } ,
{ ds , - 2 , - 1 , 3 , 2 } , { ds , - 1 , - 1 , 4 , 2 } , { ds , 0 , 0 , 4 , 2 } ,
{ add_ref , - 2 , - 1 , 0 , 0 } ,
{ add_ref , 0 , - 1 , 0 , 1 } , -- bridge support (left and right of origin)
{ add_ref , 0 , - 1 , 0 , - 1 } } , user , pointed_thing )
elseif cdir == 27 then -- pointed southwest (6, dig down)
run_list ( { { aw , 3 , 0 , 5 , - 2 } , { aw , 2 , - 1 , 5 , - 2 } , { aw , 2 , - 1 , 5 , - 3 } , { aw , 1 , - 1 , 5 , - 3 } , { aw , 1 , - 1 , 4 , - 4 } ,
{ aw , - 2 , 0 , 5 , 3 } , { aw , - 2 , - 1 , 5 , 2 } , { aw , - 3 , - 1 , 5 , 2 } , { aw , - 3 , - 1 , 5 , 1 } , { aw , - 4 , - 1 , 4 , 1 } ,
{ es , 0 , - 1 , 4 , - 4 } , { es , - 1 , - 1 , 4 , - 4 } , { et , - 1 , - 1 , 5 , - 3 } , { et , - 1 , - 1 , 6 , - 2 } , { et , - 2 , - 1 , 6 , - 2 } , { et , - 2 , - 1 , 6 , - 1 } , { et , - 3 , - 1 , 5 , - 1 } , { es , - 4 , - 1 , 4 , - 1 } , { es , - 4 , - 1 , 4 , 0 } ,
{ ds , 0 , - 1 , 3 , - 3 } ,
{ dt , 0 , - 1 , 4 , - 2 } , { ds , 1 , - 1 , 4 , - 2 } ,
{ dt , - 1 , - 1 , 5 , - 1 } , { dt , 0 , - 1 , 5 , - 1 } , { dt , 1 , 0 , 5 , - 1 } , { ds , 2 , 0 , 4 , - 1 } ,
{ ds , - 3 , - 1 , 3 , 0 } , { dt , - 2 , - 1 , 4 , 0 } , { dt , - 1 , - 1 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } ,
{ ds , - 2 , - 1 , 4 , 1 } , { dt , - 1 , 0 , 5 , 1 } ,
{ ds , - 1 , 0 , 4 , 2 } ,
{ add_ref , - 1 , - 1 , 0 , - 1 } ,
{ add_ref , - 1 , - 1 , 0 , 1 } , -- bridge support (left and right of origin)
{ add_ref , 1 , - 1 , 0 , - 1 } } , user , pointed_thing )
elseif cdir == 28 then -- pointed south (8, dig down)
run_list ( { { aw , 3 , 0 , 5 , 0 } , { aw , 3 , - 1 , 5 , - 1 } , { aw , 3 , - 1 , 4 , - 2 } ,
{ aw , - 3 , 0 , 5 , 0 } , { aw , - 3 , - 1 , 5 , - 1 } , { aw , - 3 , - 1 , 4 , - 2 } ,
{ es , 3 , - 1 , 4 , - 3 } , { et , 2 , - 1 , 5 , - 3 } , { et , 1 , - 1 , 5 , - 3 } , { et , 0 , - 1 , 5 , - 3 } , { et , - 1 , - 1 , 5 , - 3 } , { et , - 2 , - 1 , 5 , - 3 } , { es , - 3 , - 1 , 4 , - 3 } ,
{ ds , - 2 , - 1 , 3 , - 2 } , { dt , - 1 , - 1 , 4 , - 2 } , { dt , 0 , - 1 , 4 , - 2 } , { dt , 1 , - 1 , 4 , - 2 } , { ds , 2 , - 1 , 3 , - 2 } ,
{ ds , - 2 , - 1 , 4 , - 1 } , { dt , - 1 , - 1 , 5 , - 1 } , { dt , 0 , - 1 , 5 , - 1 } , { dt , 1 , - 1 , 5 , - 1 } , { ds , 2 , - 1 , 4 , - 1 } ,
{ ds , - 2 , 0 , 4 , 0 } , { dt , - 1 , 0 , 5 , 0 } , { dt , 0 , 0 , 5 , 0 } , { dt , 1 , 0 , 5 , 0 } , { ds , 2 , 0 , 4 , 0 } ,
{ add_ref , 0 , - 1 , 0 , - 2 } ,
{ add_ref , - 1 , - 1 , 0 , 0 } , -- bridge support (left and right of origin)
{ add_ref , 1 , - 1 , 0 , 0 } } , user , pointed_thing )
elseif cdir == 29 then -- pointed southeast (10, dig down)
run_list ( { { aw , 2 , 0 , 5 , 3 } , { aw , 2 , - 1 , 5 , 2 } , { aw , 3 , - 1 , 5 , 2 } , { aw , 3 , - 1 , 5 , 1 } , { aw , 4 , 0 , 5 , 1 } ,
{ aw , - 3 , 0 , 5 , - 2 } , { aw , - 2 , - 1 , 5 , - 2 } , { aw , - 2 , - 1 , 5 , - 3 } , { aw , - 1 , - 1 , 5 , - 3 } , { aw , - 1 , 0 , 5 , - 4 } ,
{ es , 4 , - 1 , 4 , 0 } , { es , 4 , - 1 , 4 , - 1 } , { et , 3 , - 1 , 5 , - 1 } , { et , 2 , - 1 , 6 , - 1 } , { et , 2 , - 1 , 6 , - 2 } , { et , 1 , - 1 , 6 , - 2 } , { et , 1 , - 1 , 5 , - 3 } , { es , 1 , - 1 , 4 , - 4 } , { es , 0 , - 1 , 4 , - 4 } ,
{ ds , 0 , - 1 , 3 , - 3 } ,
{ ds , - 1 , - 1 , 4 , - 2 } , { dt , 0 , - 1 , 4 , - 2 } ,
{ ds , - 2 , 0 , 4 , - 1 } , { dt , - 1 , 0 , 5 , - 1 } , { dt , 0 , - 1 , 5 , - 1 } , { dt , 1 , - 1 , 5 , - 1 } ,
{ dt , 0 , 0 , 5 , 0 } , { dt , 1 , - 1 , 5 , 0 } , { dt , 2 , - 1 , 4 , 0 } , { ds , 3 , - 1 , 3 , 0 } ,
{ dt , 1 , 0 , 5 , 1 } , { ds , 2 , - 1 , 4 , 1 } ,
{ ds , 1 , 0 , 4 , 2 } ,
{ add_ref , 1 , - 1 , 0 , - 1 } ,
{ add_ref , - 1 , - 1 , 0 , - 1 } , -- bridge support (left and right of origin)
{ add_ref , 1 , - 1 , 0 , 1 } } , user , pointed_thing )
elseif cdir == 30 then -- pointed east (12, dig down)
run_list ( { { aw , 0 , 0 , 5 , 3 } , { aw , 1 , - 1 , 5 , 3 } , { aw , 2 , - 1 , 4 , 3 } ,
{ aw , 0 , 0 , 5 , - 3 } , { aw , 1 , - 1 , 5 , - 3 } , { aw , 2 , - 1 , 4 , - 3 } ,
{ es , 3 , - 1 , 4 , 3 } , { et , 3 , - 1 , 5 , 2 } , { et , 3 , - 1 , 5 , 1 } , { et , 3 , - 1 , 5 , 0 } , { et , 3 , - 1 , 5 , - 1 } , { et , 3 , - 1 , 5 , - 2 } , { es , 3 , - 1 , 4 , - 3 } ,
{ ds , 0 , 0 , 4 , - 2 } , { ds , 1 , - 1 , 4 , - 2 } , { ds , 2 , - 1 , 3 , - 2 } ,
{ dt , 0 , 0 , 5 , - 1 } , { dt , 1 , - 1 , 5 , - 1 } , { dt , 2 , - 1 , 4 , - 1 } ,
{ dt , 0 , 0 , 5 , 0 } , { dt , 1 , - 1 , 5 , 0 } , { dt , 2 , - 1 , 4 , 0 } ,
{ dt , 0 , 0 , 5 , 1 } , { dt , 1 , - 1 , 5 , 1 } , { dt , 2 , - 1 , 4 , 1 } ,
{ ds , 0 , 0 , 4 , 2 } , { ds , 1 , - 1 , 4 , 2 } , { ds , 2 , - 1 , 3 , 2 } ,
{ add_ref , 2 , - 1 , 0 , 0 } ,
{ add_ref , 0 , - 1 , 0 , 1 } , -- bridge support (left and right of origin)
{ add_ref , 0 , - 1 , 0 , - 1 } } , user , pointed_thing )
elseif cdir == 31 then -- pointed northeast (14, dig down)
run_list ( { { aw , - 3 , 0 , 5 , 2 } , { aw , - 2 , - 1 , 5 , 2 } , { aw , - 2 , - 1 , 5 , 3 } , { aw , - 1 , - 1 , 5 , 3 } , { aw , - 1 , - 1 , 4 , 4 } ,
{ aw , 2 , 0 , 5 , - 3 } , { aw , 2 , - 1 , 5 , - 2 } , { aw , 3 , - 1 , 5 , - 2 } , { aw , 3 , - 1 , 5 , - 1 } , { aw , 4 , - 1 , 4 , - 1 } ,
{ es , 0 , - 1 , 4 , 4 } , { es , 1 , - 1 , 4 , 4 } , { et , 1 , - 1 , 5 , 3 } , { et , 1 , - 1 , 6 , 2 } , { et , 2 , - 1 , 6 , 2 } , { et , 2 , - 1 , 6 , 1 } , { et , 3 , - 1 , 5 , 1 } , { es , 4 , - 1 , 4 , 1 } , { es , 4 , - 1 , 4 , 0 } ,
{ ds , 1 , 0 , 4 , - 2 } ,
{ dt , 1 , 0 , 5 , - 1 } , { ds , 2 , - 1 , 4 , - 1 } ,
{ dt , 0 , 0 , 5 , 0 } , { dt , 1 , - 1 , 5 , 0 } , { dt , 2 , - 1 , 4 , 0 } , { ds , 3 , - 1 , 3 , 0 } ,
{ ds , - 2 , 0 , 4 , 1 } , { dt , - 1 , 0 , 5 , 1 } , { dt , 0 , - 1 , 5 , 1 } , { dt , 1 , - 1 , 5 , 1 } ,
{ ds , - 1 , - 1 , 4 , 2 } , { dt , 0 , - 1 , 4 , 2 } ,
{ ds , 0 , - 1 , 3 , 3 } ,
{ add_ref , - 1 , - 1 , 0 , 1 } ,
{ add_ref , - 1 , - 1 , 0 , 0 } , -- bridge support (left and right of origin)
{ add_ref , 1 , - 1 , 0 , - 1 } } , user , pointed_thing )
2017-04-21 09:40:51 -07:00
end
2018-07-17 14:26:55 -07:00
add_light ( 1 , user , pointed_thing ) -- change to 1 for more frequent lights (using 1 while debugging updown)
2017-04-21 09:40:51 -07:00
end
end
local i
for i , img in ipairs ( images ) do
local inv = 1
if i == 2 then
inv = 0
end
minetest.register_tool ( " tunnelmaker: " .. ( i - 1 ) ,
{
2018-06-17 08:46:47 -07:00
description = " Tunnel Maker " ,
2017-04-21 09:40:51 -07:00
groups = { not_in_creative_inventory = inv } ,
inventory_image = img ,
wield_image = img ,
stack_max = 1 ,
range = 7.0 ,
-- dig single node like wood pickaxe with left mouse click
2018-05-20 20:09:00 -07:00
-- works in both regular and creative modes
2017-04-21 09:40:51 -07:00
tool_capabilities = {
full_punch_interval = 1.2 ,
max_drop_level = 0 ,
groupcaps = {
cracky = { times = { [ 3 ] = 1.6 } , maxlevel = 1 } ,
} ,
damage_groups = { fleshy = 2 } ,
} ,
-- dig tunnel with right mouse click (double tap on android)
2018-05-20 20:09:00 -07:00
-- tunneling only works if in creative mode
2017-04-21 09:40:51 -07:00
on_place = function ( itemstack , placer , pointed_thing )
2018-07-17 14:26:55 -07:00
local pname = placer and placer : get_player_name ( ) or " "
2018-05-20 20:09:00 -07:00
local creative_enabled = ( creative and creative.is_enabled_for
2018-07-17 14:26:55 -07:00
and creative.is_enabled_for ( pname ) )
if creative_enabled then
-- If sneak button held down when right-clicking tunnelmaker, toggle updown dig direction: up, down, horizontal, ...
-- Rotating or moving will reset to horizontal.
if placer : get_player_control ( ) . sneak then
tunnelmaker [ pname ] . updown = ( tunnelmaker [ pname ] . updown + 1 ) % 3
tunnelmaker [ pname ] . lastpos = { x = placer : getpos ( ) . x , y = placer : getpos ( ) . y , z = placer : getpos ( ) . z }
-- Otherwise dig tunnel based on direction pointed and current updown direction
elseif pointed_thing.type == " node " then
-- if advtrains_track, I lower positions of pointed_thing to right below track, but keep name the same.
local name = minetest.get_node ( pointed_thing.under ) . name
if minetest.registered_nodes [ name ] . groups.advtrains_track == 1 then
pointed_thing.under = vector.add ( pointed_thing.under , { x = 0 , y =- 1 , z = 0 } )
pointed_thing.above = vector.add ( pointed_thing.above , { x = 0 , y =- 1 , z = 0 } ) -- don't currently use this
end
dig_tunnel ( i - 1 , placer , pointed_thing )
tunnelmaker [ pname ] . updown = 0 -- reset after one use
2018-06-21 10:09:30 -07:00
end
2017-04-21 09:40:51 -07:00
end
2018-07-17 14:26:55 -07:00
end , -- on_place
2017-04-21 09:40:51 -07:00
}
)
end
minetest.register_craft ( {
output = ' tunnelmaker:1 ' ,
recipe = {
{ ' default:diamondblock ' , ' default:mese_block ' , ' default:diamondblock ' } ,
{ ' default:mese_block ' , ' default:diamondblock ' , ' default:mese_block ' } ,
{ ' default:diamondblock ' , ' default:mese_block ' , ' default:diamondblock ' }
}
} )