engine/bin/data/entities/gui/dialogue/scripts/main.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 )