From e79655e851c2be14004a6d8ef818e221e087926e Mon Sep 17 00:00:00 2001 From: capitalthree Date: Sun, 28 Apr 2024 07:27:54 -0500 Subject: [PATCH] prototype of persistent smoke --- abm.lua | 16 ++++++++++++ init.lua | 3 ++- rules.lua | 78 ++++++++++++++++++++++++++++++++----------------------- 3 files changed, 64 insertions(+), 33 deletions(-) create mode 100644 abm.lua diff --git a/abm.lua b/abm.lua new file mode 100644 index 0000000..42d9cc1 --- /dev/null +++ b/abm.lua @@ -0,0 +1,16 @@ +-- LUALOCALS < --------------------------------------------------------- +local include, nodecore += include, nodecore +-- LUALOCALS > --------------------------------------------------------- + +minetest.register_abm({ + label = "go smoke", + interval = 15, + chance = 1, + nodenames = {"group:go_stone"}, + action = function(pos, node) + if not (node.param2 == 0) then + nodecore.smokefx(pos, 60, node.param2) + end + end + }) diff --git a/init.lua b/init.lua index c0b4675..b3e63b8 100755 --- a/init.lua +++ b/init.lua @@ -8,4 +8,5 @@ lc_liberties = {} include("goban") include("rules") include("stones") -include("hints") \ No newline at end of file +include("hints") +include("abm") \ No newline at end of file diff --git a/rules.lua b/rules.lua index 35bc0fb..a860ba4 100644 --- a/rules.lua +++ b/rules.lua @@ -27,28 +27,6 @@ local solid_drawtypes = { glasslike_framed = true, } -local smokecontrol -if nodecore.smokeclear then - smokecontrol = function(pos, smoke,smoke2) - local existing = _check_position_uncached(pos) - - if smoke then - - else - - end - - - --if smoke then - -- nodecore.smokefx(pos, smoke, smoke2 or 1) - --else - -- nodecore.smokeclear(pos) - --end - end -else - smokecontrol = function(pos, smoke) end -end - --[[ E: air E_: other empty @@ -110,6 +88,42 @@ local function check_position(pos) return ret end +local function set_and_cache(pos, value) + nodecore.set_loud(pos, value) + cache[minetest.hash_node_position(pos)] = _check_position_uncached(pos) +end + +local smokecontrol +if nodecore.smokeclear then + smokecontrol = function(pos, smoke) + local existing = check_position(pos) + + + if existing:sub(1, 1) == "S" then + local node = minetest.get_node(pos) + node.param2 = smoke + minetest.swap_node(pos, node) + + if smoke then + nodecore.smokefx(pos, 60, smoke) + else + nodecore.smokeclear(pos) + end + else + if smoke then + nodecore.smokefx(pos, smoke, 1) + else + nodecore.smokeclear(pos) + end + end + + + + end +else + smokecontrol = function(pos, smoke) end +end + -- check for walls, physical or implied local function edge_check(pos, dir, terminate) local under = check_position(pos + down) @@ -209,7 +223,7 @@ local function board_clear_fx(basepos) local groups = minetest.registered_nodes[minetest.get_node(newpos).name].groups if groups then if groups.ko_stone then - nodecore.set_loud(newpos, {name = "air"}) + set_and_cache(newpos, {name = "air"}) end smokecontrol(newpos) end @@ -373,9 +387,9 @@ function lc_liberties.handle_placement(pos) local under = check_position(v2 + down) if (under:sub(1, 1) == "W") and (under:len() > 1) then nodecore.sound_play("nc_fire_ignite", {gain = 1, pos = pos}) - nodecore.set_loud(v2, {name = firenode}) + set_and_cache(v2, {name = firenode}) else - nodecore.set_loud(v2, {name = "air"}) + set_and_cache(v2, {name = "air"}) end count = count + 1 @@ -395,7 +409,7 @@ function lc_liberties.handle_placement(pos) local captures = check_captures(pos) if captures.capture then local stone = minetest.get_node(pos).name - nodecore.set_loud(pos, {name = "air"}) + set_and_cache(pos, {name = "air"}) nodecore.item_eject(pos, stone, 5) return @@ -404,7 +418,7 @@ function lc_liberties.handle_placement(pos) board_clear_fx(pos) - smokecontrol(pos, 300, 2+#allcaptured) + smokecontrol(pos, 2+#allcaptured) for i = #allcaptured, 1, -1 do local chosen = math.random(1, i) @@ -413,7 +427,7 @@ function lc_liberties.handle_placement(pos) end if ko then - nodecore.set_loud(ko.pos, {name = modname .. ":ko_" .. ko.stone}) + set_and_cache(ko.pos, {name = modname .. ":ko_" .. ko.stone}) end end @@ -442,7 +456,7 @@ function lc_liberties.handle_territory_fill(itemstack, placer, pointed_thing) local reg_item = minetest.registered_items[under.name] if reg_item and reg_item.groups and reg_item.groups.go_stone then - nodecore.set_loud(pointed_thing.above, {name = modname .. ":territory_" .. reg_item.go_team}) + set_and_cache(pointed_thing.above, {name = modname .. ":territory_" .. reg_item.go_team}) itemstack:set_count(itemstack:get_count() - 1) return itemstack end @@ -454,7 +468,7 @@ function lc_liberties.handle_territory_fill(itemstack, placer, pointed_thing) local piece = modname .. ":territory_" .. territories.team local count = 0 for i, v in pairs(territories.stones) do - nodecore.set_loud(v, {name = piece}) + set_and_cache(v, {name = piece}) count = count + 1 end itemstack:set_count(itemstack:get_count() - count) @@ -477,7 +491,7 @@ function lc_liberties.handle_dig(pos, node, digger) local count = 0 for i, v in pairs(connected_group(pos)) do count = count + 1 - nodecore.set_loud(v, {name = "air"}) + set_and_cache(v, {name = "air"}) end multi_eject(pos, stone, 1, count, digger and digger:get_inventory()) @@ -492,7 +506,7 @@ function lc_liberties.handle_click_ko(pos, node, clicker, itemstack, pointed_thi local handnode = minetest.registered_nodes[itemstack:get_name()] if handnode and handnode.groups.go_stone and handnode.go_team ~= minetest.registered_nodes[node.name].go_team then - nodecore.set_loud(pos, {name = handnode.name}) + set_and_cache(pos, {name = handnode.name}) itemstack:set_count(itemstack:get_count() - 1) end return itemstack