Add translator comments
This commit is contained in:
parent
9c11ae32ae
commit
60ee19d029
@ -223,6 +223,7 @@ minetest.register_chatcommand("music", {
|
||||
})
|
||||
|
||||
-- Special built-in ambience that is completely silent
|
||||
--~ Special entry in music list representing silence
|
||||
lzr_ambience.register_ambience("none", nil, nil, S("None"))
|
||||
|
||||
dofile(minetest.get_modpath("lzr_ambience").."/register.lua")
|
||||
|
@ -73,7 +73,7 @@ end
|
||||
|
||||
local STR_WARNING_1 = S("WARNING: The player movement settings are not at the recommended values for Lazarr! The physics might not work as intended!")
|
||||
local STR_WARNING_2 = S("Please exit the game and reset the following Luanti settings to their default value:")
|
||||
-- concatenate invalid settings with list separator (comma)
|
||||
--~ list separator for list of invalid player movement settings
|
||||
local STR_INVALID_SETTINGS = table.concat(invalid_settings, S(", "))
|
||||
|
||||
local disconnect = function(player)
|
||||
|
@ -337,6 +337,7 @@ minetest.register_node("lzr_core:water_source", {
|
||||
-- Same as lzr_core:water_source, but
|
||||
-- acts as an inpenetrable barrier
|
||||
minetest.register_node("lzr_core:water_source_barrier", {
|
||||
--~ Block that acts as an inpenetrable barrier
|
||||
description = S("Water Source Barrier"),
|
||||
_tt_help = S("Block that the player can’t move through"),
|
||||
drawtype = "liquid",
|
||||
@ -391,6 +392,7 @@ minetest.register_node("lzr_core:water_source_barrier", {
|
||||
-- For invisible level borders,
|
||||
-- should act like an invisible barrier.
|
||||
minetest.register_node("lzr_core:barrier", {
|
||||
--~ Block that acts as an inpenetrable barrier
|
||||
description = S("Barrier"),
|
||||
_tt_help = S("Invisible block that the player can’t move through"),
|
||||
drawtype = "airlike",
|
||||
@ -427,6 +429,7 @@ local RMO = 0.01
|
||||
-- but not the player. This node can be used as a
|
||||
-- level ceiling for rainy levels.
|
||||
minetest.register_node("lzr_core:rain_membrane", {
|
||||
--~ Block that acts as a barrier. Player can't move through but rain can
|
||||
description = S("Rain Membrane"),
|
||||
_tt_help = S("Invisible block that the player can’t move through but rain can"),
|
||||
drawtype = "airlike",
|
||||
|
@ -25,7 +25,7 @@ if minetest.settings:get_bool("lzr_debug", false) then
|
||||
minetest.register_chatcommand("devmode", {
|
||||
description = S("Enter or exit development mode"),
|
||||
privs = { server = true },
|
||||
params = S("[ enter | exit ]"),
|
||||
params = "[ enter | exit ]",
|
||||
func = function(name, param)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local already_in = lzr_gamestate.get_state() == lzr_gamestate.DEV
|
||||
|
@ -337,8 +337,10 @@ minetest.register_chatcommand("editor_save", {
|
||||
end
|
||||
local ok, filename, filename2 = save_level(level_name)
|
||||
if ok and filename and filename2 then
|
||||
--~ @1 and @2 are file locations
|
||||
return true, S("Level saved to @1 and @2.", filename, filename2)
|
||||
elseif of and filename then
|
||||
--~ @1 and @2 are file locations
|
||||
return true, S("Level saved to @1, but could not write metadata to @2.", filename, filename2)
|
||||
else
|
||||
return false, S("Error writing level file!")
|
||||
@ -393,6 +395,7 @@ local load_level = function(level_name, player)
|
||||
-- sunlight
|
||||
if legacy_window == "lzr_decor:woodframed_glass" then
|
||||
level_state.ceiling = "lzr_core:barrier"
|
||||
--~ The "window boundary" refers to a special block used for the boundaries of the level to create windows in the walls. It has been removed in later versions of the game.
|
||||
minetest.chat_send_player(player:get_player_name(), S("Note: This level uses a legacy window boundary, which is no longer supported."))
|
||||
else
|
||||
level_state.ceiling = exploded_bounds[4]
|
||||
|
@ -50,6 +50,7 @@ local level_ready = false
|
||||
|
||||
local reset_player = function(player, reset_type)
|
||||
if reset_type == "water" then
|
||||
--~ Message when you fall out of the level into the water. You may be creative in the translation
|
||||
lzr_messages.show_message(player, S("You’re sleeping with the fishes!"), 6.0, 0xFF0000)
|
||||
lzr_levels.leave_level(true, false)
|
||||
elseif reset_type == "out_of_bounds_ship" then
|
||||
@ -57,16 +58,19 @@ local reset_player = function(player, reset_type)
|
||||
local spawn = vector.add(lzr_globals.MENU_SHIP_POS, lzr_globals.MENU_SHIP_PLAYER_RESPAWN_OFFSET)
|
||||
player:set_pos(spawn)
|
||||
elseif reset_type == "out_of_bounds" then
|
||||
--~ Message when you move out of the level boundaries. You may be creative in the translation
|
||||
lzr_messages.show_message(player, S("Where yer thinks yar goin’, landlubber?"), 6.0, 0xFF0000)
|
||||
lzr_levels.leave_level(true, false)
|
||||
elseif reset_type == "skull_crush" then
|
||||
-- The skulls laugh at you when you got stuck ;-)
|
||||
minetest.sound_play({name="lzr_fallout_skull_laugh", gain=0.9}, {to_player=player:get_player_name()}, true)
|
||||
--~ Message when you got stuck inside skull blocks. You may be creative in the translation
|
||||
lzr_messages.show_message(player, S("You were skull-crushed!"), 6.0, 0xFF0000)
|
||||
lzr_levels.leave_level(true, false)
|
||||
elseif reset_type == "crush" then
|
||||
-- The skulls laugh at you when you got stuck ;-)
|
||||
minetest.sound_play({name="lzr_fallout_skull_laugh", gain=0.9}, {to_player=player:get_player_name()}, true)
|
||||
--~ Message when you got stuck inside solid blocks other than skulls. You may be creative in the translation
|
||||
lzr_messages.show_message(player, S("You were between a rock and a hard place."), 6.0, 0xFF0000)
|
||||
lzr_levels.leave_level(true, false)
|
||||
else
|
||||
|
@ -214,8 +214,11 @@ local function get_formspec(page, name)
|
||||
local pagestr = ""
|
||||
local max_page = current_max_pages[name]
|
||||
if max_page > 1 then
|
||||
--~ Previous page button in item selection
|
||||
pagestr = "button[0,5.45;1,1;lzr_getitem_prev;"..F(S("<")).."]"..
|
||||
--~ Next page button in item selection
|
||||
"button[1,5.45;1,1;lzr_getitem_next;"..F(S(">")).."]"..
|
||||
--~ Page counter in item selection. @1 = current page, @2 = total pages
|
||||
"label[0,5.1;"..F(S("Page: @1/@2", page, max_page)).."]"
|
||||
end
|
||||
|
||||
@ -239,6 +242,7 @@ local function get_formspec(page, name)
|
||||
"field[2.2,5.75;4,1;search;;"..F(search_text).."]" ..
|
||||
"field_close_on_enter[search;false]" ..
|
||||
"button[6,5.45;1.6,1;search_button_start;"..F(S("Search")).."]" ..
|
||||
--~ Reset search button label in item selection
|
||||
"button[7.6,5.45;0.8,1;search_button_reset;"..F(S("X")).."]" ..
|
||||
"tooltip[search_button_reset;"..F(S("Reset search")).."]" ..
|
||||
pagestr ..
|
||||
|
@ -77,6 +77,7 @@ lzr_gui.update_treasure_status = function(player, treasures, total_treasures)
|
||||
})
|
||||
hud_ids[name].treasures_img = id
|
||||
end
|
||||
--~ Treasure count in HUD. @1 = number of found treasures, @2 number of total treasures in level
|
||||
local treasure_text = S("@1 / @2", treasures, total_treasures)
|
||||
local color = 0xFFFFFFFF
|
||||
if treasures >= total_treasures then
|
||||
|
@ -52,11 +52,13 @@ lzr_infobooks.open_book_page = function(player_name, book_id, page_num)
|
||||
"textarea[7.15,1.3;5.2,5.72;;;"..F(page.text).."]"
|
||||
if page_num > 1 then
|
||||
form = form .. "style[prev_page;sound=lzr_infobooks_turn_page]" ..
|
||||
--~ Previous page button
|
||||
"button[0.65,7.15;1.3,1.04;prev_page;"..FS("<").."]"..
|
||||
"tooltip[prev_page;"..FS("Previous page").."]"
|
||||
end
|
||||
if page_num < max_page then
|
||||
form = form .. "style[next_page;sound=lzr_infobooks_turn_page]" ..
|
||||
--~ Next page button
|
||||
"button[11.05,7.15;1.3,1.04;next_page;"..FS(">").."]"..
|
||||
"tooltip[next_page;"..FS("Next page").."]"
|
||||
end
|
||||
|
@ -366,6 +366,7 @@ for laser2=0, #colortiles do
|
||||
if laser1 == 0 and laser2 > 0 then
|
||||
local def = table.copy(tm_def_on_0X)
|
||||
def._lzr_transmissive_mirror_state = laserid
|
||||
--~ Beam splitter block description with active lasers inside. @1 = a color code uniquely identifying the laser colors
|
||||
def.description = S("Beam Splitter (active, @1)", colstring)
|
||||
-- Apply the laser color
|
||||
def.__tiles_off[1] = colortiles[laser2]
|
||||
@ -561,6 +562,7 @@ for laser2=0, #colortiles do
|
||||
if laser1 == 0 and laser2 > 0 then
|
||||
local def = table.copy(dm_def_on_0X)
|
||||
def._lzr_double_mirror_state = laserid
|
||||
--~ Double mirror block description with active lasers inside. @1 = a color code uniquely identifying the laser colors
|
||||
def.description = S("Double Mirror (active, @1)", colstring)
|
||||
-- Apply the laser color
|
||||
def.__tiles_off[2] = colortiles[laser2]
|
||||
@ -652,6 +654,7 @@ lzr_laser.register_element("lzr_laser:crystal", {
|
||||
local MIXER_ANIM_LEN = 0.8
|
||||
|
||||
lzr_laser.register_element("lzr_laser:mixer", {
|
||||
--~ A block that mixes laser colors
|
||||
description = S("Mixer"),
|
||||
_tt_help = S("Two lasers go in, a laser with their colors combined goes out"),
|
||||
paramtype = "light",
|
||||
|
@ -351,12 +351,15 @@ lzr_laser.register_element = function(basename, def, options)
|
||||
|
||||
if options.allow_take or options.allow_rotate then
|
||||
if options.explicit_inactive_description then
|
||||
--~ Annotation for a block @1. "fixed" means it cannot be picked up or rotated
|
||||
def_core.description = S("@1 (fixed, inactive)", def.description)
|
||||
else
|
||||
--~ Annotation for a block @1. "fixed" means it cannot be picked up or rotated
|
||||
def_core.description = S("@1 (fixed)", def.description)
|
||||
end
|
||||
else
|
||||
if options.explicit_inactive_description then
|
||||
--~ Annotation for a block @1
|
||||
def_core.description = S("@1 (inactive)", def.description)
|
||||
else
|
||||
def_core.description = def.description
|
||||
@ -430,8 +433,10 @@ lzr_laser.register_element = function(basename, def, options)
|
||||
def_core_on.pointable = false
|
||||
end
|
||||
if options.allow_take or options.allow_rotate then
|
||||
--~ Annotation for a block @1. "fixed" it means cannot be picked up or rotated
|
||||
def_core_on.description = S("@1 (fixed, active)", def.description)
|
||||
else
|
||||
--~ Annotation for a block @1
|
||||
def_core_on.description = S("@1 (active)", def.description)
|
||||
end
|
||||
def_core_on._lzr_inactive = real_basename.."_fixed"
|
||||
@ -475,8 +480,10 @@ lzr_laser.register_element = function(basename, def, options)
|
||||
for c=1, lzr_globals.MAX_COLORCODE do
|
||||
local def_core_on_c = table.copy(def_core_on)
|
||||
if options.allow_take or options.allow_rotate then
|
||||
--~ Annotation for a block @1. "fixed" means it cannot be picked up or rotated. @2 is a color code uniquely identifying the active laser color in that block
|
||||
def_core_on_c.description = S("@1 (fixed, active, @2)", def.description, lzr_laser.dirstring_to_colstring(tostring(c)))
|
||||
else
|
||||
--~ Annotation for a block @1. @2 is a color code uniquely identifying the active laser color in that block
|
||||
def_core_on_c.description = S("@1 (active, @2)", def.description, lzr_laser.dirstring_to_colstring(tostring(c)))
|
||||
end
|
||||
for t=1, #def_core_on_c.tiles do
|
||||
@ -512,8 +519,10 @@ lzr_laser.register_element = function(basename, def, options)
|
||||
def_rotatable.overlay_tiles = def_spec.__overlay_tiles_rotatable_off
|
||||
def_rotatable.groups.rotatable = 1
|
||||
if options.explicit_inactive_description then
|
||||
--~ Annotation for a block @1. "soft-fixed" means it cannot be picked up but it CAN be rotated
|
||||
def_rotatable.description = S("@1 (soft-fixed, inactive)", def.description)
|
||||
else
|
||||
--~ Annotation for a block @1. "soft-fixed" means it cannot be picked up but it CAN be rotated
|
||||
def_rotatable.description = S("@1 (soft-fixed)", def.description)
|
||||
end
|
||||
if options.inactive ~= nil then
|
||||
@ -550,6 +559,7 @@ lzr_laser.register_element = function(basename, def, options)
|
||||
def_rotatable_on.inventory_image = nil
|
||||
def_rotatable_on.wield_image = nil
|
||||
end
|
||||
--~ Annotation for a block @1. "soft-fixed" means it cannot be picked up but it CAN be rotated
|
||||
def_rotatable_on.description = S("@1 (soft-fixed, active)", def.description)
|
||||
if not options.keep_state_on_take then
|
||||
def_rotatable_on.drop = real_basename.."_rotatable"
|
||||
@ -568,6 +578,7 @@ lzr_laser.register_element = function(basename, def, options)
|
||||
else
|
||||
for c=1, lzr_globals.MAX_COLORCODE do
|
||||
local def_rotatable_on_c = table.copy(def_rotatable_on)
|
||||
--~ Annotation for a block @1. "soft-fixed" means it cannot be picked up but it CAN be rotated. @2 is a color code uniquely identifying the block's laser color
|
||||
def_rotatable_on_c.description = S("@1 (soft-fixed, active, @2)", def.description, lzr_laser.dirstring_to_colstring(tostring(c)))
|
||||
for t=1, #def_rotatable_on_c.tiles do
|
||||
if def_rotatable_on_c.tiles[t] == lzr_laser.LASER_TILE then
|
||||
@ -604,6 +615,7 @@ lzr_laser.register_element = function(basename, def, options)
|
||||
-- takable nodes are also always rotatable by implication
|
||||
def_takable.groups.rotatable = 1
|
||||
if options.explicit_inactive_description then
|
||||
--~ Annotation for a block @1
|
||||
def_takable.description = S("@1 (inactive)", def.description)
|
||||
else
|
||||
def_takable.description = def.description
|
||||
@ -661,6 +673,7 @@ lzr_laser.register_element = function(basename, def, options)
|
||||
else
|
||||
for c=1, lzr_globals.MAX_COLORCODE do
|
||||
local def_takable_on_c = table.copy(def_takable_on)
|
||||
--~ Annotation for a block @1. @2 is a color core uniquely identifying this block's laser color
|
||||
def_takable_on_c.description = S("@1 (active, @2)", def.description, lzr_laser.dirstring_to_colstring(tostring(c)))
|
||||
for t=1, #def_takable_on_c.tiles do
|
||||
if def_takable_on_c.tiles[t] == lzr_laser.LASER_TILE then
|
||||
|
@ -213,6 +213,7 @@ for color_z=0, lzr_globals.MAX_COLORCODE do
|
||||
if tex then
|
||||
-- Finally register the laser
|
||||
minetest.register_node("lzr_laser:laser_"..dirstring, {
|
||||
--~ Laser block description. @1 = color code uniquely identifying the color(s) of the laser beam(s) in that node
|
||||
description = S("Laser (@1)", lzr_laser.dirstring_to_colstring(dirstring)),
|
||||
paramtype = "light",
|
||||
light_source = lzr_globals.LASER_GLOW,
|
||||
@ -232,6 +233,7 @@ for color_z=0, lzr_globals.MAX_COLORCODE do
|
||||
if axes == 1 then
|
||||
-- Combination node: Barrier + laser
|
||||
minetest.register_node("lzr_laser:barrier_laser_"..dirstring, {
|
||||
--~ Description of a block that is both laser and invisible barrier. @1 = color code uniquely identifying the color(s) of the laser beam(s) in that node
|
||||
description = S("Barrier Laser (@1)", lzr_laser.dirstring_to_colstring(dirstring)),
|
||||
paramtype = "light",
|
||||
light_source = lzr_globals.LASER_GLOW,
|
||||
@ -259,6 +261,7 @@ for color_z=0, lzr_globals.MAX_COLORCODE do
|
||||
|
||||
-- Combination node: Rain Membrane + laser
|
||||
minetest.register_node("lzr_laser:rain_membrane_laser_"..dirstring, {
|
||||
--~ Description of a block that is both laser and invisible barrier that lets rain through but not the player. @1 = color code uniquely identifying the color(s) of the laser beam(s) in that node
|
||||
description = S("Rain Membrane Laser (@1)", lzr_laser.dirstring_to_colstring(dirstring)),
|
||||
paramtype = "light",
|
||||
light_source = lzr_globals.LASER_GLOW,
|
||||
|
@ -231,6 +231,7 @@ local trigger_tool_modeinfo = {
|
||||
local function construct_trigger_tool_description(mode)
|
||||
local MODE_COLOR = "#fff020"
|
||||
local HELP_COLOR = "#ffd0d0"
|
||||
--~ Tool in level editor to change triggers
|
||||
return S("Trigger Tool").."\n"..
|
||||
minetest.colorize(MODE_COLOR, trigger_tool_modeinfo[mode].name).."\n"..
|
||||
minetest.colorize(HELP_COLOR, trigger_tool_modeinfo[mode].description).."\n"..
|
||||
@ -355,6 +356,7 @@ minetest.register_tool("lzr_laser:trigger_tool", {
|
||||
signal_type = 0
|
||||
end
|
||||
lzr_triggers.set_trigger_signal_type(trigger_id, signal_type)
|
||||
--~ @1: short signal type name, @2: long signal type description
|
||||
local signal_description = S("@1 (@2)", lzr_triggers.SIGNAL_TYPE_NAMES[signal_type], lzr_triggers.SIGNAL_TYPE_DESCRIPTIONS[signal_type])
|
||||
if not signal_description then
|
||||
signal_description = tostring(signal_type)
|
||||
@ -379,6 +381,7 @@ minetest.register_tool("lzr_laser:trigger_tool", {
|
||||
receiver_type = 0
|
||||
end
|
||||
lzr_triggers.set_trigger_receiver_type(trigger_id, receiver_type)
|
||||
--~ @1: short receiver type name, @2: long receiver type description
|
||||
local receiver_type_description = S("@1 (@2)", lzr_triggers.RECEIVER_TYPE_NAMES[receiver_type], lzr_triggers.RECEIVER_TYPE_DESCRIPTIONS[receiver_type])
|
||||
if not receiver_type_description then
|
||||
receiver_type_description = tostring(receiver_type)
|
||||
@ -395,6 +398,7 @@ minetest.register_tool("lzr_laser:trigger_tool", {
|
||||
lzr_triggers.set_signals(trigger_id, {})
|
||||
lzr_triggers.set_trigger_signal_type(trigger_id, 0)
|
||||
lzr_triggers.set_trigger_receiver_type(trigger_id, 0)
|
||||
--~ Node was reset at @1.
|
||||
minetest.chat_send_player(uname, S("Reset node at @1.", minetest.pos_to_string(pos)))
|
||||
elseif mode == TRIGGER_MODE_INFO then
|
||||
local meta = minetest.get_meta(pos)
|
||||
@ -413,6 +417,7 @@ minetest.register_tool("lzr_laser:trigger_tool", {
|
||||
for s=1, #send_to do
|
||||
table.insert(send_to_concat, send_to[s])
|
||||
end
|
||||
--~ list separator
|
||||
send_to_str = table.concat(send_to_concat, S(", "))
|
||||
end
|
||||
end
|
||||
@ -453,6 +458,7 @@ minetest.register_tool("lzr_laser:trigger_tool", {
|
||||
imeta:set_string("inventory_image", trigger_tool_modeinfo[mode].img)
|
||||
local modename = trigger_tool_modeinfo[mode].name
|
||||
local uname = user:get_player_name()
|
||||
--~ Trigger tool was set to the new mode @1
|
||||
minetest.chat_send_player(uname, S("Tool set to @1!", modename))
|
||||
return itemstack
|
||||
end,
|
||||
|
@ -136,6 +136,7 @@ local load_custom_level = function(level, player)
|
||||
else
|
||||
reason = error_detail
|
||||
end
|
||||
--~ Reason shown on level loading error
|
||||
error_append = "\n\n" .. S("Reason: @1", reason)
|
||||
end
|
||||
local form = message_form(player, S("This level is unplayable.")..error_append)
|
||||
|
@ -1287,6 +1287,7 @@ function lzr_levels.get_level_name(level, level_data, with_fallback)
|
||||
if with_fallback then
|
||||
local fname = level_data[level].filename
|
||||
fname = string.sub(fname, 1, -5)
|
||||
--~ Fallback name for untitled levels. @1 = technical level name based on file name
|
||||
return S("Untitled (@1)", fname)
|
||||
else
|
||||
return ""
|
||||
@ -1572,12 +1573,17 @@ minetest.register_chatcommand("level_info", {
|
||||
|
||||
out = out .. S("• File name: @1", minetest.colorize(VALUE_COLOR, fname))
|
||||
if current_level_data == core_level_data then
|
||||
out = out .. "\n" .. S("• Level type: @1", minetest.colorize(VALUE_COLOR, S("core")))
|
||||
--~ Level type can be "core" or "custom"
|
||||
out = out .. "\n" .. S("• Level type: @1", minetest.colorize(VALUE_COLOR,
|
||||
--~ A level type (core levels)
|
||||
S("core")))
|
||||
if minetest.settings:get_bool("lzr_debug", false) then
|
||||
out = out .. "\n" .. S("• Level number: @1", minetest.colorize(VALUE_COLOR, current_level))
|
||||
end
|
||||
else
|
||||
out = out .. "\n" .. S("• Level type: @1", minetest.colorize(VALUE_COLOR, S("custom")))
|
||||
out = out .. "\n" .. S("• Level type: @1", minetest.colorize(VALUE_COLOR,
|
||||
--~ A level type (custom levels)
|
||||
S("custom")))
|
||||
end
|
||||
return true, out
|
||||
end
|
||||
|
@ -156,6 +156,7 @@ end
|
||||
|
||||
-- A node that starts level selection
|
||||
minetest.register_node("lzr_menu:level_starter", {
|
||||
--~ A node that starts level selection
|
||||
description = S("Level Starter"),
|
||||
-- symbolized by a map
|
||||
tiles = { "lzr_menu_map.png", "blank.png" },
|
||||
@ -182,6 +183,7 @@ minetest.register_node("lzr_menu:level_starter", {
|
||||
|
||||
-- A node that starts custom level selection
|
||||
minetest.register_node("lzr_menu:custom_level_starter", {
|
||||
--~ A node that starts custom level selection
|
||||
description = S("Custom Level Starter"),
|
||||
-- symbolized by a map
|
||||
tiles = { "lzr_menu_map_custom.png", "blank.png" },
|
||||
@ -429,8 +431,10 @@ local open_color_picker = function(player, colorname)
|
||||
local function gm(index)
|
||||
local txt
|
||||
if COLOR_PICKER_MODIFIERS[index] < 0 then
|
||||
--~ Subtract color value in custom laser color menu
|
||||
return FS("−@1", math.abs(COLOR_PICKER_MODIFIERS[index]))
|
||||
else
|
||||
--~ Add color value in custom laser color menu
|
||||
return FS("+@1", COLOR_PICKER_MODIFIERS[index])
|
||||
end
|
||||
end
|
||||
@ -438,6 +442,7 @@ local open_color_picker = function(player, colorname)
|
||||
"button[2,"..y..";0.7,0.5;channel_"..id.."_mmm;"..gm(1).."]" ..
|
||||
"button[2.7,"..y..";0.7,0.5;channel_"..id.."_mm;"..gm(2).."]"..
|
||||
"button[3.4,"..y..";0.7,0.5;channel_"..id.."_m;"..gm(3).."]"..
|
||||
--~ Color value number in custom laser color menu. @1 current value, @2 maximum possible value
|
||||
"label[4.4,"..(y+0.3)..";"..FS("@1/@2", defval, 255).."]"..
|
||||
"button[5.6,"..y..";0.7,0.5;channel_"..id.."_p;"..gm(4).."]"..
|
||||
"button[6.3,"..y..";0.7,0.5;channel_"..id.."_pp;"..gm(5).."]"..
|
||||
|
@ -9,6 +9,7 @@ lzr_parrot_npc = {}
|
||||
-- TODO: These strings are to be used when the parrot model arrives
|
||||
local SPEAKER_NAME = NS("Goldie the Parrot")
|
||||
local SPEAKER_NAME_SHORT = NS("Goldie")
|
||||
--~ @1 is a parrot name
|
||||
local SAYS = NS("@1 says:")
|
||||
|
||||
-- TODO: This name shall be removed when the parrot model arrives
|
||||
|
@ -202,6 +202,7 @@ end)
|
||||
|
||||
|
||||
register_sky("bright_blue", {
|
||||
--~ Sky name
|
||||
description = S("Bright Blue"),
|
||||
sky = {
|
||||
type = "regular",
|
||||
@ -227,6 +228,7 @@ register_sky("bright_blue", {
|
||||
timeofday_end= TIMEOFDAY_DAY_END,
|
||||
})
|
||||
register_sky("tropical_dawn", {
|
||||
--~ Sky name
|
||||
description = S("Tropical Dawn"),
|
||||
sky = {
|
||||
type = "regular",
|
||||
@ -253,6 +255,7 @@ register_sky("tropical_dawn", {
|
||||
timeofday_end = TIMEOFDAY_DAY_END,
|
||||
})
|
||||
register_sky("ocean_evening", {
|
||||
--~ Sky name
|
||||
description = S("Ocean Evening"),
|
||||
sky = {
|
||||
type = "regular",
|
||||
@ -283,6 +286,7 @@ register_sky("ocean_evening", {
|
||||
timeofday_end = TIMEOFDAY_DAY_END,
|
||||
})
|
||||
register_sky("ocean_morning", {
|
||||
--~ Sky name
|
||||
description = S("Ocean Morning"),
|
||||
sky = {
|
||||
type = "regular",
|
||||
@ -309,6 +313,7 @@ register_sky("ocean_morning", {
|
||||
timeofday_end = TIMEOFDAY_DAY_END,
|
||||
})
|
||||
register_sky("ominous_fog", {
|
||||
--~ Sky name
|
||||
description = S("Ominous Fog"),
|
||||
sky = {
|
||||
type = "regular",
|
||||
@ -331,6 +336,7 @@ register_sky("ominous_fog", {
|
||||
timeofday_end = TIMEOFDAY_DAY_END,
|
||||
})
|
||||
register_sky("storm_clouds", {
|
||||
--~ Sky name
|
||||
description = S("Stormy Clouds"),
|
||||
sky = {
|
||||
type = "regular",
|
||||
@ -360,6 +366,7 @@ register_sky("storm_clouds", {
|
||||
day_night_ratio = 0.7,
|
||||
})
|
||||
register_sky("starry_night", {
|
||||
--~ Sky name
|
||||
description = S("Starry Night"),
|
||||
sky = {
|
||||
type = "regular",
|
||||
@ -395,6 +402,7 @@ register_sky("starry_night", {
|
||||
-- Most importantly, volumetric light is disabled, which is most
|
||||
-- computationally heavy.
|
||||
register_sky("underground", {
|
||||
--~ Sky name of a special sky for underground levels
|
||||
description = S("Underground"),
|
||||
sky = {
|
||||
type = "plain",
|
||||
@ -418,8 +426,10 @@ minetest.register_on_chatcommand(function(name, command, params)
|
||||
if command == "time" and params ~= "" then
|
||||
local state = lzr_gamestate.get_state()
|
||||
if lzr_gamestate.get_state() == lzr_gamestate.EDITOR then
|
||||
--~ Message shown when trying to use "/time" command in editor
|
||||
minetest.chat_send_player(name, minetest.colorize("#ff8000", S("You can’t use this command to set the time in this game. Try a different sky in the level settings.")))
|
||||
else
|
||||
--~ Message shown when trying to use "/time" command
|
||||
minetest.chat_send_player(name, minetest.colorize("#ff8000", S("You can’t use this command to set the time in this game.")))
|
||||
end
|
||||
return true
|
||||
|
@ -252,6 +252,7 @@ function lzr_stairs.register_slab(subname, recipeitem, groups, images, descripti
|
||||
)
|
||||
|
||||
local def_top = table.copy(def_bottom)
|
||||
--~ Block description for a top slab. @1 = original slab description
|
||||
def_top.description = S("@1 (top)", description)
|
||||
def_top.__mesh_off = "lzr_stairs_slab_top_laser.obj"
|
||||
def_top.__mesh_on = "lzr_stairs_slab_top_laser.obj"
|
||||
|
@ -11,7 +11,9 @@ minetest.register_node("lzr_teleporter:teleporter_off", {
|
||||
description = S("Teleporter"),
|
||||
paramtype2 = "4dir",
|
||||
_tt_help = S("Player start point of the level").."\n"..
|
||||
--~ The "teleporter" block (=start block of a level) has a white dot at one of the sides, marking the initial player look direction
|
||||
S("Player will face towards the white dot").."\n"..
|
||||
--~ Only one teleporter block allowed per level
|
||||
S("(only one per level allowed)"),
|
||||
tiles = {
|
||||
{ name = "lzr_teleporter_off_top.png", align_style = "world" },
|
||||
|
@ -9,6 +9,7 @@ lzr_tools = {}
|
||||
|
||||
-- Digs (almost) any block
|
||||
minetest.register_tool("lzr_tools:ultra_pickaxe", {
|
||||
--~ Tool that digs blocks
|
||||
description = S("Ultra Pickaxe"),
|
||||
_tt_help = S("Removes blocks except liquids"),
|
||||
inventory_image = "lzr_tools_ultra_pickaxe.png",
|
||||
@ -41,6 +42,7 @@ minetest.register_tool("lzr_tools:ultra_pickaxe", {
|
||||
|
||||
-- Digs liquids
|
||||
minetest.register_tool("lzr_tools:ultra_bucket", {
|
||||
--~ Tool that digs liquids
|
||||
description = S("Ultra Bucket"),
|
||||
_tt_help = S("Removes liquids"),
|
||||
inventory_image = "lzr_tools_ultra_bucket.png",
|
||||
@ -62,6 +64,7 @@ if minetest.settings:get_bool("lzr_debug", false) then
|
||||
-- This tool digs lasers. Usually this is only useful when lasers
|
||||
-- are frozen because otherwise they instantly regenerate.
|
||||
minetest.register_tool("lzr_tools:laser_absorber", {
|
||||
--~ Hidden tool that digs lasers
|
||||
description = S("Laser Absorber"),
|
||||
_tt_help = S("Removes lasers"),
|
||||
inventory_image = "lzr_tools_laser_absorber.png",
|
||||
@ -123,6 +126,7 @@ if minetest.settings:get_bool("lzr_debug", false) then
|
||||
-- Debug tool to test the laser travel algorithm.
|
||||
-- Simulates the laser travelling up to a certain maximum number of iterations.
|
||||
minetest.register_tool("lzr_tools:laser_stepper", {
|
||||
--~ Hidden debug tool to test the laser travel algorithm.
|
||||
description = S("Laser Stepper"),
|
||||
_tt_help = S("Simulates the laser travel algorithm up to a given number of iterations").."\n"..
|
||||
S("Punch: Increase laser iterations by 1").."\n"..
|
||||
|
@ -372,10 +372,15 @@ local register_chest = function(id, def)
|
||||
end
|
||||
|
||||
register_chest("wood", {
|
||||
--~ Block description
|
||||
description_unlocked = S("Wooden Chest"),
|
||||
--~ Block description
|
||||
description_locked = S("Locked Wooden Chest"),
|
||||
--~ Block description
|
||||
description_open = S("Open Wooden Chest"),
|
||||
--~ Block description
|
||||
description_open_laser = S("Open Wooden Chest with Laser"),
|
||||
--~ Block description. @1 = a treasure
|
||||
description_open_with = NS("Open Wooden Chest with @1"),
|
||||
tile_top = "lzr_treasure_chest_top.png",
|
||||
tile_bottom = "lzr_treasure_chest_top.png",
|
||||
@ -386,10 +391,15 @@ register_chest("wood", {
|
||||
})
|
||||
|
||||
register_chest("dark", {
|
||||
--~ Block description
|
||||
description_unlocked = S("Dark Chest"),
|
||||
--~ Block description
|
||||
description_locked = S("Locked Dark Chest"),
|
||||
--~ Block description
|
||||
description_open = S("Open Dark Chest"),
|
||||
--~ Block description
|
||||
description_open_laser = S("Open Dark Chest with Laser"),
|
||||
--~ Block description. @1 = a treasure
|
||||
description_open_with = NS("Open Dark Chest with @1"),
|
||||
tile_top = "lzr_treasure_dark_chest_top.png",
|
||||
tile_bottom = "lzr_treasure_dark_chest_top.png",
|
||||
|
@ -160,7 +160,25 @@ local show_trigger_dialog = function(player, selected_trigger)
|
||||
-- Header
|
||||
-- Note: The leading "#" character for "#Recv." and "#Send." cannot be put directly into the string
|
||||
-- because the *.TR file format doesn't support strings starting with "#".
|
||||
triggers_str = COLOR_CAPTION..","..IMAGE_ID_BLANK..","..FS("ID")..","..FS("Location")..","..FS("Node")..","..FS("@1Recv.", "#")..","..FS("@1Send.", "#")..","..SIGNAL_TYPE_IMAGE_ID_BLANK..","..FS("Sig. type")..","..RECEIVER_TYPE_IMAGE_ID_BLANK..","..FS("Recv. type")..","..triggers_str
|
||||
triggers_str = COLOR_CAPTION..","..
|
||||
IMAGE_ID_BLANK..","..
|
||||
--~ Trigger list header: Trigger identifier
|
||||
FS("ID")..","..
|
||||
--~ Trigger list header: Trigger location
|
||||
FS("Location")..","..
|
||||
--~ Trigger list header: Trigger node
|
||||
FS("Node")..","..
|
||||
--~ Trigger list header: Number of receivers
|
||||
FS("@1Recv.", "#")..","..
|
||||
--~ Trigger list header: Number of senders
|
||||
FS("@1Send.", "#")..","..
|
||||
SIGNAL_TYPE_IMAGE_ID_BLANK..","..
|
||||
--~ Trigger list header: Signal type
|
||||
FS("Sig. type")..","..
|
||||
RECEIVER_TYPE_IMAGE_ID_BLANK..","..
|
||||
--~ Trigger list header: Receiver type
|
||||
FS("Recv. type")..","..
|
||||
triggers_str
|
||||
|
||||
local C_HEAD = "#FFFF00"
|
||||
local C_DEF = "#FFFFA0"
|
||||
@ -217,7 +235,12 @@ local show_trigger_dialog = function(player, selected_trigger)
|
||||
local info_str = ""
|
||||
if #senders > 0 or #receivers > 0 then
|
||||
last_signal_list = { false }
|
||||
info_str = COLOR_CAPTION..","..IMAGE_ID_BLANK..","..FS("Type")..","..FS("ID")..","
|
||||
info_str = COLOR_CAPTION..","..
|
||||
IMAGE_ID_BLANK..","..
|
||||
--~ Trigger list header: Trigger type
|
||||
FS("Type")..","..
|
||||
--~ Trigger list header: Trigger identifier
|
||||
FS("ID")..","
|
||||
for r=1, #receivers do
|
||||
info_str = info_str .. COLOR_RECEIVER..","..IMAGE_ID_RECEIVER..","..FS("Receiver")..","..F(receivers[r])
|
||||
if r < #receivers or #senders > 0 then
|
||||
@ -234,6 +257,7 @@ local show_trigger_dialog = function(player, selected_trigger)
|
||||
end
|
||||
else
|
||||
last_signal_list = {}
|
||||
--~ Shown when there are no triggers in a trigger list
|
||||
info_str = COLOR_CAPTION..","..IMAGE_ID_BLANK..","..FS("None")..","
|
||||
end
|
||||
|
||||
|
@ -115,46 +115,79 @@ lzr_triggers.SIGNAL_TYPE_ICONS = {
|
||||
}
|
||||
-- Very short forms of the signal type names
|
||||
lzr_triggers.SIGNAL_TYPE_NAMES_SHORT = {
|
||||
--~ Short signal type name: Activate OFF
|
||||
[lzr_triggers.SIGNAL_TYPE_ACTIVATE_OFF] = SA("A.OFF"),
|
||||
--~ Short signal type name: Activate ON
|
||||
[lzr_triggers.SIGNAL_TYPE_ACTIVATE_ON] = SA("A.ON"),
|
||||
--~ Short signal type name: Activate TOGGLE
|
||||
[lzr_triggers.SIGNAL_TYPE_ACTIVATE_TOGGLE] = SA("A.TOG"),
|
||||
--~ Short signal type name: Deactivate OFF
|
||||
[lzr_triggers.SIGNAL_TYPE_DEACTIVATE_OFF] = SA("D.OFF"),
|
||||
--~ Short signal type name: Deactivate ON
|
||||
[lzr_triggers.SIGNAL_TYPE_DEACTIVATE_ON] = SA("D.ON"),
|
||||
--~ Short signal type name: Deactivate TOGGLE
|
||||
[lzr_triggers.SIGNAL_TYPE_DEACTIVATE_TOGGLE] = SA("D.TOG"),
|
||||
--~ Short signal type name: Synchronized
|
||||
[lzr_triggers.SIGNAL_TYPE_SYNC] = SA("Sync"),
|
||||
--~ Short signal type name: Synchronized inverted
|
||||
[lzr_triggers.SIGNAL_TYPE_SYNC_INV] = SA("Sync inv"),
|
||||
--~ Short signal type name: Toggle
|
||||
[lzr_triggers.SIGNAL_TYPE_TOGGLE] = SA("T."),
|
||||
--~ Short signal type name: Toggle OFF
|
||||
[lzr_triggers.SIGNAL_TYPE_TOGGLE_OFF] = SA("T.OFF"),
|
||||
--~ Short signal type name: Toggle ON
|
||||
[lzr_triggers.SIGNAL_TYPE_TOGGLE_ON] = SA("T.ON"),
|
||||
}
|
||||
|
||||
-- Long form of the signal type names
|
||||
lzr_triggers.SIGNAL_TYPE_NAMES = {
|
||||
--~ Signal type name
|
||||
[lzr_triggers.SIGNAL_TYPE_ACTIVATE_OFF] = S("Activate OFF"),
|
||||
--~ Signal type name
|
||||
[lzr_triggers.SIGNAL_TYPE_ACTIVATE_ON] = S("Activate ON"),
|
||||
--~ Signal type name
|
||||
[lzr_triggers.SIGNAL_TYPE_ACTIVATE_TOGGLE] = S("Activate TOGGLE"),
|
||||
--~ Signal type name
|
||||
[lzr_triggers.SIGNAL_TYPE_DEACTIVATE_OFF] = S("Deactivate OFF"),
|
||||
--~ Signal type name
|
||||
[lzr_triggers.SIGNAL_TYPE_DEACTIVATE_ON] = S("Deactivate ON"),
|
||||
--~ Signal type name
|
||||
[lzr_triggers.SIGNAL_TYPE_DEACTIVATE_TOGGLE] = S("Deactivate TOGGLE"),
|
||||
--~ Signal type name
|
||||
[lzr_triggers.SIGNAL_TYPE_SYNC] = S("Synchronous"),
|
||||
--~ Signal type name
|
||||
[lzr_triggers.SIGNAL_TYPE_SYNC_INV] = S("Synchronous inverted"),
|
||||
--~ Signal type name
|
||||
[lzr_triggers.SIGNAL_TYPE_TOGGLE] = S("Toggle"),
|
||||
--~ Signal type name
|
||||
[lzr_triggers.SIGNAL_TYPE_TOGGLE_OFF] = S("Toggle OFF"),
|
||||
--~ Signal type name
|
||||
[lzr_triggers.SIGNAL_TYPE_TOGGLE_ON] = S("Toggle ON"),
|
||||
}
|
||||
|
||||
-- Descriptions of signal types
|
||||
lzr_triggers.SIGNAL_TYPE_DESCRIPTIONS = {
|
||||
--~ Signal type description for signal type 'Synchronous'
|
||||
[lzr_triggers.SIGNAL_TYPE_SYNC] = S("send ON signal when activated, send OFF signal when deactivated"),
|
||||
--~ Signal type description for signal type 'Synchronous inverted'
|
||||
[lzr_triggers.SIGNAL_TYPE_SYNC_INV] = S("send OFF signal when activated, send ON signal when deactivated"),
|
||||
--~ Signal type description for signal type 'Toggle'
|
||||
[lzr_triggers.SIGNAL_TYPE_TOGGLE] = S("send TOGGLE signal when toggled"),
|
||||
--~ Signal type description for signal type 'Toggle ON'
|
||||
[lzr_triggers.SIGNAL_TYPE_TOGGLE_ON] = S("send ON signal when toggled"),
|
||||
--~ Signal type description for signal type 'Toggle OFF'
|
||||
[lzr_triggers.SIGNAL_TYPE_TOGGLE_OFF] = S("send OFF signal when toggled"),
|
||||
--~ Signal type description for signal type 'Activate ON'
|
||||
[lzr_triggers.SIGNAL_TYPE_ACTIVATE_ON] = S("send ON signal when activated"),
|
||||
--~ Signal type description for signal type 'Activate TOGGLE'
|
||||
[lzr_triggers.SIGNAL_TYPE_ACTIVATE_TOGGLE] = S("send TOGGLE signal when activated"),
|
||||
--~ Signal type description for signal type 'Activate OFF'
|
||||
[lzr_triggers.SIGNAL_TYPE_ACTIVATE_OFF] = S("send OFF signal when activated"),
|
||||
--~ Signal type description for signal type 'Deactivate ON'
|
||||
[lzr_triggers.SIGNAL_TYPE_DEACTIVATE_ON] = S("send ON signal when deactivated"),
|
||||
--~ Signal type description for signal type 'Deactivate TOGGLE'
|
||||
[lzr_triggers.SIGNAL_TYPE_DEACTIVATE_TOGGLE] = S("send TOGGLE signal when deactivated"),
|
||||
--~ Signal type description for signal type 'Deactivate OFF'
|
||||
[lzr_triggers.SIGNAL_TYPE_DEACTIVATE_OFF] = S("send OFF signal when deactivated"),
|
||||
}
|
||||
|
||||
@ -202,17 +235,23 @@ lzr_triggers.RECEIVER_TYPE_ICONS = {
|
||||
}
|
||||
-- Very short forms of the receiver type names
|
||||
lzr_triggers.RECEIVER_TYPE_NAMES_SHORT = {
|
||||
--~ Short receiver type name: Any
|
||||
[lzr_triggers.RECEIVER_TYPE_ANY] = SA("Any"),
|
||||
--~ Short receiver type name: Synchronized AND
|
||||
[lzr_triggers.RECEIVER_TYPE_SYNC_AND] = SA("S.AND"),
|
||||
}
|
||||
-- Long form of the receiver type names
|
||||
lzr_triggers.RECEIVER_TYPE_NAMES = {
|
||||
--~ Receiver type name
|
||||
[lzr_triggers.RECEIVER_TYPE_ANY] = S("Any"),
|
||||
--~ Receiver type name
|
||||
[lzr_triggers.RECEIVER_TYPE_SYNC_AND] = S("Synchronous AND"),
|
||||
}
|
||||
-- Descriptions of receiver types
|
||||
lzr_triggers.RECEIVER_TYPE_DESCRIPTIONS = {
|
||||
--~ Receiver type description for type 'Any'
|
||||
[lzr_triggers.RECEIVER_TYPE_ANY] = S("react to any signal"),
|
||||
--~ Receiver type description for type 'Synchronous AND'
|
||||
[lzr_triggers.RECEIVER_TYPE_SYNC_AND] = S("activates when receiving a signal and all its synchronous senders are active and all its inverted synchronous senders are inactive; deactivates when receiving a signal when that’s not the case"),
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user