From d837a09726f5ae63350c9e04d14fc71cd713da6d Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 19 Feb 2021 01:07:45 -0500 Subject: [PATCH] Add some utility functions to help clarify the merge mode being used when assigning terrains --- data/lua/core/map.lua | 50 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 data/lua/core/map.lua diff --git a/data/lua/core/map.lua b/data/lua/core/map.lua new file mode 100644 index 000000000000..20c952245486 --- /dev/null +++ b/data/lua/core/map.lua @@ -0,0 +1,50 @@ +--[========[Map module]========] +print("Loading map module...") + +if wesnoth.kernel_type() == "Game Lua Kernel" then + function wesnoth.map.split_terrain_code(code) + return table.unpack(code:split('^', {remove_empty = false})) + end + + -- possible terrain string inputs: + -- A A^ A^B ^ ^B + -- implied mode: + -- both base both overlay overlay + function wesnoth.map.replace_base(code) + local base, overlay = wesnoth.map.split_terrain_code(code) + if base == nil then -- ^ or ^B + -- There's no base to replace with, so do nothing + return '' + else + -- Use the specified base but ignore the overlay + return base .. '^' + end + end + + function wesnoth.map.replace_overlay(code) + local base, overlay = wesnoth.map.split_terrain_code(code) + if overlay == nil or overlay == '' then -- A or A^ + -- No overlay was specified, so we want to clear the overlay without touching the base + return '^' + else + -- An overlay was specified, so use that and ignore the base + return '^' .. overlay + end + end + + function wesnoth.map.replace_both(code) + local base, overlay = wesnoth.map.split_terrain_code(code) + if base == '' then -- ^ or ^B + -- There's no way to find a base to replace with in this case. + -- Could use the existing base, but that's not really replacing both, is it? + error('replace_both: no base terrain specified') + elseif overlay == '' then -- A^ + -- This would normally mean replace base while preserving overlay, + -- but we actually want to replace base and clear overlay. + return base + else + -- It's already going to replace both, so return unchanged + return code + end + end +end \ No newline at end of file