1114 lines
31 KiB
Lua
1114 lines
31 KiB
Lua
r2.dialogs = {
|
|
|
|
uiId = "ui:interface:r2ed_dialogs",
|
|
ownCreatedInstances = {},
|
|
openFirst = nil,
|
|
elementsIdCounter = 0,
|
|
elementOrder = true,
|
|
fromEmoteIdToName= {},
|
|
maxAndMin = true,
|
|
eltTemplateParams = {
|
|
selectElt="r2.dialogs:selectElement()",
|
|
openEltEditor="",
|
|
maxMinElt="r2.dialogs:maximizeMinimizeElement()",
|
|
removeElt="r2.dialogs:removeElementInst()",
|
|
colOver="120 150 140 100",
|
|
colPushed="120 150 140 255",
|
|
multiMaxLine="3"
|
|
},
|
|
elementEditorTemplate = "template_edit_chat",
|
|
elementInitialName=i18n.get("uiR2EdChat"):toUtf8(),
|
|
sequenceInitialName=i18n.get("uiR2EDDialog"):toUtf8(),
|
|
|
|
keepOpenedEditor = false,
|
|
|
|
currentEltUIID = nil, -- initialisé quand l'editeur est ouvert ou fermé
|
|
|
|
whoToWhoTranslation = {
|
|
["_DM"] = i18n.get("uiR2EdDonjonMaster"):toUtf8(),
|
|
["_System"] = i18n.get("uiR2EdSystem"):toUtf8(),
|
|
["_Nobody"] = i18n.get("uiR2EdNobody"):toUtf8(),
|
|
},
|
|
|
|
maxVisibleLine = 10,
|
|
}
|
|
|
|
|
|
|
|
-- sequence --------------------------------------------------
|
|
function r2.dialogs:currentSequUI()
|
|
return getUI(self.uiId):find("sequence_elts")
|
|
end
|
|
|
|
function r2.dialogs:currentSequInstId()
|
|
return self:currentSequUI().Env.InstanceId
|
|
end
|
|
|
|
-- initialisé quand selection dialog dans menu
|
|
function r2.dialogs:setSequUIInstId(sequUI, id)
|
|
sequUI.Env.InstanceId = id
|
|
end
|
|
|
|
function r2.dialogs:currentSequInst()
|
|
return r2:getInstanceFromId(self:currentSequInstId())
|
|
end
|
|
|
|
-- element ---------------------------------------------------
|
|
function r2.dialogs:currentEltUIId()
|
|
return self.currentEltUIID
|
|
end
|
|
|
|
function r2.dialogs:currentEltUI()
|
|
if self.currentEltUIID then
|
|
return getUI(self.currentEltUIID)
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function r2.dialogs:setCurrentEltUIId(id)
|
|
self.currentEltUIID = id
|
|
end
|
|
|
|
function r2.dialogs:currentEltInstId()
|
|
if self.currentEltUIID then
|
|
return self:currentEltUI().Env.InstanceId
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function r2.dialogs:currentEltInst()
|
|
if self.currentEltUIID and self:currentEltInstId() then
|
|
return r2:getInstanceFromId(self:currentEltInstId())
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-- updated element and/or sequence (not necessary the same as current sequence or element)
|
|
function r2.dialogs:updatedSequUI()
|
|
return self:currentSequUI()
|
|
end
|
|
|
|
function r2.dialogs:setUpdatedSequUIId(sequUIId)
|
|
end
|
|
|
|
function r2.dialogs:updatedEltUI()
|
|
return self:currentEltUI()
|
|
end
|
|
|
|
function r2.dialogs:setUpdatedEltUIId(eltUIId)
|
|
end
|
|
|
|
|
|
------------------ INIT DIALOGS EDITOR -------------------------
|
|
function r2.dialogs:initEditor()
|
|
|
|
local emoteTable = initEmotesMenu("ui:interface:r2ed_triggers_menu", "")
|
|
for id, name in pairs(emoteTable) do
|
|
self.fromEmoteIdToName[id] = name
|
|
end
|
|
end
|
|
|
|
------ OPEN EDITOR ------------------------------------------
|
|
|
|
function r2.dialogs:checkDialog()
|
|
|
|
local dialogUI = getUI(self.uiId)
|
|
|
|
local dialog = r2:getSelectedInstance()
|
|
if not dialog or not dialog:isKindOf("ChatSequence") then
|
|
dialogUI.active = false
|
|
end
|
|
end
|
|
|
|
function r2.dialogs:openEditor()
|
|
|
|
local dialogUI = getUI(self.uiId)
|
|
|
|
if not dialogUI.active then
|
|
|
|
self:cleanEditor()
|
|
|
|
local sequenceUI = self:currentSequUI()
|
|
assert(sequenceUI)
|
|
|
|
-- select selected dialog in scene or first dialog of current act
|
|
local allDialogs = {}
|
|
r2:getCurrentAct():appendInstancesByType(allDialogs, "ChatSequence")
|
|
r2.Scenario:getBaseAct():appendInstancesByType(allDialogs, "ChatSequence")
|
|
|
|
if table.getn(allDialogs) > 0 then
|
|
sequenceUI.active = true
|
|
|
|
local selectedInstance = r2:getSelectedInstance()
|
|
if selectedInstance and selectedInstance:isKindOf("ChatSequence") then
|
|
self:selectSequence(selectedInstance.InstanceId)
|
|
else
|
|
local firstDialog
|
|
for k, dialog in pairs(allDialogs) do
|
|
firstDialog = dialog
|
|
break
|
|
end
|
|
self:selectSequence(firstDialog.InstanceId)
|
|
end
|
|
else
|
|
sequenceUI.active = false
|
|
local dialogName = dialogUI:find("dialogMenu"):find("menu"):find("text")
|
|
assert(dialogName)
|
|
dialogName.uc_hardtext = i18n.get("uiR2EdNoSelelection")
|
|
end
|
|
|
|
-- active editor
|
|
dialogUI.active = true
|
|
dialogUI:updateCoords()
|
|
|
|
if self.openFirst == nil then
|
|
self.openFirst = true
|
|
dialogUI:center()
|
|
end
|
|
else
|
|
setTopWindow(dialogUI)
|
|
dialogUI:blink(1)
|
|
end
|
|
end
|
|
|
|
------ NEW SEQUENCE ------------------------------------------
|
|
|
|
function r2.dialogs:newSequenceInst(x, y, z)
|
|
|
|
r2.requestNewAction(i18n.get("uiR2EDNewChatSequenceAction"))
|
|
local dialog = r2.newComponent("ChatSequence")
|
|
assert(dialog)
|
|
|
|
dialog.Base = r2.Translator.getDebugBase("palette.entities.botobjects.dialog")
|
|
dialog.Name = r2:genInstanceName(i18n.get("uiR2EDDialog")):toUtf8()
|
|
dialog.Position.x = x
|
|
dialog.Position.y = y
|
|
dialog.Position.z = r2:snapZToGround(x, y)
|
|
|
|
if dialog.onComponentCreated then
|
|
dialog:onComponentCreated()
|
|
end
|
|
|
|
r2:setCookie(dialog.InstanceId, "DisplayProp", 1)
|
|
r2.requestInsertNode(r2:getCurrentAct().InstanceId, "Features", -1, "", dialog)
|
|
end
|
|
|
|
|
|
------ CLOSE EDITOR ------------------------------------------
|
|
function r2.dialogs:closeEditor()
|
|
|
|
self:updateSaysWhat()
|
|
|
|
r2.logicUI:closeEditor(r2.dialogs)
|
|
end
|
|
|
|
------ CLEAN EDITOR ------------------------------------------
|
|
function r2.dialogs:cleanEditor()
|
|
|
|
-- reset current dialog and current chat
|
|
self:setCurrentEltUIId(nil)
|
|
self:setUpdatedSequUIId(nil)
|
|
self:setUpdatedEltUIId(nil)
|
|
self.elementsIdCounter = 0
|
|
|
|
local sequenceUI = self:currentSequUI()
|
|
assert(sequenceUI)
|
|
local eltsList = sequenceUI:find("elements_list")
|
|
assert(eltsList)
|
|
eltsList:clear()
|
|
|
|
-- hide maximize/minimize
|
|
local minElts = sequenceUI:find("minimize_elements")
|
|
assert(minElts)
|
|
local maxElts = sequenceUI:find("maximize_elements")
|
|
assert(maxElts)
|
|
minElts.active = false
|
|
maxElts.active = false
|
|
|
|
-- hide down/up buttons
|
|
local upDown = sequenceUI:find("order_group")
|
|
assert(upDown)
|
|
upDown.active = false
|
|
end
|
|
|
|
------ INIT DIALOGS MENU ------------------------------------------
|
|
function r2.dialogs:initDialogsMenu()
|
|
|
|
local dialogMenu = getUI("ui:interface:r2ed_triggers_menu")
|
|
assert(dialogMenu)
|
|
|
|
dialogMenu = dialogMenu:getRootMenu()
|
|
assert(dialogMenu)
|
|
|
|
dialogMenu:reset()
|
|
|
|
local allDialogs = {}
|
|
r2:getCurrentAct():appendInstancesByType(allDialogs, "ChatSequence")
|
|
|
|
local uc_dialog = ucstring()
|
|
for k, dialog in pairs(allDialogs) do
|
|
uc_dialog:fromUtf8(dialog.Name)
|
|
dialogMenu:addLine(uc_dialog, "lua", "r2:setSelectedInstanceId('" .. dialog.InstanceId .."')", dialog.InstanceId)
|
|
end
|
|
|
|
dialogMenu:setMaxVisibleLine(self.maxVisibleLine)
|
|
|
|
r2.logicUI:openLogicMenu(getUICaller())
|
|
end
|
|
|
|
------ SELECT ELEMENT --------------------------------------------
|
|
function r2.dialogs:selectElement(selectedButtonElt)
|
|
|
|
r2.logicComponents:selectElement(self, selectedButtonElt)
|
|
|
|
local sequenceUI = self:currentSequUI()
|
|
assert(sequenceUI)
|
|
|
|
local editElt = sequenceUI:find("edit_element")
|
|
assert(editElt)
|
|
|
|
if editElt.active then
|
|
local editBox = editElt:find("says"):find("edit_box_group")
|
|
assert(editBox)
|
|
editBox:setFocusOnText()
|
|
end
|
|
end
|
|
|
|
------ SELECT SEQUENCE --------------------------------------
|
|
function r2.dialogs:selectSequence(dialogId)
|
|
|
|
local ui = getUI(self.uiId)
|
|
assert(ui)
|
|
|
|
-- clean editor
|
|
self:cleanEditor()
|
|
|
|
self:setSequUIInstId(self:currentSequUI(), dialogId)
|
|
local sequenceInst = self:currentSequInst()
|
|
if sequenceInst==nil then return end
|
|
|
|
local sequenceUI = self:currentSequUI()
|
|
assert(sequenceUI)
|
|
|
|
sequenceUI.active = true
|
|
|
|
-- create dialog editor
|
|
self:createElementEditor()
|
|
|
|
-- init dialog UI -------------------------
|
|
-- add elts to sequence
|
|
local elts = sequenceInst.Components
|
|
for e = 0, elts.Size - 1 do
|
|
self:newElementUI(elts[e])
|
|
end
|
|
|
|
-- initialize repeat type
|
|
local repeatButton = ui:find("repeat"):find("toggle_butt")
|
|
assert(repeatButton)
|
|
repeatButton.pushed = (sequenceInst.Repeating == 0)
|
|
|
|
-- dialog editor title
|
|
local uc_dialog = ucstring()
|
|
uc_dialog:fromUtf8(i18n.get("uiR2EDChatSequenceEditor"):toUtf8() .. sequenceInst.Name)
|
|
ui.uc_title = uc_dialog
|
|
|
|
-- dialog name in menu box
|
|
local dialogName = ui:find("dialogMenu"):find("menu"):find("text")
|
|
assert(dialogName)
|
|
uc_dialog:fromUtf8(sequenceInst.Name)
|
|
dialogName.uc_hardtext = uc_dialog
|
|
|
|
-- initialize maximize/minimize
|
|
local maxElts = sequenceUI:find("maximize_elements")
|
|
assert(maxElts)
|
|
maxElts.active = (elts.Size > 0)
|
|
|
|
r2.logicComponents:selectSequence(r2.dialogs)
|
|
end
|
|
|
|
------ CREATE EDITOR -----------------------------------------------
|
|
function r2.dialogs:createElementEditor()
|
|
|
|
r2.logicComponents:createElementEditor(r2.dialogs)
|
|
|
|
-- not necessary current sequence UI
|
|
local sequenceUI = self:updatedSequUI()
|
|
|
|
local newEditorElt = sequenceUI:find("edit_element")
|
|
assert(newEditorElt)
|
|
|
|
local editBox = newEditorElt:find("edit_box_group")
|
|
assert(editBox)
|
|
|
|
local scroll = newEditorElt:find("edit_box_scroll_ed")
|
|
assert(scroll)
|
|
|
|
scroll:setTarget(editBox.id)
|
|
end
|
|
|
|
------ OPEN ELEMENT EDITOR -----------------------------------------------
|
|
function r2.dialogs:updateElementEditor()
|
|
|
|
local instanceChat = self:currentEltInst()
|
|
|
|
local dialogUI = getUI(self.uiId)
|
|
assert(dialogUI)
|
|
|
|
local sequenceUI = self:currentSequUI()
|
|
assert(sequenceUI)
|
|
|
|
local chatEditor = sequenceUI:find("edit_element")
|
|
assert(chatEditor)
|
|
|
|
-- chat name
|
|
local chatName = chatEditor:find("name")
|
|
assert(chatName)
|
|
|
|
-- time
|
|
local minutesText = chatEditor:find("minutes"):find("text")
|
|
assert(minutesText)
|
|
|
|
local secondsText = chatEditor:find("seconds"):find("text")
|
|
assert(secondsText)
|
|
|
|
-- update NPC name lists
|
|
local whoMenuText = chatEditor:find("whoMenu"):find("text")
|
|
assert(whoMenuText)
|
|
|
|
local toWhoMenuText = chatEditor:find("toWhoMenu"):find("text")
|
|
assert(toWhoMenuText)
|
|
|
|
local editBox = chatEditor:find("says"):find("edit_box_group")
|
|
assert(editBox)
|
|
|
|
local emoteButtonText = chatEditor:find("emote"):find("menu"):find("text")
|
|
assert(emoteButtonText)
|
|
|
|
if instanceChat then
|
|
|
|
local uc_chat = ucstring()
|
|
|
|
local index = r2.logicComponents:searchElementIndex(instanceChat)
|
|
if index~= nil then
|
|
uc_chat:fromUtf8(self.elementInitialName.." "..index.." : ")
|
|
else
|
|
uc_chat:fromUtf8(self.elementInitialName.." : ")
|
|
end
|
|
chatName.uc_hardtext = uc_chat
|
|
|
|
-- after value
|
|
local time = instanceChat.Time
|
|
assert(time)
|
|
local minNb, secNb = self:calculMinSec(time)
|
|
|
|
minutesText.uc_hardtext = tostring(minNb)
|
|
secondsText.uc_hardtext = tostring(secNb)
|
|
|
|
-- who
|
|
local whoInst = r2:getInstanceFromId(tostring(instanceChat.Actions[0].Who))
|
|
local hideToWhoAndEmote = false
|
|
if whoInst then
|
|
uc_chat:fromUtf8(whoInst.Name)
|
|
elseif instanceChat.Actions[0].WhoNoEntity=="_System" then
|
|
uc_chat = i18n.get("uiR2EdSystem")
|
|
hideToWhoAndEmote = true
|
|
elseif instanceChat.Actions[0].WhoNoEntity=="_DM" then
|
|
uc_chat = i18n.get("uiR2EdDonjonMaster")
|
|
hideToWhoAndEmote = true
|
|
else
|
|
uc_chat = ucstring("")
|
|
end
|
|
whoMenuText.uc_hardtext = uc_chat
|
|
|
|
-- says what
|
|
editBox:cancelFocusOnText()
|
|
local textID = instanceChat.Actions[0].Says
|
|
if textID ~= "" and r2:getInstanceFromId(textID) then
|
|
local uc_says_what = ucstring()
|
|
uc_says_what:fromUtf8(r2:getInstanceFromId(textID).Text)
|
|
editBox.uc_input_string = uc_says_what
|
|
else
|
|
editBox.uc_input_string = ""
|
|
end
|
|
|
|
local breakAtEnd = 0
|
|
|
|
if instanceChat.BreakAtEnd then
|
|
breakAtEnd = instanceChat.BreakAtEnd
|
|
end
|
|
local breakAtEndButton = chatEditor:find("break_group"):find("toggle_butt")
|
|
assert(breakAtEndButton)
|
|
breakAtEndButton.pushed = (breakAtEnd == 0)
|
|
|
|
chatEditor:find("toWhoMenu").active = not hideToWhoAndEmote
|
|
chatEditor:find("emote").active = not hideToWhoAndEmote
|
|
if hideToWhoAndEmote then
|
|
return
|
|
end
|
|
|
|
-- to who
|
|
local toWhoInst = r2:getInstanceFromId(tostring(instanceChat.Actions[0].Facing))
|
|
if toWhoInst then
|
|
uc_chat:fromUtf8(toWhoInst.Name)
|
|
else
|
|
uc_chat = i18n.get("uiR2EdNobody")
|
|
end
|
|
toWhoMenuText.uc_hardtext = uc_chat
|
|
|
|
-- emote
|
|
local emoteName = self.fromEmoteIdToName[instanceChat.Actions[0].Emote]
|
|
if emoteName then
|
|
uc_chat:fromUtf8(emoteName)
|
|
else
|
|
uc_chat = i18n.get("uiR2EdNoElt")
|
|
end
|
|
emoteButtonText.uc_hardtext = uc_chat
|
|
|
|
else
|
|
local uc_chat = ucstring()
|
|
uc_chat:fromUtf8(self.elementInitialName.." : ")
|
|
chatName.uc_hardtext = uc_chat
|
|
|
|
minutesText.uc_hardtext = tostring(0)
|
|
secondsText.uc_hardtext = tostring(0)
|
|
|
|
whoMenuText.uc_hardtext = ""
|
|
|
|
editBox.uc_input_string = ""
|
|
|
|
toWhoMenuText.uc_hardtext = ""
|
|
emoteButtonText.uc_hardtext = i18n.get("uiR2EdNoElt")
|
|
end
|
|
end
|
|
|
|
|
|
----- CLOSE ELEMENT EDITOR ---------------------------------------------
|
|
function r2.dialogs:closeElementEditor()
|
|
|
|
r2.logicComponents:closeElementEditor(r2.dialogs)
|
|
end
|
|
|
|
------ NEW ELEMENT INST ------------------------------------------
|
|
function r2.dialogs:newElementInst()
|
|
|
|
r2.requestNewAction(i18n.get("uiR2EDNewChatStepAction"))
|
|
|
|
local chatStep = r2.newComponent("ChatStep")
|
|
|
|
local sequenceInst = self:currentSequInst()
|
|
assert(sequenceInst)
|
|
|
|
if sequenceInst.Components.Size == 0 then
|
|
chatStep.Time = 0
|
|
else
|
|
chatStep.Time = 3
|
|
end
|
|
|
|
local chatAction = r2.newComponent("ChatAction")
|
|
chatAction.WhoNoEntity = "_System"
|
|
table.insert(chatStep.Actions, chatAction)
|
|
|
|
r2.requestInsertNode(sequenceInst.InstanceId, "Components", -1, "", chatStep)
|
|
|
|
self.ownCreatedInstances[chatStep.InstanceId] = true
|
|
|
|
r2.logicComponents:newElementInst(r2.dialogs)
|
|
end
|
|
|
|
------ NEW ELEMENT UI ------------------------------------------
|
|
function r2.dialogs:newElementUI(newInst)
|
|
r2.logicUI:newElementUI(r2.dialogs, newInst, true)
|
|
end
|
|
|
|
------ REMOVE ELEMENT INST ----------------------------------------
|
|
function r2.dialogs:removeElementInst()
|
|
|
|
r2.requestNewAction(i18n.get("uiR2EDRemoveLogicElementAction"))
|
|
|
|
local chatStep = self:currentEltInst()
|
|
assert(chatStep)
|
|
local says = chatStep.Actions[0].Says
|
|
|
|
r2.logicComponents:removeElementInst(r2.dialogs)
|
|
|
|
r2.unregisterTextFromId(chatStep.Actions[0].Says)
|
|
|
|
r2.requestEndAction()
|
|
end
|
|
|
|
------ REMOVE ELEMENT UI -------------------------------------------
|
|
function r2.dialogs:removeElementUI(removedEltUI)
|
|
r2.logicUI:removeElementUI(r2.dialogs, removedEltUI)
|
|
end
|
|
|
|
------ REMOVE SEQUENCE UI -------------------------------------------
|
|
function r2.dialogs:removeSequenceUI(instance)
|
|
|
|
local allDialogs = {}
|
|
if (not r2:getCurrentAct()) then return end
|
|
r2:getCurrentAct():appendInstancesByType(allDialogs, "ChatSequence")
|
|
-- be careful : instance is always in ChatSequences list
|
|
-- it's not removed yet when onErase is called
|
|
if table.getn(allDialogs) > 1 then
|
|
local firstDialog
|
|
for k, dialog in pairs(allDialogs) do
|
|
if dialog~=instance then
|
|
firstDialog = dialog
|
|
break
|
|
end
|
|
end
|
|
self:selectSequence(firstDialog.InstanceId)
|
|
else
|
|
self.keepOpenedEditor = false
|
|
end
|
|
end
|
|
|
|
------ UPDATE SEQUENCE UI -------------------------------------------
|
|
function r2.dialogs:updateSequenceUI(sequenceInst)
|
|
|
|
local ui = getUI(self.uiId)
|
|
assert(ui)
|
|
|
|
-- initialize repeat type
|
|
local repeatButton = ui:find("repeat"):find("toggle_butt")
|
|
assert(repeatButton)
|
|
repeatButton.pushed = (sequenceInst.Repeating == 0)
|
|
|
|
-- dialog editor title
|
|
local uc_title = ucstring()
|
|
uc_title:fromUtf8(i18n.get("uiR2EDChatSequenceEditor"):toUtf8() .. sequenceInst.Name)
|
|
ui.uc_title = uc_title
|
|
|
|
-- dialog name in menu box
|
|
local dialogName = ui:find("dialogMenu"):find("menu"):find("text")
|
|
assert(dialogName)
|
|
dialogName.uc_hardtext = sequenceInst.Name
|
|
end
|
|
|
|
------ UP ELEMENT INST -------------------------------------------
|
|
function r2.dialogs:upElementInst()
|
|
r2.logicComponents:upElementInst(r2.dialogs)
|
|
end
|
|
|
|
------ DOWN ELEMENT INST -----------------------------------------
|
|
function r2.dialogs:downElementInst()
|
|
r2.logicComponents:downElementInst(r2.dialogs)
|
|
end
|
|
|
|
------ MAX/MIN ELEMENTS UI -------------------------------------------
|
|
function r2.dialogs:maximizeMinimizeElements()
|
|
r2.logicUI:maximizeMinimizeElements(r2.dialogs)
|
|
end
|
|
|
|
------ MAX/MIN ELEMENT UI -------------------------------------------
|
|
function r2.dialogs:maximizeMinimizeElement(element, allMinimize)
|
|
|
|
r2.logicUI:maximizeMinimizeElement(element, allMinimize)
|
|
end
|
|
|
|
------ DOWN/UP ELEMENT UI -------------------------------------------
|
|
function r2.dialogs:downUpElementUI(elementUI, instance)
|
|
r2.logicUI:downUpElementUI(r2.dialogs, elementUI, instance)
|
|
end
|
|
|
|
------ UPDATE ELEMENT TITLE -------------------------------------------
|
|
function r2.dialogs:updateElementTitle(chatUI)
|
|
r2.logicComponents:updateElementTitle(r2.dialogs, chatUI, true)
|
|
end
|
|
|
|
------ UPDATE CHAT TEXT -------------------------------------------
|
|
function r2.dialogs:updateElementUI(elementUI)
|
|
|
|
local chatStep = r2:getInstanceFromId(r2.logicUI:getEltUIInstId(elementUI))
|
|
assert(chatStep)
|
|
|
|
local chatText = elementUI:find("text_list")
|
|
assert(chatText)
|
|
chatText:clear()
|
|
|
|
local who = tostring(chatStep.Actions[0].Who)
|
|
if who=="" then who=chatStep.Actions[0].WhoNoEntity end
|
|
if who and who ~= "" then
|
|
|
|
local text = ""
|
|
local textEmpty = true
|
|
|
|
local says = chatStep.Actions[0].Says
|
|
|
|
if r2:getInstanceFromId(says)~=nil and r2:getInstanceFromId(says).Text ~= "" then
|
|
text = "\n" .. r2:getInstanceFromId(says).Text
|
|
textEmpty = false
|
|
end
|
|
--text = text.."\n"
|
|
|
|
-- Add a white line that indicate that the dialog pause at end (ChatStep) in reduced view
|
|
chatText:addColoredTextChild(text, 220, 140, 100, 255)
|
|
if chatStep.BreakAtEnd and chatStep.BreakAtEnd == 1 then
|
|
chatText:addColoredTextChild("\n"..i18n.get("uiR2EDThenPause"):toUtf8(), 255, 255, 255, 255)
|
|
end
|
|
|
|
local sep = elementUI:find("sep")
|
|
assert(sep)
|
|
if textEmpty == false then
|
|
sep.active = true
|
|
else
|
|
chatText:clear()
|
|
sep.active = false
|
|
end
|
|
end
|
|
|
|
r2.logicUI:updateElementUI(r2.dialogs, elementUI)
|
|
end
|
|
|
|
-------------------- INIT TIME MENU --------------------------------
|
|
function r2.dialogs:initTimeMenu(timeFunction, isHours)
|
|
|
|
local timeMenu = getUI("ui:interface:r2ed_triggers_menu")
|
|
assert(timeMenu)
|
|
|
|
local timeMenu = timeMenu:getRootMenu()
|
|
assert(timeMenu)
|
|
|
|
timeMenu:reset()
|
|
|
|
for i=0,9 do
|
|
timeMenu:addLine(ucstring(tostring(i)), "lua", timeFunction .. "(" .. tostring(i) .. ")", tostring(i))
|
|
end
|
|
|
|
if isHours then
|
|
timeMenu:addLine(ucstring(tostring(10)), "lua", timeFunction .. "(" .. tostring(10) .. ")", tostring(10))
|
|
else
|
|
|
|
local lineNb = 9
|
|
for i=10, 50, 10 do
|
|
local lineStr = tostring(i).."/"..tostring(i+9)
|
|
timeMenu:addLine(ucstring(lineStr), "", "", tostring(i))
|
|
lineNb = lineNb+1
|
|
|
|
timeMenu:addSubMenu(lineNb)
|
|
local subMenu = timeMenu:getSubMenu(lineNb)
|
|
|
|
for s=0,9 do
|
|
lineStr = tostring(i+s)
|
|
subMenu:addLine(ucstring(lineStr), "lua", timeFunction .. "(" .. tostring(i+s) .. ")", lineStr)
|
|
end
|
|
|
|
timeMenu:setMaxVisibleLine(self.maxVisibleLine)
|
|
end
|
|
end
|
|
|
|
timeMenu:setMaxVisibleLine(self.maxVisibleLine)
|
|
|
|
r2.logicUI:openLogicMenu(getUICaller())
|
|
end
|
|
|
|
----- CHAT MINUTES -----------------------------------------------------------------
|
|
function r2.dialogs:chatAfterMinutes(minNb)
|
|
|
|
-- recover "says what" (equiv change focus)
|
|
self:updateSaysWhat()
|
|
|
|
local chatStep = self:currentEltInst()
|
|
assert(chatStep)
|
|
|
|
local hours, mins, secs = r2.logicComponents:calculHourMinSec(chatStep.Time)
|
|
self:setTime(minNb*60 + secs)
|
|
end
|
|
|
|
-------------------- CHAT SECONDS -----------------------------------------------------------------
|
|
function r2.dialogs:chatAfterSeconds(secNb)
|
|
|
|
-- recover "says what" (equiv change focus)
|
|
self:updateSaysWhat()
|
|
|
|
local chatStep = self:currentEltInst()
|
|
assert(chatStep)
|
|
|
|
local hours, mins, secs = r2.logicComponents:calculHourMinSec(chatStep.Time)
|
|
self:setTime(mins*60 + secNb)
|
|
end
|
|
|
|
---- SET TIME --------------------------------------------------------------------
|
|
function r2.dialogs:setTime(secNb)
|
|
|
|
r2.requestNewAction(i18n.get("uiR2EDSetDialogTime"))
|
|
|
|
local chatStepId = self:currentEltInstId()
|
|
assert(chatStepId)
|
|
|
|
r2.requestSetNode(chatStepId, "Time", secNb)
|
|
end
|
|
|
|
---- SET BREAK AT END OF CHATSTEP --------------------------------------------------------------------
|
|
function r2.dialogs:setChatBreak()
|
|
self:updateSaysWhat()
|
|
local mustBreak = 0
|
|
if getUICaller().pushed==false then mustBreak = 1 end
|
|
|
|
r2.requestNewAction(i18n.get("uiR2EDSetDialogChatBreak"))
|
|
|
|
local chatStepId = self:currentEltInstId()
|
|
assert(chatStepId)
|
|
r2.requestSetNode(chatStepId, "BreakAtEnd", mustBreak)
|
|
end
|
|
|
|
------- INIT ENTITIES MENU -----------------------------------------
|
|
function r2.dialogs:initWhoMenu(whoFunction, towho)
|
|
|
|
local menuName = "ui:interface:r2ed_triggers_menu"
|
|
|
|
local whoMenu = getUI(menuName)
|
|
local whoMenu = whoMenu:getRootMenu()
|
|
assert(whoMenu)
|
|
|
|
whoMenu:reset()
|
|
|
|
local npcTable = r2.Scenario:getAllInstancesByType("Npc")
|
|
|
|
if towho == true then
|
|
whoMenu:addLine(i18n.get("uiR2EdNobody"), "lua", whoFunction.."('" ..i18n.get("uiR2EdNobody"):toUtf8().. "')", "Nobody")
|
|
else
|
|
whoMenu:addLine(i18n.get("uiR2EdSystem"), "lua", whoFunction.."('_System')", "System")
|
|
whoMenu:addLine(i18n.get("uiR2EdDonjonMaster"), "lua", whoFunction.."('_DM')", "DonjonMaster")
|
|
end
|
|
|
|
local uc_who = ucstring()
|
|
for key, npc in pairs(npcTable) do
|
|
local addLine = true
|
|
|
|
if not npc:isBotObject() and not npc:isPlant() and not r2.isCreature(npc.InstanceId) then
|
|
if towho == true then
|
|
local chatStepInst= self:currentEltInst()
|
|
assert(chatStepInst)
|
|
|
|
local whoId = chatStepInst.Actions[0].Who
|
|
if whoId~="" and whoId == npc.InstanceId then
|
|
addLine = false
|
|
end
|
|
end
|
|
if addLine then
|
|
uc_who:fromUtf8(npc.Name)
|
|
whoMenu:addLine(uc_who, "lua", whoFunction.."('" ..npc.InstanceId.. "')", npc.InstanceId)
|
|
end
|
|
end
|
|
end
|
|
|
|
whoMenu:setMaxVisibleLine(self.maxVisibleLine)
|
|
|
|
r2.logicUI:openLogicMenu(getUICaller())
|
|
end
|
|
|
|
---- UPDATE SAYS WHAT -----------------------------------------------------------------
|
|
function r2.dialogs:updateSaysWhat()
|
|
|
|
-- recover "says what" (equiv change focus)
|
|
local sequenceUI = self:currentSequUI()
|
|
if sequenceUI then
|
|
local chatEditor = sequenceUI:find("edit_element")
|
|
if chatEditor then
|
|
local saysWhat = chatEditor:find("says"):find("edit_box_group").uc_input_string:toUtf8()
|
|
self:setSaysWhat(saysWhat)
|
|
end
|
|
end
|
|
end
|
|
|
|
---- SET WHO --------------------------------------------------------------------------
|
|
function r2.dialogs:setWho(who)
|
|
|
|
-- recover "says what" (equiv change focus)
|
|
self:updateSaysWhat()
|
|
|
|
r2.requestNewAction(i18n.get("uiR2EDChatSetWhoAction"))
|
|
|
|
local chatStep = self:currentEltInst()
|
|
assert(chatStep)
|
|
|
|
if r2:getInstanceFromId(who) then
|
|
r2.requestSetNode(chatStep.Actions[0].InstanceId, "Who", r2.RefId(who))
|
|
r2.requestSetNode(chatStep.Actions[0].InstanceId, "WhoNoEntity", "")
|
|
|
|
if who == chatStep.Actions[0].Facing then
|
|
self:setToWho(i18n.get("uiR2EdNobody"):toUtf8())
|
|
end
|
|
else
|
|
r2.requestSetNode(chatStep.Actions[0].InstanceId, "Who", r2.RefId(""))
|
|
r2.requestSetNode(chatStep.Actions[0].InstanceId, "WhoNoEntity", who)
|
|
|
|
r2.requestSetNode(chatStep.Actions[0].InstanceId, "Facing", r2.RefId(""))
|
|
end
|
|
end
|
|
|
|
----- SET TO WHO -----------------------------------------------------------------------
|
|
function r2.dialogs:setToWho(toWho)
|
|
|
|
-- recover "says what" (equiv change focus)
|
|
self:updateSaysWhat()
|
|
|
|
r2.requestNewAction(i18n.get("uiR2EDChatSetToWhoAction"))
|
|
|
|
local chatStep = self:currentEltInst()
|
|
assert(chatStep)
|
|
|
|
if toWho == i18n.get("uiR2EdNobody"):toUtf8() then toWho="" end
|
|
r2.requestSetNode(chatStep.Actions[0].InstanceId, "Facing", r2.RefId(toWho))
|
|
end
|
|
|
|
-------------------- SAYS WHAT -------------------------------------------
|
|
function r2.dialogs:setSaysWhat(whatText)
|
|
|
|
if whatText == nil then
|
|
whatText = getUICaller().uc_input_string:toUtf8()
|
|
end
|
|
|
|
r2.requestNewAction(i18n.get("uiR2EDChatSetSayWhatAction"))
|
|
|
|
local chatStep = self:currentEltInst()
|
|
if chatStep ~= nil then
|
|
local oldSays = r2:getInstanceFromId(chatStep.Actions[0].Says)
|
|
if (oldSays==nil and whatText~="") or (oldSays~=nil and oldSays.Text~=whatText) then
|
|
|
|
r2.unregisterTextFromId(chatStep.Actions[0].Says)
|
|
local whatId=r2.registerText(whatText).InstanceId
|
|
r2.requestSetNode(chatStep.Actions[0].InstanceId, "Says", whatId)
|
|
end
|
|
end
|
|
|
|
r2.requestEndAction()
|
|
end
|
|
|
|
----- INIT EMOTE MENU ---------------------------------------------------
|
|
function r2.dialogs:initEmoteMenu()
|
|
|
|
local menuName = "ui:interface:r2ed_triggers_menu"
|
|
|
|
local emoteMenu = getUI(menuName)
|
|
local emoteMenu = emoteMenu:getRootMenu()
|
|
assert(emoteMenu)
|
|
|
|
emoteMenu:reset()
|
|
initEmotesMenu(menuName, "r2.dialogs:setEmote")
|
|
r2.logicUI:openLogicMenu(getUICaller())
|
|
end
|
|
|
|
----- SET EMOTE -------------------------------------------------------
|
|
function r2.dialogs:setEmote(emoteId)
|
|
|
|
-- recover "says what" (equiv change focus)
|
|
self:updateSaysWhat()
|
|
|
|
r2.requestNewAction(i18n.get("uiR2EDChatSetEmoteAction"))
|
|
|
|
local chatStep = self:currentEltInst()
|
|
assert(chatStep)
|
|
|
|
r2.requestSetNode(chatStep.Actions[0].InstanceId, "Emote", emoteId)
|
|
end
|
|
|
|
------ REPEAT SEQUENCE -------------------------------------------
|
|
function r2.dialogs:repeatSequence()
|
|
|
|
r2.requestNewAction(i18n.get("uiR2EDChatRepeatSequenceAction"))
|
|
|
|
local dialogInst = self:currentSequInst()
|
|
if dialogInst==nil then return end
|
|
|
|
local sequenceType = 1
|
|
if getUICaller().pushed==true then sequenceType = 0 end
|
|
|
|
r2.requestSetNode(dialogInst.InstanceId, "Repeating", sequenceType)
|
|
end
|
|
|
|
------- UTIL ---------------------------------------------------
|
|
function r2.dialogs:calculMinSec(totalSecNb)
|
|
|
|
assert(totalSecNb)
|
|
local minNb, secNb = 0, totalSecNb
|
|
while secNb > 59 do
|
|
minNb = minNb+1
|
|
secNb = secNb - 60
|
|
end
|
|
|
|
return minNb, secNb
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------------------------
|
|
-------------------------------- CHAT STEP DisplayerProperties------------------------------------
|
|
--------------------------------------------------------------------------------------------------
|
|
local chatStepPropertySheetDisplayerTable = clone(r2:propertySheetDisplayer())
|
|
|
|
------------------------------------------------
|
|
function chatStepPropertySheetDisplayerTable:onPostCreate(instance)
|
|
|
|
if instance.Parent.Parent.InstanceId == r2.dialogs:currentSequInstId() then
|
|
r2.dialogs:newElementUI(instance)
|
|
end
|
|
end
|
|
------------------------------------------------
|
|
function chatStepPropertySheetDisplayerTable:onErase(instance)
|
|
|
|
instance.User.Deleted = true
|
|
|
|
local elementUI = r2.logicUI:findElementUIFromInstance(r2.dialogs, instance)
|
|
|
|
if elementUI then
|
|
r2.dialogs:removeElementUI(elementUI)
|
|
end
|
|
end
|
|
------------------------------------------------
|
|
function chatStepPropertySheetDisplayerTable:onPreHrcMove(instance)
|
|
end
|
|
------------------------------------------------
|
|
function chatStepPropertySheetDisplayerTable:onPostHrcMove(instance)
|
|
|
|
local elementUI = r2.logicUI:findElementUIFromInstance(r2.dialogs, instance)
|
|
if elementUI then
|
|
r2.dialogs:downUpElementUI(elementUI, instance)
|
|
end
|
|
end
|
|
------------------------------------------------
|
|
function chatStepPropertySheetDisplayerTable:onFocus(instance, hasFocus)
|
|
end
|
|
|
|
------------------------------------------------
|
|
function chatStepPropertySheetDisplayerTable:onSelect(instance, isSelected)
|
|
end
|
|
|
|
------------------------------------------------
|
|
function chatStepPropertySheetDisplayerTable:onAttrModified(instance, attributeName)
|
|
|
|
local elementUI = r2.logicUI:findElementUIFromInstance(r2.dialogs, instance)
|
|
if elementUI then
|
|
r2.dialogs:updateElementUI(elementUI)
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------
|
|
function r2:chatStepPropertySheetDisplayer()
|
|
return chatStepPropertySheetDisplayerTable
|
|
end
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------------------------
|
|
-------------------------------- CHAT SEQUENCE DisplayerProperties ---------------------------
|
|
--------------------------------------------------------------------------------------------------
|
|
local chatSequencePropertySheetDisplayerTable = clone(r2:propertySheetDisplayer())
|
|
|
|
------------------------------------------------
|
|
function chatSequencePropertySheetDisplayerTable:onPostCreate(instance)
|
|
end
|
|
------------------------------------------------
|
|
function chatSequencePropertySheetDisplayerTable:onErase(instance)
|
|
|
|
instance.User.Deleted = true
|
|
|
|
local currentDialogId = r2.dialogs:currentSequInstId()
|
|
if currentDialogId ~= instance.InstanceId then return end
|
|
|
|
r2.dialogs:removeSequenceUI(instance)
|
|
end
|
|
------------------------------------------------
|
|
function chatSequencePropertySheetDisplayerTable:onPreHrcMove(instance)
|
|
end
|
|
------------------------------------------------
|
|
function chatSequencePropertySheetDisplayerTable:onPostHrcMove(instance)
|
|
end
|
|
------------------------------------------------
|
|
function chatSequencePropertySheetDisplayerTable:onFocus(instance, hasFocus)
|
|
end
|
|
|
|
------------------------------------------------
|
|
r2.dialogEditorRemainsOpened = false
|
|
function chatSequencePropertySheetDisplayerTable:onSelect(instance, isSelected)
|
|
|
|
r2:logicEntityPropertySheetDisplayer():onSelect(instance, isSelected)
|
|
|
|
local dialogUI = getUI(r2.dialogs.uiId)
|
|
assert(dialogUI)
|
|
|
|
if not isSelected then
|
|
r2.dialogs.keepOpenedEditor = dialogUI.active
|
|
dialogUI.active = false
|
|
|
|
elseif isSelected and r2.dialogs.keepOpenedEditor==true then
|
|
r2.dialogs.keepOpenedEditor = false
|
|
dialogUI.active = true
|
|
r2.dialogs:selectSequence(instance.InstanceId)
|
|
end
|
|
end
|
|
|
|
------------------------------------------------
|
|
function chatSequencePropertySheetDisplayerTable:onAttrModified(instance, attributeName)
|
|
|
|
if attributeName == "Name" or attributeName == "Repeating" then
|
|
|
|
local currentDialogId = r2.dialogs:currentSequInstId()
|
|
if currentDialogId == instance.InstanceId then
|
|
r2.dialogs:updateSequenceUI(instance)
|
|
end
|
|
|
|
if r2.events.filteredLogicEntityId==instance.InstanceId then
|
|
r2.events:updateSequenceUI()
|
|
end
|
|
end
|
|
end
|
|
|
|
------------------------------------------------
|
|
function r2:chatSequencePropertySheetDisplayer()
|
|
return chatSequencePropertySheetDisplayerTable -- returned shared displayer to avoid wasting memory
|
|
end
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------------------------
|
|
-------------------------------- CHAT ACTION DisplayerProperties -----------------------
|
|
--------------------------------------------------------------------------------------------------
|
|
local chatActionPropertySheetDisplayerTable = clone(r2:propertySheetDisplayer())
|
|
|
|
------------------------------------------------
|
|
function chatActionPropertySheetDisplayerTable:onPostCreate(instance)
|
|
end
|
|
------------------------------------------------
|
|
function chatActionPropertySheetDisplayerTable:onErase(instance)
|
|
end
|
|
------------------------------------------------
|
|
function chatActionPropertySheetDisplayerTable:onPreHrcMove(instance)
|
|
end
|
|
------------------------------------------------
|
|
function chatActionPropertySheetDisplayerTable:onPostHrcMove(instance)
|
|
end
|
|
------------------------------------------------
|
|
function chatActionPropertySheetDisplayerTable:onFocus(instance, hasFocus)
|
|
end
|
|
|
|
------------------------------------------------
|
|
function chatActionPropertySheetDisplayerTable:onSelect(instance, isSelected)
|
|
end
|
|
|
|
------------------------------------------------
|
|
function chatActionPropertySheetDisplayerTable:onAttrModified(instance, attributeName)
|
|
end
|
|
|
|
------------------------------------------------
|
|
function chatActionPropertySheetDisplayerTable:onTargetInstanceEraseRequested(instance, refIdName, refIdIndexInArray)
|
|
if refIdName == "Who" then
|
|
r2.requestSetNode(instance.InstanceId, "Who", r2.RefId(""))
|
|
r2.requestSetNode(instance.InstanceId, "WhoNoEntity", "_System")
|
|
elseif refIdName == "Facing" then
|
|
r2.requestSetNode(instance.InstanceId, "Facing", r2.RefId(""))
|
|
end
|
|
end
|
|
------------------------------------------------
|
|
function chatActionPropertySheetDisplayerTable:onTargetInstanceAttrModified(instance, refIdName, refIdIndexInArray, targetAttrName, targetAttrIndexInArray)
|
|
end
|
|
|
|
------------------------------------------------
|
|
function r2:chatActionPropertySheetDisplayer()
|
|
return chatActionPropertySheetDisplayerTable -- returned shared displayer to avoid wasting memory
|
|
end
|