141 lines
4.1 KiB
Lua
141 lines
4.1 KiB
Lua
local ent = ent
|
|
local scene = entities.currentScene()
|
|
local controller = entities.controller()
|
|
local metadata = ent:getComponent("Metadata")
|
|
local masterdata = scene:getComponent("Metadata")
|
|
|
|
if metadata["dialogue"] == nil then
|
|
metadata["dialogue"] = {}
|
|
end
|
|
|
|
local children = {
|
|
text = {
|
|
box = ent:loadChild("./text-box.json",true),
|
|
string = ent:loadChild("./text-string.json",true),
|
|
},
|
|
name = {
|
|
box = ent:loadChild("./name-box.json",true),
|
|
string = ent:loadChild("./name-string.json",true),
|
|
}
|
|
}
|
|
|
|
local soundEmitter = ent:loadChild("./sound.json",true)
|
|
|
|
local timer = Timer.new()
|
|
if not timer:running() then timer:start() end
|
|
|
|
Static = {
|
|
values = {},
|
|
get = function( obj )
|
|
if obj == nil then
|
|
obj = scene
|
|
end
|
|
if Static.values[""..obj:uid()] == nil then
|
|
Static.values[""..obj:uid()] = {}
|
|
end
|
|
return Static.values[""..obj:uid()]
|
|
end
|
|
}
|
|
|
|
local bind = function( text, box, str, color )
|
|
local box_transform = box:getComponent("Transform")
|
|
local text_transform = text:getComponent("Transform")
|
|
|
|
text_transform:setReference( box_transform )
|
|
text_transform.scale.x = 1.0 / box_transform.scale.x
|
|
text_transform.scale.y = 1.0 / box_transform.scale.y
|
|
|
|
|
|
if color ~= nil then
|
|
local box_metadata = box:getComponent("Metadata")
|
|
box_metadata["color"] = color
|
|
box:setComponent("Metadata", box_metadata)
|
|
end
|
|
|
|
local text_metadata = text:getComponent("Metadata")
|
|
text_metadata["string"] = str
|
|
text:setComponent("Metadata", text_metadata)
|
|
end
|
|
|
|
-- bind references
|
|
if children.name.box:uid() > 0 and children.name.string:uid() > 0 then
|
|
bind( children.name.string, children.name.box, metadata["dialogue"]["name"] or "%name%", metadata["dialogue"]["name color"] )
|
|
end
|
|
if children.text.box:uid() > 0 and children.text.string:uid() > 0 then
|
|
bind( children.text.string, children.text.box, metadata["dialogue"]["text"] or "%text%", metadata["dialogue"]["text color"] )
|
|
end
|
|
|
|
--[[
|
|
local destination = function( obj, x, y, z )
|
|
local static = Static.get(obj)
|
|
local transform = obj:getComponent("Transform")
|
|
static.from = Vector3f(x or transform.position.x, y or transform.position.y, z or transform.position.z)
|
|
end
|
|
-- circleOut
|
|
destination(children.circleOut, nil, -2, 0)
|
|
destination(children.circleIn, nil, 2, 0)
|
|
destination(children.coverBar, -1.5, nil, 0)
|
|
destination(children.commandText, -1.5, nil, 0)
|
|
destination(children.tenkouseiOption, -1.5, nil, 0)
|
|
destination(children.closeOption, -1.5, nil, 0)
|
|
destination(children.quit, -1.5, nil, 0)
|
|
]]
|
|
|
|
--[[
|
|
local playSound = function( key )
|
|
local url = "/ui/" .. key .. ".ogg"
|
|
-- local assetLoader = scene:getComponent("Asset")
|
|
-- assetLoader:cache(soundEmitter:formatHookName("asset:Load.%UID%"), string.resolveURI(url), "")
|
|
end
|
|
|
|
ent:addHook("menu:Close.%UID%", function( json )
|
|
playSound("menu close")
|
|
if metadata["system"]["hooks"] == nil then metadata["system"]["hooks"] = {} end
|
|
metadata["system"]["hooks"]["onClose"] = json["callback"];
|
|
metadata["system"]["closing"] = true;
|
|
ent:setComponent("Metadata", metadata)
|
|
end )
|
|
|
|
playSound("menu open")
|
|
]]
|
|
|
|
local states = {}
|
|
|
|
ent:bind( "tick", function(self)
|
|
local closed = inputs.key("E") or inputs.key("R_Y")
|
|
-- close when finished
|
|
-- dialogue box
|
|
if children.text.string:uid() > 0 then
|
|
local child = children.text.string
|
|
if states[child:uid()] == nil then
|
|
states[child:uid()] = {
|
|
timer = 0,
|
|
finished = false,
|
|
speed = -1
|
|
}
|
|
end
|
|
local state = states[child:uid()]
|
|
if state.finished then
|
|
if closed then
|
|
entities.destroy(self)
|
|
end
|
|
else
|
|
local metadata = child:getComponent("Metadata")
|
|
if state.speed < 0 then
|
|
state.speed = metadata["speed"]
|
|
end
|
|
if metadata["range"] ~= nil and state.timer + state.speed < timer:elapsed() then
|
|
local pos = metadata["range"][2]
|
|
local str = metadata["string"]
|
|
state.finished = not (pos < string.len(str))
|
|
|
|
if pos < string.len(str) then
|
|
metadata["range"][2] = pos + 1
|
|
state.timer = timer:elapsed()
|
|
|
|
child:setComponent("Metadata", metadata)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end ) |