Compare commits

..

4 commits
v1 ... master

Author SHA1 Message Date
a7ed39131c Fix another crash. 2025-12-01 19:07:49 -05:00
c54579e426 Fix crash when rejoining as Vix. 2025-12-01 11:27:38 -05:00
85817a33b8 Fix a bug with state restoration. 2025-11-30 11:08:25 -05:00
9096c33a48 Add the rest of the game. 2025-11-29 17:45:59 -05:00
9 changed files with 44 additions and 31 deletions

View file

@ -60,7 +60,7 @@ function artifact.play_sound(def)
--def.gain = nil --def.gain = nil
if def.pos then if def.pos then
for _, m in pairs(artifact.players) do for _, m in pairs(artifact.players) do
local dist = m.pos:distance(def.pos) local dist = vector.distance(m.pos, def.pos)
if dist <= (def.range or 32) and m.name ~= def.exclude_player and not (def.to_player and m.name ~= def.to_player) then if dist <= (def.range or 32) and m.name ~= def.exclude_player and not (def.to_player and m.name ~= def.to_player) then
def.to_player = m.name def.to_player = m.name
def.gain = (def.gain or 1) *(1 -math.sqrt(dist /(def.range or 32))) def.gain = (def.gain or 1) *(1 -math.sqrt(dist /(def.range or 32)))

View file

@ -34,7 +34,9 @@ function ns.apply_vix(m)
m.eye_height = 1.5 m.eye_height = 1.5
-- Switch hand appearance. -- Switch hand appearance.
m.inv:set_stack("main", 1, ItemStack("input_"..m.character)) m.inv:set_stack("main", 1, ItemStack("input_"..m.character))
m.object:hud_change(m.healthbar, "text", "artifact_heart_vix.png") if m.healthbar then
m.object:hud_change(m.healthbar, "text", "artifact_heart_vix.png")
end
if m.blackrod then if m.blackrod then
m.blackrod:remove() m.blackrod:remove()
m.blackrod = nil m.blackrod = nil

View file

@ -10,7 +10,8 @@ Player = setmetatable({
local m = setmetatable({ local m = setmetatable({
object = p, object = p,
pitch = 0, pitch = 0,
yaw = 0 yaw = 0,
pos = p:get_pos()
}, {__index = Player}) }, {__index = Player})
m.name = p:get_player_name() m.name = p:get_player_name()

View file

@ -64,6 +64,9 @@ minetest.register_entity(":artifact:vix_scene", {
end, end,
on_deactivate = function(e) on_deactivate = function(e)
vix_scene = nil vix_scene = nil
if e.particles then
minetest.delete_particlespawner(e.particles)
end
end, end,
on_step = function(e) on_step = function(e)
if e._can_check then if e._can_check then
@ -92,6 +95,34 @@ minetest.register_entity(":artifact:vix_scene", {
end end
}) })
local help
local function pre_vix_on_whacked(type, target)
local checkpoint = db:get("checkpoint:pre_vix")
if checkpoint == "begin" then -- We're still in the start closet.
if type == "object" then
help:cancel()
vix_scene._can_check = true
end
db:set_string("checkpoint:pre_vix", "in_room")
elseif checkpoint == "in_room" then -- We're actually in the room.
if type == "node" and target.node_under.name:find "forcefield_generator" then
local num = db:get_int("checkpoint:pre_vix_fields_broken") +1
db:set_int("checkpoint:pre_vix_fields_broken", num)
if num == 1 then -- Key breaks his first generator.
minetest.after(1, function()
artifact.push_chat_message("Hehe.", "Key", "artifact_key_splash_low.png")
end)
elseif num >= 5 then -- All generators are down.
vix_scene._can_check = nil
-- Wait just a bit, so the player can look up.
minetest.after(0.5, function()
ns.play_vix_scene()
end)
end
end
end
end
function ns.enter_pre_vix_state() function ns.enter_pre_vix_state()
for _, m in pairs(artifact.players) do for _, m in pairs(artifact.players) do
m:add_health_bar() m:add_health_bar()
@ -103,38 +134,13 @@ function ns.enter_pre_vix_state()
m:set_spawnpoint(artifact.origin:offset(0, -73.5, -4)) m:set_spawnpoint(artifact.origin:offset(0, -73.5, -4))
end end
minetest.add_entity(artifact.origin:offset(-16.5, -72.5, -17), "artifact:vix_scene") minetest.add_entity(artifact.origin:offset(-16.5, -72.5, -17), "artifact:vix_scene")
local help = minetest.after(15, function() help = minetest.after(15, function()
for _, m in pairs(artifact.players) do for _, m in pairs(artifact.players) do
artifact.show_help_message(m, "Certain nodes can be broken by punching them with the blackrod.", "info") artifact.show_help_message(m, "Certain nodes can be broken by punching them with the blackrod.", "info")
end end
end) end)
db:set_string("checkpoint:pre_vix", "begin") db:set_string("checkpoint:pre_vix", "begin")
artifact.on_whacked = function(type, target) artifact.on_whacked = pre_vix_on_whacked
local checkpoint = db:get("checkpoint:pre_vix")
if checkpoint == "begin" then -- We're still in the start closet.
if type == "object" then
help:cancel()
vix_scene._can_check = true
end
db:set_string("checkpoint:pre_vix", "in_room")
elseif checkpoint == "in_room" then -- We're actually in the room.
if type == "node" and target.node_under.name:find "forcefield_generator" then
local num = db:get_int("checkpoint:pre_vix_fields_broken") +1
db:set_int("checkpoint:pre_vix_fields_broken", num)
if num == 1 then -- Key breaks his first generator.
minetest.after(1, function()
artifact.push_chat_message("Hehe.", "Key", "artifact_key_splash_low.png")
end)
elseif num == 5 then -- All generators are down.
vix_scene._can_check = nil
-- Wait just a bit, so the player can look up.
minetest.after(0.5, function()
ns.play_vix_scene()
end)
end
end
end
end
end end
function ns.enter_main_state() function ns.enter_main_state()
@ -260,7 +266,7 @@ artifact.register_node("stasis_beacon", {
paramtype = "light" paramtype = "light"
}) })
-- The 'cutscene' playerd after the player frees Vix. -- The 'cutscene' played after the player frees Vix.
function ns.play_vix_scene() function ns.play_vix_scene()
-- Kaboom. -- Kaboom.
minetest.add_particle { minetest.add_particle {
@ -984,6 +990,10 @@ minetest.register_on_joinplayer(function(p)
} }
end end
if state == ns.states.pre_vix then
artifact.on_whacked = pre_vix_on_whacked
end
if state == ns.states.pre_vix and db:get_int("checkpoint:pre_vix_fields_broken") >= 5 then if state == ns.states.pre_vix and db:get_int("checkpoint:pre_vix_fields_broken") >= 5 then
-- If the player left during the scene for some reason, start it over when they join back. -- If the player left during the scene for some reason, start it over when they join back.
ns.play_vix_scene() ns.play_vix_scene()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB