Add 'level complete' state and new sounds

master
Wuzzy 2022-01-09 15:21:47 +01:00
parent 43b6298166
commit 68341954fc
10 changed files with 68 additions and 6 deletions

View File

@ -49,6 +49,16 @@ Sounds:
- License: CC BY 3.0
- Origin: <https://freesound.org/people/youandbiscuitme/sounds/258244/>
- Changes were made
- `lzr_laser_emitter_activate.ogg`:
- by PhonosUPF <https://freesound.org/people/PhonosUPF/sounds/501976/>
- License: CC0
- `lzr_levels_level_start.ogg`:
- by original\_sound <https://freesound.org/people/original_sound/sounds/372209/>
- License: CC BY 3.0
- `lzr_levels_level_complete.ogg`:
- by Fupicat <https://freesound.org/people/Fupicat/sounds/521641/>
- Edit by Wuzzy (higher pitch)
- License: CC0
- All other sounds come from Minetest Game (see license of Minetest Game 5.4.1 for details)
Code:

View File

@ -3,6 +3,7 @@ minetest.override_item("", {
tool_capabilities = {
max_drop_level = 0,
groupcaps = {
takable = { times = { [1] = 0, [2] = 0, [3] = 0 } },
},
}
})

View File

@ -97,7 +97,7 @@ local full_update = function()
lzr_laser.full_laser_update(lzr_globals.PLAYFIELD_START, lzr_globals.PLAYFIELD_END)
local done = lzr_laser.check_level_won()
if done then
lzr_levels.next_level()
lzr_levels.level_complete()
end
end
@ -109,7 +109,7 @@ local full_update_detector_placed = function()
lzr_laser.full_laser_update(lzr_globals.PLAYFIELD_START, lzr_globals.PLAYFIELD_END)
local done = lzr_laser.check_level_won(true)
if done then
lzr_levels.next_level()
lzr_levels.level_complete()
end
end
@ -133,7 +133,28 @@ local register_element = function(subname, def, options)
end
def_core.groups.breakable = 1
def_core.groups[subname] = 1
def_core.can_dig = function()
return lzr_gamestate.get_state() ~= lzr_gamestate.LEVEL_COMPLETE
end
def_core.on_place = function(itemstack, placer, pointed_thing)
if lzr_gamestate.get_state() == lzr_gamestate.LEVEL_COMPLETE then
-- Prevent node placement when in 'level complete' state
return itemstack
else
-- node's on_rightclick action takes precedence
if pointed_thing.type == "node" and placer then
local node = minetest.get_node(pointed_thing.under)
local def = minetest.registered_nodes[node.name]
local sneak = placer:get_player_control().sneak
if def and def.on_rightclick and not sneak then
def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing)
return itemstack
end
end
-- Default node placement behavior
return minetest.item_place_node(itemstack, placer, pointed_thing)
end
end
local def_core_on = table.copy(def_core)
def_core_on.description = S("@1 (active)", def.description)
def_core_on._lzr_active = nil
@ -151,13 +172,11 @@ local register_element = function(subname, def, options)
local def_takable = table.copy(def_core)
def_takable.tiles = def.tiles_takable_off
def_takable.groups.takable = 1
def_takable.groups.dig_immediate = 3
def_takable.description = S("@1 (takable)", def.description)
def_takable._lzr_active = "lzr_laser:"..subname.."_takable_on"
local def_takable_on = table.copy(def_core_on)
def_takable_on.tiles = def.tiles_takable_on
def_takable_on.groups.takable = 1
def_takable_on.groups.dig_immediate = 3
def_takable_on.description = S("@1 (takable, active)", def.description)
def_takable_on.drop = "lzr_laser:"..subname.."_takable"
def_takable_on._lzr_inactive = "lzr_laser:"..subname.."_takable"
@ -311,16 +330,27 @@ register_element("emitter", {
},
on_rightclick = function(pos, node)
if lzr_gamestate.get_state() == lzr_gamestate.LEVEL_COMPLETE then
return
end
local nname
local on = false
if node.name == "lzr_laser:emitter" then
nname = "lzr_laser:emitter_on"
on = true
elseif node.name == "lzr_laser:emitter_on" then
nname = "lzr_laser:emitter"
elseif node.name == "lzr_laser:emitter_takable" then
nname = "lzr_laser:emitter_takable_on"
on = true
elseif node.name == "lzr_laser:emitter_takable_on" then
nname = "lzr_laser:emitter_takable"
end
if on then
minetest.sound_play({name="lzr_laser_emitter_activate", gain=1.0}, {pos=pos}, true)
else
minetest.sound_play({name="lzr_laser_emitter_activate", gain=0.8}, {pos=pos, pitch=0.7}, true)
end
minetest.swap_node(pos, {name=nname, param2=node.param2})
full_update()
end,

Binary file not shown.

View File

@ -92,6 +92,22 @@ function lzr_levels.start_level(level)
lzr_levels.prepare_and_build_level(level)
lzr_messages.show_message(player, S("Level @1", level), 3)
lzr_gamestate.set_state(lzr_gamestate.LEVEL)
minetest.sound_play({name = "lzr_levels_level_enter", gain = 1}, {to_player=player:get_player_name()}, true)
end
function lzr_levels.level_complete()
if lzr_gamestate.get_state() == lzr_gamestate.LEVEL_COMPLETE then
return false
end
local player = get_singleplayer()
lzr_messages.show_message(player, S("Level @1 complete!", current_level), 3)
minetest.sound_play({name = "lzr_levels_level_complete", gain = 1}, {to_player=player:get_player_name()}, true)
lzr_gamestate.set_state(lzr_gamestate.LEVEL_COMPLETE)
minetest.after(3, function()
if lzr_gamestate.get_state() == lzr_gamestate.LEVEL_COMPLETE then
lzr_levels.next_level()
end
end)
end
function lzr_levels.next_level()

Binary file not shown.

Binary file not shown.

View File

@ -17,6 +17,7 @@ minetest.register_tool("lzr_tools:ultra_pickaxe", {
crumbly = instadig,
oddly_breakable_by_hand = instadig,
dig_immediate = instadig,
takable = instadig,
breakable = instadig,
},
},

View File

@ -138,6 +138,9 @@ end
-- 1: on_use parameters -> axis/amount/etc.
-- 2: param2/axis/amount/etc. -> new param2
function screwdriver.use(itemstack, player, pointed_thing, is_right_click)
if lzr_gamestate.get_state() == lzr_gamestate.LEVEL_COMPLETE then
return
end
if pointed_thing.type ~= "node" then return end
local pos = pointed_thing.under

View File

@ -1,3 +1,4 @@
name = screwdriver2
description = A more intuitive node rotation tool.
optional_depends = screwdriver, worldedit_commands, default
depends = lzr_gamestate
optional_depends = screwdriver, worldedit_commands, default