node categorization code to identify go stones, physical walls, empty spaces, and also semantically-meaningful concrete variants

pull/1/head
capitalthree 1 year ago
parent 7cd53d2e89
commit 30868bec31
  1. 46
      rules.lua
  2. 7
      stones.lua

@ -11,27 +11,61 @@ local modname = minetest.get_current_modname()
local cache = {} local cache = {}
local relativeNeighbors = { local relative_neighbors = {
vector.new(1, 0, 0), vector.new(1, 0, 0),
vector.new(0, 0, 1), vector.new(0, 0, 1),
vector.new(-1, 0, 0), vector.new(-1, 0, 0),
vector.new(0, 0, -1) vector.new(0, 0, -1)
} }
local solid_drawtypes = {
normal = true,
glasslike_framed = true,
}
--[[
E: empty
Stype: a go stone of some type
W: full block wall
WE0-WE3: edge concrete
WC0-WC3: corner concrete
--]]
function check_position(pos) function check_position(pos)
local hash = minetest.hash_node_position(pos) local hash = minetest.hash_node_position(pos)
if cache[hash] then if cache[hash] then
return cache[hash] return cache[hash]
end end
local ret = minetest.get_node(pos) local ret = _check_position_uncached(pos)
print_r(ret) print(ret) -- todo: remove this
print_r(minetest.registered_items[ret.name])
print(pos)
cache[hash] = ret cache[hash] = ret
return ret return ret
end end
function _check_position_uncached(pos)
local node = minetest.get_node(pos)
local reg_item = minetest.registered_items[node.name]
if reg_item.groups and reg_item.groups.go_stone then
return "S" .. reg_item.go_team
end
if reg_item.pattern_def then
if reg_item.pattern_def.name == "edgy" then
return "WE" .. node.param2
elseif reg_item.pattern_def.name == "corny" then
return "WC" .. node.param2
end
end
if solid_drawtypes[reg_item.drawtype] then
return "W"
else
return "E"
end
end
function check_captures(pos) function check_captures(pos)
minetest.chat_send_all(tostring(pos)) minetest.chat_send_all(tostring(pos))
nodecore.node_sound(pos, "dug") nodecore.node_sound(pos, "dug")
@ -40,7 +74,7 @@ function check_captures(pos)
local neighbors = {} local neighbors = {}
for i,v in ipairs(relativeNeighbors) do for i,v in ipairs(relative_neighbors) do
neighbors[i] = pos + v neighbors[i] = pos + v
end end

@ -54,12 +54,18 @@ local function reg(name, basename, basedef)
}, },
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
groups = { groups = {
snappy = 1, snappy = 1,
falling_node = 1, falling_node = 1,
falling_repose = 1, falling_repose = 1,
go_stone = 1
}, },
go_team = name,
sounds = basedef.sounds, sounds = basedef.sounds,
on_construct = check_captures on_construct = check_captures
@ -72,7 +78,6 @@ local function reg(name, basename, basedef)
nodes = { nodes = {
{ {
match = "nc_concrete:" .. name .. "_starcrossy_ply", match = "nc_concrete:" .. name .. "_starcrossy_ply",
--match = {groups = {goban = 1}},
replace = "air" replace = "air"
} }
}, },

Loading…
Cancel
Save