Fix trigger generation from lua

This commit is contained in:
James Lambert 2022-12-24 12:02:12 -07:00
parent 107b5efd97
commit 13810c40d6
3 changed files with 34 additions and 22 deletions

View file

@ -342,7 +342,7 @@ end
function Quaternion.__mul(a, b)
if (isVector3(b)) then
local result = a * quaternion(b.x, b.y, b.z, 0) * quaternionConjugate(a)
local result = a * quaternion(b.x, b.y, b.z, 0) * a:conjugate()
return vector3(result.x, result.y, result.z)
elseif (isQuaternion(b)) then
return quaternion(

View file

@ -11,9 +11,11 @@ local box_droppers = {}
for _, dropper in pairs(sk_scene.nodes_for_type('@box_dropper')) do
local position = dropper.node.full_transformation:decompose()
local room_index = room_export.node_nearest_room_index(dropper.node)
table.insert(box_droppers, {
position,
room_export.node_nearest_room_index(dropper.node),
room_index,
signals.signal_index_for_name(dropper.arguments[1] or ''),
})
end
@ -25,11 +27,13 @@ local buttons = {}
for _, button in pairs(sk_scene.nodes_for_type('@button')) do
local position = button.node.full_transformation:decompose()
local room_index = room_export.node_nearest_room_index(button.node)
table.insert(buttons, {
position,
room_export.node_nearest_room_index(dropper.node),
signals.signal_index_for_name(dropper.arguments[1] or ''),
signals.signal_index_for_name(dropper.arguments[2] or ''),
room_index,
signals.signal_index_for_name(button.arguments[1] or ''),
signals.signal_index_for_name(button.arguments[2] or ''),
})
end
@ -40,10 +44,12 @@ local decor = {}
for _, decor_entry in pairs(sk_scene.nodes_for_type('@decor')) do
local position, rotation = decor_entry.node.full_transformation:decompose()
local room_index = room_export.node_nearest_room_index(decor_entry.node)
table.insert(decor, {
position,
rotation,
room_export.node_nearest_room_index(decor_entry.node),
room_index,
'DECOR_TYPE_' .. decor_entry.arguments[1],
})
end
@ -86,10 +92,12 @@ for _, elevator in pairs(elevator_nodes) do
end
end
local room_index = room_export.node_nearest_room_index(elevator.node)
table.insert(elevators, {
position,
rotation,
room_export.node_nearest_room_index(elevator.node),
room_index,
target_elevator,
})
end
@ -101,12 +109,14 @@ local fizzlers = {}
for _, fizzler in pairs(sk_scene.nodes_for_type('@fizzler')) do
local position, rotation = fizzler.node.full_transformation:decompose()
local room_index = room_export.node_nearest_room_index(fizzler.node)
table.insert(fizzlers, {
position,
rotation,
2,
2,
room_export.node_nearest_room_index(fizzler.node),
room_index,
})
end
@ -117,9 +127,11 @@ local pedestals = {}
for _, pedestal in pairs(sk_scene.nodes_for_type('@pedestal')) do
local position = pedestal.node.full_transformation:decompose()
local room_index = room_export.node_nearest_room_index(pedestal.node)
table.insert(pedestals, {
position,
room_export.node_nearest_room_index(fizzlers.node),
room_index,
})
end
@ -130,10 +142,12 @@ local signage = {}
for _, signage_element in pairs(sk_scene.nodes_for_type('@signage')) do
local position, rotation = signage_element.node.full_transformation:decompose()
local room_index = room_export.node_nearest_room_index(signage_element.node)
table.insert(signage, {
position,
rotation,
room_export.node_nearest_room_index(signage_element.node),
room_index,
sk_definition_writer.raw(signage_element.arguments[1]),
})
end

View file

@ -11,13 +11,13 @@ local function does_belong_to_cutscene(first_step, step)
local offset = step.position - first_step.position
local local_pos = first_step.rotation * offset
return local_pos.y >= 0 and local_pos.x * local_pos.x + local_pos.z * local_pos.z < 0.1
return local_pos.z >= 0 and local_pos.x * local_pos.x + local_pos.y * local_pos.y < 0.1
end
local function distance_from_start(first_step, step)
local offset = step.position - first_step.position
local local_pos = first_step.rotation * offset
return local_pos.y
return local_pos.z
end
local function cutscene_index(cutscenes, name)
@ -103,16 +103,16 @@ local function generate_cutscene_step(step, step_index, label_locations, cutscen
sk_definition_writer.raw('CutsceneStepTypePlaySound') or
sk_definition_writer.raw('CutsceneStepTypeStartSound')
result.playSound = {
string_starts_with(step.args[1], "SOUNDS_") and step.args[1] or ("SOUNDS_" .. step.args[1]),
sk_definition_writer.raw(string_starts_with(step.args[1], "SOUNDS_") and step.args[1] or ("SOUNDS_" .. step.args[1])),
tonumber(step.args[2] or "1") * 255,
math.floor(tonumber(step.args[3] or "1") * 64 + 0.5),
}
elseif step.command == "q_sound" and #step.args >= 2 then
result.type = sk_definition_writer.raw('CutsceneStepTypeQueueSound')
result.queueSound = {
string_starts_with(step.args[1], "SOUNDS_") and step.args[1] or ("SOUNDS_" .. step.args[1]),
sk_definition_writer.raw(string_starts_with(step.args[1], "SOUNDS_") and step.args[1] or ("SOUNDS_" .. step.args[1])),
sk_definition_writer.raw(step.args[2]),
tonumber(step.args[2] or "1") * 255,
tonumber(step.args[3] or "1") * 255,
}
elseif step.command == "wait_for_channel" and #step.args >= 1 then
result.type = sk_definition_writer.raw('CutsceneStepTypeWaitForChannel')
@ -121,9 +121,7 @@ local function generate_cutscene_step(step, step_index, label_locations, cutscen
}
elseif step.command == "delay" and #step.args >= 1 then
result.type = sk_definition_writer.raw('CutsceneStepTypeDelay')
result.delay = {
tonumber(step.args[1])
}
result.delay = tonumber(step.args[1])
elseif step.command == "open_portal" and #step.args >= 1 then
result.type = sk_definition_writer.raw('CutsceneStepTypeOpenPortal')
result.openPortal = {
@ -209,7 +207,7 @@ local function generate_cutscenes()
rotation = rotation:conjugate(),
}
if command == "start" and #args > 1 then
if command == "start" and #args >= 1 then
table.insert(cutscenes, {
name = args[1],
steps = {step},
@ -255,8 +253,8 @@ local function generate_cutscenes()
})
table.insert(cutscene_data, {
sk_definition_writer.reference_to(cutscene.steps, 1),
#cutscene.steps,
sk_definition_writer.reference_to(steps, 1),
#cutscene.steps - 1,
})
end
@ -268,7 +266,7 @@ local function generate_triggers(cutscenes)
for _, trigger in pairs(sk_scene.nodes_for_type('@trigger')) do
local first_mesh = trigger.node.meshes[1]
local cutscene_index = cutscene_index(cutscenes, trigger.arugments[1])
local cutscene_index = cutscene_index(cutscenes, trigger.arguments[1])
if first_mesh and cutscene_index ~= -1 then
local transformed = first_mesh:transform(trigger.node.full_transformation)