diff --git a/data/lua/core.lua b/data/lua/core.lua index 2cdd13edc1d4..edb1e3dbb823 100644 --- a/data/lua/core.lua +++ b/data/lua/core.lua @@ -638,6 +638,50 @@ if wesnoth.kernel_type() == "Game Lua Kernel" then --[========[Map module]========] + wesnoth.map.replace_if_failed = wesnoth.map.get().replace_if_failed + 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 + new_ter = '^' .. 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 + local hex_mt = {__metatable = 'terrain hex reference'} function hex_mt.__index(self, key)