r2.maxActivities = 14 r2.sequencesNb = 0 r2.TimeLimitsProp = { [tostring(i18n.get("uiR2EdNoTimeLimit"))]="No Limit", --["Until a certain time"]="Until", [tostring(i18n.get("uiR2EdWhileChat"))]="Chat", [tostring(i18n.get("uiR2EdForCertainTime"))]="Few Sec" } r2.TimeLimitsCB = { ["No Limit"]=tostring(i18n.get("uiR2EdNoTimeLimit")), --["Until"]="Until a certain time", ["Chat"]=tostring(i18n.get("uiR2EdWhileChat")), ["Few Sec"]=tostring(i18n.get("uiR2EdForCertainTime")), } r2.activityTypeMenu = { ["Inactive"]=tostring(i18n.get("uiR2EdInactive")), ["Stand Still"]=tostring(i18n.get("uiR2EdStandStill")), ["Follow Route"]=tostring(i18n.get("uiR2EdFollowRoad")), ["Patrol"]=tostring(i18n.get("uiR2EdPatrol")), ["Repeat Road"]=tostring(i18n.get("uiR2EdRepeatRoad")), --["Deploy"]=tostring(i18n.get("uiR2EdDeploy")), ["Wander"]=tostring(i18n.get("uiR2EdWander")), ["Stand On Start Point"]=tostring(i18n.get("uiR2EdStandOnStartPoint")), ["Go To Start Point"]=tostring(i18n.get("uiR2EdGoToStartPoint")), ["Go To Zone"]=tostring(i18n.get("uiR2EdGoToZone")), ["Sit Down"]=tostring(i18n.get("uiR2EdSitDown")), ["Stand Up"]=tostring(i18n.get("uiR2EdStandUp")), } r2.fromNPCNameToId = {} r2.fromEmoteIdToName = {} r2.ownCreatedInstances = {} ------------------ INIT TRIGGERS EDITOR ---------------------------------------------------------------- function r2:initTriggersEditor() -- emote local menuName = "ui:interface:r2ed_triggers_menu" local emoteMenu = getUI(menuName) local emoteMenu = emoteMenu:getRootMenu() assert(emoteMenu) emoteMenu:reset() local emoteTable = initEmotesMenu(menuName, "") for id, name in pairs(emoteTable) do r2.fromEmoteIdToName[id] = name end end ------------------ INIT TRIGGERS EDITOR ---------------------------------------------------------------- function r2:initActivityEditor(activityEditor) -- time limit local timeLimitCB = activityEditor:find("time_limit"):find("combo_box") assert(timeLimitCB) timeLimitCB:resetTexts() timeLimitCB:addText(ucstring(i18n.get("uiR2EdNoTimeLimit"))) --timeLimitCB:addText(ucstring("Until a certain time")) timeLimitCB:addText(ucstring(i18n.get("uiR2EdForCertainTime"))) timeLimitCB:addText(ucstring(i18n.get("uiR2EdWhileChat"))) end ---------------------------------------------------------------------------------------------------- function r2:getSelectedEltUI(uiName) local id = r2:getSelectedEltUIId(uiName) if id then return getUI(id) else return nil end end ---------------------------------------------------------------------------------------------------- function r2:getSelectedEltUIId(uiName) if uiName == nil then dumpCallStack(1) assert(false) end local windowUI = getUI("ui:interface:"..uiName) assert(windowUI) return windowUI.Env.selectedElementId end ---------------------------------------------------------------------------------------------------- function r2:setSelectedEltUIId(uiName, eltUIId) local windowUI = getUI("ui:interface:"..uiName) assert(windowUI) windowUI.Env.selectedElementId = eltUIId end ---------------------------------------------------------------------------------------------------- function r2:getSelectedEltInstId(uiName) local element = r2:getSelectedEltUI(uiName) if element ~= nil then return element.Env.elementId else return nil end end ---------------------------------------------------------------------------------------------------- function r2:setSelectedEltInstId(uiName, instId) local element = r2:getSelectedEltUI(uiName) assert(element) element.Env.elementId = instId end ---------------------------------------------------------------------------------------------------- function r2:getSelectedEltInst(uiName) local id = r2:getSelectedEltInstId(uiName) if id then return r2:getInstanceFromId(id) else return nil end end ---------------------------------------------------------------------------------------------------- function r2:getSelectedSequInstId(uiName) local windowUI = getUI("ui:interface:"..uiName) assert(windowUI) local tab = windowUI:find("sequence_tabs") assert(tab) local sequence = windowUI:find(tab.associatedGroupSelection) assert(sequence) if sequence.Env == nil then return nil end return sequence.Env.sequenceId end ---------------------------------------------------------------------------------------------------- function r2:getSelectedSequInst(uiName) local id = r2:getSelectedSequInstId(uiName) if id then return r2:getInstanceFromId(id) else return nil end end ---------------------------------------------------------------------------------------------------- function r2:getSelectedSequ(uiName) local windowUI = getUI("ui:interface:"..uiName) assert(windowUI) local tab = windowUI:find("sequence_tabs") if tab~=nil then local associatedGroup = tab.associatedGroupSelection if associatedGroup == "" then return nil end local sequence = windowUI:find(associatedGroup) assert(sequence) return sequence else return windowUI:find("sequence_elts") end end ---------------------------------------------------------------------------------------------------- function r2:setSelectedSequInstId(uiName, instanceId) local windowUI = getUI("ui:interface:"..uiName) assert(windowUI) local tab = windowUI:find("sequence_tabs") assert(tab) local sequence = windowUI:find(tab.associatedGroupSelection) assert(sequence) sequence.Env.sequenceId = instanceId end ------------------ CLOSE ALL UI -------------------------------------------------------------------- function r2:closeActivitySequenceUI() local window = getUI("ui:interface:r2ed_edit_activity_sequence") if window~=nil then window.active = false r2:openAndUpdateMiniActivityView() end end ------------------ NEW SEQUENCE -------------------------------------------------------------------- function r2:newActivitiesSequence(firstRequest, activitySequence, reset) local triggersUI = getUI("ui:interface:r2ed_triggers") assert(triggersUI) local tab = triggersUI:find("sequence_tabs") assert(tab) if firstRequest and tab.tabButtonNb == 7 then return -1 end if firstRequest == true then activitySequence = r2.newComponent("ActivitySequence") --local name = tostring(i18n.get("uiR2EdSeq"))..tab.tabButtonNb+1 --activitySequence.Name = name local npcGroup = r2:getSelectedInstance() assert(npcGroup) r2.requestInsertNode(npcGroup:getBehavior().InstanceId, "Activities", -1, "", activitySequence) -- r2.requestInsertNode(npcGroup.InstanceId,"ActivitiesId",-1,"",activitySequence.InstanceId) -- r2.requestInsertNode(r2:getCurrentAct().InstanceId,"ActivitiesIds",-1,"",activitySequence.InstanceId) r2.ownCreatedInstances[activitySequence.InstanceId] = true return activitySequence.InstanceId else local updateMiniActivityView = r2.ownCreatedInstances[activitySequence.InstanceId] if reset then r2.ownCreatedInstances[activitySequence.InstanceId] = true end local templateParams = { newElt="r2:newActivity(true)", newEltText=tostring(i18n.get("uiR2EdNewActivity")), eltOrderText=tostring(i18n.get("uiR2EdActivityOrder")), upElt="r2:upActivity()", downElt="r2:downActivity()", maxMinElts="r2:maximizeMinimizeActivities()", downUpColor="200 120 80 255", colPushed = "200 80 80 255", paramsL= "r2:selectSequenceTab('r2ed_triggers', "..tostring(tab.tabButtonNb)..")" } local editorEltTemplate = "template_edit_activity" local sequence = r2:newElementsSequence("r2ed_triggers", templateParams, editorEltTemplate, activitySequence, tostring(i18n.get("uiR2EdSeq"))) r2:initActivityEditor(sequence:find("edit_element")) local activities = activitySequence.Components for a = 0, activities.Size - 1 do r2:newActivity(false, nil, activities[a]) end -- new MiniActivity sequence if updateMiniActivityView==true then --r2:updateSequencesButtonBar(tab.tabButtonNb-1, activitySequence.Name) r2:updateSequencesButtonBar(tab.tabButtonNb-1, r2:getSequenceName(activitySequence)) r2:openAndUpdateMiniActivityView() end end end ------------------ REMOVE SEQUENCE ----------------------------------------------------------------- function r2:removeActivitiesSequence() local sequenceId = r2:removeElementsSequence("r2ed_triggers", "Activities", tostring(i18n.get("uiR2EdSeq"))) -- local group = r2:getSelectedInstance() -- assert(group) -- local sequenceIndex = -1 -- for i=0,group.ActivitiesId.Size-1 do -- if group.ActivitiesId[i] == sequenceId then -- sequenceIndex = i -- break -- end -- end -- if sequenceIndex ~= -1 then -- r2.requestEraseNode(group.InstanceId, "ActivitiesId", sequenceIndex) -- end -- -- local currentAct = r2:getCurrentAct() -- sequenceIndex = -1 -- for i=0,currentAct.ActivitiesIds.Size-1 do -- if currentAct.ActivitiesIds[i] == sequenceId then -- sequenceIndex = i -- break -- end -- end -- if sequenceIndex ~= -1 then -- r2.requestEraseNode(currentAct.InstanceId, "ActivitiesIds", sequenceIndex) -- end end function r2:removeActivitiesSequenceUI(tabIndex) local firstEltName = r2:removeElementsSequenceUI(tabIndex, "r2ed_triggers", "Activities", tostring(i18n.get("uiR2EdSeq"))) r2:updateSequencesButtonBar(0, firstEltName) end ------------------ SELECT ACTIVITY ------------------------------------------------------------------ function r2:selectActivity() r2:selectTriggerElement(nil, "r2ed_triggers") if getUICaller().pushed == true then r2:updateActivityEditor() end end ------------------ NEW ACTIVITY -------------------------------------------------------------------- function r2:newActivity(firstRequest, tableInit, instanceElement, sequenceUI, sequenceInstId) local uiName = "r2ed_triggers" if sequenceUI == nil then sequenceUI = r2:getSelectedSequ(uiName) end local activityList if sequenceUI~=nil then activityList = sequenceUI:find("elements_list") assert(activityList) if activityList.childrenNb-1 == r2.maxActivities then return false end end if firstRequest == true then instanceElement = r2.newComponent("ActivityStep") if tableInit ~= nil then instanceElement.Activity = tableInit.Activity instanceElement.ActivityZoneId = r2.RefId(tableInit.ActivityZoneId) instanceElement.TimeLimit = tableInit.TimeLimit instanceElement.TimeLimitValue = tableInit.TimeLimitValue else instanceElement.TimeLimit = "No Limit" instanceElement.Activity = "Stand Still" end if sequenceInstId == nil then sequenceInstId = r2:getSelectedSequInstId(uiName) end assert(sequenceInstId) r2.requestInsertNode(sequenceInstId, "Components", -1, "", instanceElement) r2.ownCreatedInstances[instanceElement.InstanceId] = true else local templateParams = { selectElt="r2:selectActivity()", openEltEditor="r2:openActivityEditor()", maxMinElt="r2:maximizeMinimizeActivity()", removeElt="r2:removeActivity()", colOver="200 120 80 120", colPushed="200 120 80 255" } local element = r2:newTriggerElement(uiName, tostring(i18n.get("uiR2EdActivity")), templateParams, sequenceUI, instanceElement.InstanceId) r2:updateActivityChatSequence(element) -- active chat button if a chat sequence is associated to this activity if instanceElement.Chat ~= "" then local activityEditor = sequenceUI:find("edit_element") assert(activityEditor) local chatButtonEditor = activityEditor:find("open_chat_sequence") assert(chatButtonEditor) chatButtonEditor.active = true end end return true end function r2:buildActivityTitle(activityUI, erase) local activityInst = r2:getInstanceFromId(activityUI.Env.elementId) assert(activityInst) -- part1 local index = r2:searchElementIndex(activityInst) if erase==true then index = index-1 end local part1 = tostring(i18n.get("uiR2EdActivity")).." "..index.." : " -- part2 if not r2.activityTypeMenu[activityInst.Activity] then debugInfo(colorTag(255,0,0).."The activity '".. activityInst.Activity.."' is not properly registred") end local part2 = r2.activityTypeMenu[activityInst.Activity].." " if activityInst.ActivityZoneId~= "" then local place = r2:getInstanceFromId(tostring(activityInst.ActivityZoneId)) if place~=nil then part2 = part2.. place.Name .." " end end -- part3 local part3 = "" if activityInst.TimeLimit == "Few Sec" then local hourNb, minNb, secNb = r2:calculHourMinSec(tonumber(activityInst.TimeLimitValue)) local timeLimitText = tostring(i18n.get("uiR2EdFor")) .. " " if hourNb ~= 0 then timeLimitText = timeLimitText .. hourNb .. tostring(i18n.get("uiR2EdShortHours")) .. " " end if minNb ~= 0 then timeLimitText = timeLimitText .. minNb .. tostring(i18n.get("uiR2EdShortMinutes")) .. " " end timeLimitText = timeLimitText .. secNb .. tostring(i18n.get("uiR2EdShortSeconds")) part3 = timeLimitText elseif r2.TimeLimitsCB[activityInst.TimeLimit] ~= nil then part3 = string.lower(r2.TimeLimitsCB[activityInst.TimeLimit]) end -- title local title = activityUI:find("title") assert(title) title.uc_hardtext= part1..part2..part3 end function r2:getActivityName(activityInst) -- part1 local index = r2:searchElementIndex(activityInst) if erase==true then index = index-1 end local part1 = tostring(i18n.get("uiR2EdActivity")).." "..index.." : " -- part2 if not r2.activityTypeMenu[activityInst.Activity] then debugInfo(colorTag(255,0,0).."The activity '".. activityInst.Activity.."' is not properly registred") end local part2 = r2.activityTypeMenu[activityInst.Activity].." " if activityInst.ActivityZoneId~= "" then local place = r2:getInstanceFromId(tostring(activityInst.ActivityZoneId)) if place~=nil then part2 = part2.. place.Name .." " end end -- part3 local part3 = "" if activityInst.TimeLimit == "Few Sec" then local hourNb, minNb, secNb = r2:calculHourMinSec(tonumber(activityInst.TimeLimitValue)) local timeLimitText = tostring(i18n.get("uiR2EdFor")) .. " " if hourNb ~= 0 then timeLimitText = timeLimitText .. hourNb .. tostring(i18n.get("uiR2EdShortHours")) .. " " end if minNb ~= 0 then timeLimitText = timeLimitText .. minNb .. tostring(i18n.get("uiR2EdShortMinutes")) .. " " end timeLimitText = timeLimitText .. secNb .. tostring(i18n.get("uiR2EdShortSeconds")) part3 = timeLimitText elseif r2.TimeLimitsCB[activityInst.TimeLimit] ~= nil then part3 = string.lower(r2.TimeLimitsCB[activityInst.TimeLimit]) end return part1..part2..part3 end function r2:getElementName(elementInst) if elementInst:isKindOf("ActivityStep") then return r2:getActivityName(elementInst) elseif elementInst:isKindOf("ChatStep") then return r2:getChatName(elementInst) elseif elementInst:isKindOf("LogicEntityAction") then return r2:getActionName(elementInst) elseif elementInst:isKindOf("LogicEntityReaction") then return r2:getReactionName(elementInst) elseif elementInst:isKindOf("ChatSequence") or elementInst:isKindOf("ActivitySequence") then return r2:getSequenceName(elementInst) end return "" end function r2:updateActivityChatSequence(elementUI, canceledChatStepId) if elementUI == nil then elementUI = r2:getSelectedEltUI("r2ed_triggers") end assert(elementUI) local instance = r2:getInstanceFromId(elementUI.Env.elementId) assert(instance) local chatSequence = r2:getInstanceFromId(tostring(instance.Chat)) local activityText = elementUI:find("text_list") assert(activityText) local sep = elementUI:find("sep") assert(sep) activityText:clear() if chatSequence ~= nil then local counterTime = 0 if chatSequence.Components.Size > 0 then local emptyText = true activityText:addColoredTextChild("\n"..tostring(i18n.get("uiR2EdSequenceStart")), 255, 175, 135, 255) for c = 0, chatSequence.Components.Size - 1 do local chat = chatSequence.Components[c] if chat.InstanceId ~= canceledChatStepId then counterTime = counterTime + tonumber(chat.Time) local firstLine = true local who = tostring(chat.Actions[0].Who) if who ~= "" then local facing = tostring(chat.Actions[0].Facing) local emote = chat.Actions[0].Emote local says = chat.Actions[0].Says local minNb, secNb = r2:calculMinSec(counterTime) local countInfo = "*" if minNb ~= 0 then countInfo = countInfo..tostring(minNb)..tostring(i18n.get("uiR2EdShortMinutes")) end countInfo = countInfo.." "..tostring(secNb)..tostring(i18n.get("uiR2EdShortSeconds"))..":" if facing ~= "" then facing = r2:getInstanceFromId(who).Name .. " "..tostring(i18n.get("uiR2EdFaces")).." " .. r2:getInstanceFromId(facing).Name if firstLine then activityText:addColoredTextChild(countInfo, 220, 140, 100, 255) firstLine = false end activityText:addTextChild(ucstring(facing)) emptyText = false end if r2.fromEmoteIdToName[emote] ~= nil then emote = r2:getInstanceFromId(who).Name .. " "..string.lower(tostring(i18n.get("uiR2EdEmote"))).." : " .. r2.fromEmoteIdToName[emote] if firstLine then activityText:addColoredTextChild(countInfo, 220, 140, 100, 255) firstLine = false end activityText:addTextChild(ucstring(emote)) emptyText = false end if r2:getInstanceFromId(says)~=nil and r2:getInstanceFromId(says).Text ~= "" then says = r2:getInstanceFromId(who).Name .. " "..tostring(i18n.get("uiR2EdSays")).." : " .. r2:getInstanceFromId(says).Text if firstLine then activityText:addColoredTextChild(countInfo, 220, 140, 100, 255) firstLine = false end activityText:addTextChild(ucstring(says)) emptyText = false end end end end if emptyText == true then activityText:clear() sep.active = false else sep.active = true local hourNb, minNb, secNb = r2:calculHourMinSec(counterTime) local totalChatTime = "" if hourNb ~= 0 then totalChatTime = tostring(hourNb)..tostring(i18n.get("uiR2EdShortHours")) end if minNb ~= 0 then totalChatTime = totalChatTime.." "..tostring(minNb)..tostring(i18n.get("uiR2EdShortMinutes")) end totalChatTime = totalChatTime.." "..tostring(secNb)..tostring(i18n.get("uiR2EdShortSeconds")) activityText:addColoredTextChild(tostring(i18n.get("uiR2EdSequenceEnd")).." (".. totalChatTime ..")\n", 255, 175, 135, 255) end end else sep.active = false end --update title r2:buildActivityTitle(elementUI, false) if r2:getSelectedEltInstId("r2ed_triggers") == instance.InstanceId then local eltEditor = r2:getSelectedSequ("r2ed_triggers"):find("edit_element") assert(eltEditor) r2:updateActivityEditor() end r2:updateMiniActivityView() end function r2:updateActivitiesWhithThisChatSequence(chatStep, canceled) local chatSequenceId = chatStep.Parent.Parent.InstanceId local chatStepId = nil if canceled == true then chatStepId = chatStep.InstanceId end local triggersUI = getUI("ui:interface:r2ed_triggers") assert(triggersUI) local tab = triggersUI:find("sequence_tabs") assert(tab) for s = 0,tab.tabButtonNb-1 do local activitySequence = tab:getGroup(s) assert(activitySequence) local activityList = activitySequence:find("elements_list") assert(activityList) for a=0, activityList.childrenNb-1 do local activity = activityList:getChild(a) assert(activity) if activity.Env.elementId~=nil then local activityInst = r2:getInstanceFromId(activity.Env.elementId) assert(activityInst) if tostring(activityInst.Chat) == chatSequenceId then r2:updateActivityChatSequence(activity, chatStepId) end end end end end ------------------ REMOVE ACTIVITY ------------------------------------------------------------------ function r2:removeActivity() r2:removeTriggerElement("r2ed_triggers", tostring(i18n.get("uiR2EdActivity"))) end function r2:removeActivityUI(sequenceUI, elementUI) r2:removeElementUI(sequenceUI, "r2ed_triggers", elementUI) r2:closeActivitySequenceUI() local activityList = sequenceUI:find("elements_list") assert(activityList) end ------------------ UP ACTIVITY ----------------------------------------------------------------------- function r2:upActivity() r2:upTriggerElement("r2ed_triggers") end ------------------ DOWN ACTIVITY --------------------------------------------------------------------- function r2:downActivity() r2:downTriggerElement("r2ed_triggers") end ------------------ MAXIMIZE MINIMIZE ACTIVITIES ------------------------------------------------------ function r2:maximizeMinimizeActivities() r2:maximizeMinimizeTriggerElements("r2ed_triggers") end ------------------ MAXIMIZE MINIMIZE ACTIVITY ------------------------------------------------------ function r2:maximizeMinimizeActivity() r2:maximizeMinimizeElement("r2ed_triggers") end ------------------ OPEN ACTIVITY EDITOR ---------------------------------------------------------------- function r2:openActivityEditor() r2:updateActivityEditor() r2:openElementEditor("r2ed_triggers", "uiR2EDActivityStepEditor") end function r2:updateActivityEditor() local uiName = "r2ed_triggers" local instanceActivity = r2:getSelectedEltInst(uiName) local activityEditor = r2:getSelectedSequ(uiName):find("edit_element") assert(activityEditor) -- activity name local activityName = activityEditor:find("name") assert(activityName) -- activity type local activityButtonText = activityEditor:find("activity"):find("text") assert(activityButtonText) -- time limit local comboBox = activityEditor:find("time_limit").combo_box assert(comboBox) -- chat sequence local chatMenuButton = activityEditor:find("chat_script"):find("menu"):find("text") assert(chatMenuButton) local chatButtonEditor = activityEditor:find("open_chat_sequence") assert(chatButtonEditor) if instanceActivity then local index = r2:searchElementIndex(instanceActivity) if index~= nil then activityName.uc_hardtext = tostring(i18n.get("uiR2EdActivity")).." "..index.." : " else activityName.uc_hardtext = tostring(i18n.get("uiR2EdActivity")).." : " end -- activity type local activityText = r2.activityTypeMenu[instanceActivity.Activity] if activityText then activityButtonText.uc_hardtext = activityText end if instanceActivity.ActivityZoneId ~= "" then local place = r2:getInstanceFromId(instanceActivity.ActivityZoneId) assert(place) activityButtonText.uc_hardtext = activityButtonText.hardtext .. " " .. place.Name end -- time limit local timeLimit = instanceActivity.TimeLimit local certainTime = activityEditor:find("certain_time") assert(certainTime) comboBox.Env.locked = true if timeLimit == "Few Sec" then local timeLimitValue = tonumber(instanceActivity.TimeLimitValue) if timeLimitValue ~= nil then local hoursNb, minNb, secNb = r2:calculHourMinSec(timeLimitValue) local timeLimitText = tostring(i18n.get("uiR2EdFor")) .. " " if hoursNb ~= 0 then timeLimitText = timeLimitText .. hoursNb .. tostring(i18n.get("uiR2EdShortHours")) .. " " end if minNb ~= 0 then timeLimitText = timeLimitText .. minNb .. tostring(i18n.get("uiR2EdShortMinutes")) .. " " end timeLimitText = timeLimitText .. secNb .. tostring(i18n.get("uiR2EdShortSeconds")) certainTime.active = true local hoursMenu = certainTime:find("hours"):find("text") assert(hoursMenu) hoursMenu.uc_hardtext = tostring(hoursNb) local minutesMenu = certainTime:find("minutes"):find("text") assert(minutesMenu) minutesMenu.uc_hardtext = tostring(minNb) local secondsMenu = certainTime:find("seconds"):find("text") assert(secondsMenu) secondsMenu.uc_hardtext = tostring(secNb) comboBox.view_text = timeLimitText end else certainTime.active = false timeLimit = r2.TimeLimitsCB[timeLimit] if timeLimit~= nil then comboBox.selection_text = timeLimit end end comboBox.Env.locked = false -- chat sequence TEMP TEMP TEMP TEMP local sequenceChat = r2:getInstanceFromId(tostring(instanceActivity.Chat)) local repeatLabelButton = activityEditor:find("repeat") assert(repeatLabelButton) if sequenceChat ~= nil then --chatMenuButton.uc_hardtext = sequenceChat.Name chatMenuButton.uc_hardtext = r2:getSequenceName(sequenceChat) repeatLabelButton.active = true local repeatButton = repeatLabelButton:find("toggle_butt") assert(repeatButton) repeatButton.pushed = not (instanceActivity.Type == "Repeating") chatButtonEditor.active = true else repeatLabelButton.active = false chatMenuButton.uc_hardtext = i18n.get("uiR2EdNoElt") chatButtonEditor.active = false end -- TEMP TEMP TEMP else local name = tostring(i18n.get("uiR2EdActivity")).." : " activityName.uc_hardtext = name activityButtonText.uc_hardtext = i18n.get("uiR2EdStandStill") comboBox.selection_text = i18n.get("uiR2EdNoTimeLimit") chatMenuButton.uc_hardtext = i18n.get("uiR2EdNoElt") chatButtonEditor.active = false end end ------------------ REPEAT ACTIVITY SEQUENCE ------------------------------------------------------------- function r2:repeatActivitySequence() r2.requestNewAction(i18n.get("uiR2EDRepeatActivitySequenceAction")) local sequenceInstId = r2:getSelectedSequInstId("r2ed_triggers") assert(sequenceInstId) local sequenceType = not getUICaller().pushed if sequenceType==false then sequenceType=0 else sequenceType=1 end r2.requestSetNode(sequenceInstId, "Repeating", sequenceType) end ------------------ CLOSE ACTIVITY EDITOR ---------------------------------------------------------------- function r2:closeChatSequencesUI() local window = getUI("ui:interface:r2ed_chat_sequence") assert(window) window.active = false window = getUI("ui:interface:r2ed_edit_chat_sequence") assert(window) window.active = false end ------------------ OPEN ACTIVITY MENU ------------------------------------------------------------------- function r2:openActivityMenu() local menuName = "ui:interface:r2ed_triggers_menu" local activityMenu = getUI(menuName) local activityMenu = activityMenu:getRootMenu() assert(activityMenu) activityMenu:reset() -- Inactive -- activityMenu:addLine(ucstring(i18n.get("uiR2EdInactive")), "lua", "r2:setActivity('Inactive')", "Inactive") -- Stand still activityMenu:addLine(ucstring(i18n.get("uiR2EdStandStill")), "lua", "r2:setActivity('Stand Still')", "Stand Still") -- Follow route activityMenu:addLine(ucstring(i18n.get("uiR2EdFollowRoad")), "", "", "Follow Route") local menuButton = createGroupInstance("r2_menu_button", "", { bitmap = "r2ed_icon_road.tga", size="14" }) activityMenu:setUserGroupLeft(1, menuButton) activityMenu:addSubMenu(1) local roadsMenu = activityMenu:getSubMenu(1) local roadsTable = r2.Scenario:getAllInstancesByType("Road") for key, road in pairs(roadsTable) do roadsMenu:addLine(ucstring(road.Name), "lua", "r2:setActivity('Follow Route', '".. road.InstanceId .."')", road.InstanceId) end if table.getn(roadsTable) == 0 then roadsMenu:addLine(ucstring(i18n.get("uiR2EdNoSelelection")), "lua", "r2:setActivity()", "") end -- Patrol activityMenu:addLine(ucstring(i18n.get("uiR2EdPatrol")), "", "", "Patrol") menuButton = createGroupInstance("r2_menu_button", "", { bitmap = "r2ed_icon_road.tga", size="14"}) activityMenu:setUserGroupLeft(2, menuButton) activityMenu:addSubMenu(2) roadsMenu = activityMenu:getSubMenu(2) for key, road in pairs(roadsTable) do roadsMenu:addLine(ucstring(road.Name), "lua", "r2:setActivity('Patrol', '".. road.InstanceId .."')", road.InstanceId) end if table.getn(roadsTable) == 0 then roadsMenu:addLine(ucstring(i18n.get("uiR2EdNoSelelection")), "lua", "r2:setActivity()", "") end -- Repeat Road activityMenu:addLine(ucstring(i18n.get("uiR2EdRepeatRoad")), "", "", "Repeat Road") menuButton = createGroupInstance("r2_menu_button", "", { bitmap = "r2ed_icon_road.tga", size="14"}) activityMenu:setUserGroupLeft(3, menuButton) activityMenu:addSubMenu(3) roadsMenu = activityMenu:getSubMenu(3) for key, road in pairs(roadsTable) do roadsMenu:addLine(ucstring(road.Name), "lua", "r2:setActivity('Repeat Road', '".. road.InstanceId .."')", road.InstanceId) end if table.getn(roadsTable) == 0 then roadsMenu:addLine(ucstring(i18n.get("uiR2EdNoSelelection")), "lua", "r2:setActivity()", "") end -- Wander activityMenu:addLine(ucstring(i18n.get("uiR2EdWander")), "", "", "Wander") menuButton = createGroupInstance("r2_menu_button", "", { bitmap = "r2ed_icon_region.tga", size="14"}) activityMenu:setUserGroupLeft(4, menuButton) activityMenu:addSubMenu(4) local regionsMenu = activityMenu:getSubMenu(4) local regionsTable = r2.Scenario:getAllInstancesByType("Region") for key, region in pairs(regionsTable) do regionsMenu:addLine(ucstring(region.Name), "lua", "r2:setActivity('Wander', '".. region.InstanceId .."')", region.InstanceId) end if table.getn(regionsTable) == 0 then regionsMenu:addLine(ucstring(i18n.get("uiR2EdNoSelelection")), "lua", "r2:setActivity()", "") end -- Deploy -- activityMenu:addLine(ucstring(i18n.get("uiR2EdDeploy")), "", "", "Deploy") -- menuButton = createGroupInstance("r2_menu_button", "", { bitmap = "r2ed_icon_region.tga", size="14"}) -- activityMenu:setUserGroupLeft(6, menuButton) -- activityMenu:addSubMenu(6) -- local regionsMenu = activityMenu:getSubMenu(6) -- local regionsTable = r2.Scenario:getAllInstancesByType("Region") -- for key, region in pairs(regionsTable) do -- regionsMenu:addLine(ucstring(region.Name), "lua", "r2:setActivity('Deploy', '".. region.InstanceId .."')", region.InstanceId) -- end -- if table.getn(regionsTable) == 0 then -- regionsMenu:addLine(ucstring(i18n.get("uiR2EdNoSelelection")), "lua", "r2:setActivity()", "") -- end r2:openTriggersMenu(getUICaller()) end function r2:setActivity(activityType, placeId) local activityInstId = r2:getSelectedEltInstId("r2ed_triggers") assert(activityInstId) if activityType == nil then return elseif placeId == nil then r2.requestSetNode(activityInstId, "Activity", activityType) r2.requestSetNode(activityInstId, "ActivityZoneId", r2.RefId("")) else r2.requestSetNode(activityInstId, "Activity", activityType) r2.requestSetNode(activityInstId, "ActivityZoneId", r2.RefId(placeId)) end end ------------------ SET TIME LIMIT -------------------------------------------------------------------- function r2:setTimeLimit(timeLimit) if timeLimit == nil then timeLimit = getUICaller().selection_text if getUICaller().Env.locked then return end end local uiName = "r2ed_triggers" local activity = r2:getSelectedEltUI(uiName) if activity == nil then return end local viewText local hasTimeLimitValue = false if timeLimit == tostring(i18n.get("uiR2EdForCertainTime")) then hasTimeLimitValue = true viewText = tostring(i18n.get("uiR2EdFor")) .. " 20" .. tostring(i18n.get("uiR2EdShortSeconds")) local eltEditor = r2:getSelectedSequ(uiName):find("edit_element") assert(eltEditor) local comboTime = eltEditor:find("time_limit"):find("combo_box") assert(comboTime) comboTime.view_text = viewText else viewText = timeLimit end timeLimit = r2.TimeLimitsProp[timeLimit] local activityInstId = r2:getSelectedEltInstId(uiName) r2.requestSetNode(activityInstId, "TimeLimit", timeLimit) if hasTimeLimitValue then r2.requestSetNode(activityInstId, "TimeLimitValue", tostring(20)) else r2.requestSetNode(activityInstId, "TimeLimitValue", "") end end function r2:calculHourMinSec(totalSecNb) local minSecNb, hourNb = totalSecNb, 0 while minSecNb > 3599 do hourNb = hourNb+1 minSecNb = minSecNb - 3600 end local minNb, secNb = 0, minSecNb while secNb > 59 do minNb = minNb+1 secNb = secNb - 60 end return hourNb, minNb, secNb end function r2:calculMinSec(totalSecNb) local minNb, secNb = 0, totalSecNb while secNb > 59 do minNb = minNb+1 secNb = secNb - 60 end return minNb, secNb end function r2:activityForHours(hourNb) local activityInst = r2:getSelectedEltInst("r2ed_triggers") assert(activityInst) local lastHourNb, minNb, secNb = r2:calculHourMinSec(tonumber(activityInst.TimeLimitValue)) r2:setLimitTimeValue(hourNb, minNb, secNb) end function r2:activityForMinutes(minNb) local activityInst = r2:getSelectedEltInst("r2ed_triggers") assert(activityInst) local hoursNb, lastMinNb, secNb = r2:calculHourMinSec(tonumber(activityInst.TimeLimitValue)) r2:setLimitTimeValue(hoursNb, minNb, secNb) end function r2:activityForSeconds(secNb) local activityInst = r2:getSelectedEltInst("r2ed_triggers") assert(activityInst) local hoursNb, minNb, lastSecNb = r2:calculHourMinSec(tonumber(activityInst.TimeLimitValue)) r2:setLimitTimeValue(hoursNb, minNb, secNb) end ------------------ SET LIMIT TIME VALUE ------------------------------------------------------------------- function r2:setLimitTimeValue(hourNb, minNb, secNb) local totalSec = tostring(hourNb*3600 + minNb*60 + secNb) r2.requestSetNode(r2:getSelectedEltInstId("r2ed_triggers"), "TimeLimitValue", totalSec) end ------------------ OPEN SELECT CHAT MENU ------------------------------------------------------------------- function r2:openSelectChatMenu() -- triggers menu initialization local chatMenu = getUI("ui:interface:r2ed_triggers_menu") assert(chatMenu) local chatMenu = chatMenu:getRootMenu() assert(chatMenu) chatMenu:reset() -- first line "None" chatMenu:addLine(ucstring(i18n.get("uiR2EdNoElt")), "lua", "r2:selectChatSequence('None')", "None") -- second line "More" chatMenu:addLine(ucstring(i18n.get("uiR2EdMore")), "lua", "r2:openChatSequences()", "More") local entityInst = r2:getSelectedInstance() assert(entityInst) -- list of avoidable chat sequences local chatSequences = entityInst:getBehavior().ChatSequences for i=0, chatSequences.Size-1 do local chatS = chatSequences[i] assert(chatS) --chatMenu:addLine(ucstring(chatS.Name), "lua", "r2:selectChatSequence('" .. chatS.InstanceId .. "')", chatS.InstanceId) chatMenu:addLine(ucstring(r2:getSequenceName(chatS)), "lua", "r2:selectChatSequence('" .. chatS.InstanceId .. "')", chatS.InstanceId) end r2:openTriggersMenu(getUICaller()) end function r2:openChatSequences() local chatSequencesUI = getUI("ui:interface:r2ed_chat_sequence") assert(chatSequencesUI) chatSequencesUI.active = true chatSequencesUI:updateCoords() if chatSequencesUI.Env.openFirst == nil then chatSequencesUI:center() chatSequencesUI.Env.openFirst = true end end ----------------------------------------------------------------------------------------------------------- -- the commun "logic entity" menu is open function r2:openTriggersMenu(caller) local menuName = "ui:interface:r2ed_triggers_menu" launchContextMenuInGame(menuName) local menu = getUI(menuName) menu:updateCoords() menu.y = caller.y_real - (menu.h + 2) menu.x = caller.x_real menu:setMinW(caller.w) menu:updateCoords() end ------------------ SELECT CHAT SEQUENCE ------------------------------------------------------------- function r2:selectChatSequence(choice, activityId) local chatSequenceUI = getUI("ui:interface:r2ed_chat_sequence") assert(chatSequenceUI) local uiName = "r2ed_triggers" if activityId == nil then activityId = r2:getSelectedEltInstId(uiName) end local activityUI = r2:getSelectedEltUI(uiName) assert(activityUI) if choice == "None" then r2.requestSetNode(activityId, "Chat", r2.RefId("")) local sep = activityUI:find("sep") assert(sep) sep.active = false elseif choice == "More" then r2:openChatSequences() elseif choice then local chatSId = choice local activityInstId = r2:getSelectedEltInstId(uiName) r2.requestSetNode(activityId, "Chat", r2.RefId(chatSId)) r2.requestSetNode(activityInstId, "Type", "Non Repeating") else debugInfo("r2:selectChatSequence : unknown menu selection") end end ------------------ REPEAT OR NOT CHAT SEQUENCE ------------------------------------------------------ function r2:repeatChatSequence() local activityInstId = r2:getSelectedEltInstId("r2ed_triggers") assert(activityInstId) local sequenceType = "Repeating" if getUICaller().pushed then sequenceType = "Non Repeating" end r2.requestSetNode(activityInstId, "Type", sequenceType) end ------------------ NEW CHAT SEQUENCE ------------------------------------------------------------- function r2:newChatsSequence(firstRequest, instanceSequence, reset) local chatSequencesUI = getUI("ui:interface:r2ed_chat_sequence") assert(chatSequencesUI) local tab = chatSequencesUI:find("sequence_tabs") assert(tab) -- limit sequences number if firstRequest and tab.tabButtonNb == 7 then return -1 end if firstRequest == true then instanceSequence = r2.newComponent("ChatSequence") --local name = tostring(i18n.get("uiR2EdChat"))..tab.tabButtonNb+1 --instanceSequence.Name = name local npcGroup = r2:getSelectedInstance() assert(npcGroup) r2.requestInsertNode(npcGroup:getBehavior().InstanceId, "ChatSequences", -1, "", instanceSequence) r2.ownCreatedInstances[instanceSequence.InstanceId] = true else local templateParams = { newElt="r2:newChat(true)", newEltText=tostring(i18n.get("uiR2EdNewChat")), eltOrderText=tostring(i18n.get("uiR2EdChatOrder")), upElt="r2:upChat()", downElt="r2:downChat()", maxMinElts="r2:maximizeMinimizeChats()", downUpColor="120 150 140 255", colPushed = "0 255 0 255", paramsL= "r2:selectSequenceTab('r2ed_chat_sequence', "..tostring(tab.tabButtonNb)..")" } if reset == true then r2.ownCreatedInstances[instanceSequence.InstanceId] = true end local editorEltTemplate = "template_edit_chat" local sequence = r2:newElementsSequence("r2ed_chat_sequence", templateParams, editorEltTemplate, instanceSequence, tostring(i18n.get("uiR2EdSequChat"))) local chats = instanceSequence.Components for c = 0, chats.Size - 1 do r2:newChat(false, chats[c]) end local eltEditor = sequence:find("edit_element") assert(eltEditor) local editBox = eltEditor:find("edit_box_group") assert(editBox) local scroll = sequence:find("edit_box_scroll_ed") assert(scroll) scroll:setTarget(editBox.id) end return instanceSequence.InstanceId end ------------------- REMOVE CHATS SEQUENCE --------------------------------------------------------- function r2:removeChatsSequence() -- remove sequence r2:removeElementsSequence("r2ed_chat_sequence", "ChatSequences", tostring(i18n.get("uiR2EdSequChat"))) end function r2:removeChatsSequenceUI(sequIndex) r2:closeChatEditor() -- remove sequence UI r2:removeElementsSequenceUI(sequIndex, "r2ed_chat_sequence", "ChatSequences", tostring(i18n.get("uiR2EdSequChat"))) end ------------------- SELECT CHAT ------------------------------------------------------------------- function r2:selectChat() r2:selectTriggerElement(nil, "r2ed_chat_sequence") if getUICaller().pushed == true then r2:updateChatEditor() end end ------------------- OPEN CHAT EDITOR -------------------------------------------------------------- function r2:openChatEditor() r2:updateChatEditor() r2:openElementEditor("r2ed_chat_sequence", "uiR2EDChatStepEditor") end function r2:updateChatEditor() local instanceChat = r2:getSelectedEltInst("r2ed_chat_sequence") local chatEditor = r2:getSelectedSequ("r2ed_chat_sequence"):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 index = r2:searchElementIndex(instanceChat) if index~= nil then chatName.uc_hardtext = tostring(i18n.get("uiR2EdChat")).." "..index.." : " else chatName.uc_hardtext = tostring(i18n.get("uiR2EdChat")).." : " end -- after value local time = instanceChat.Time local minNb, secNb = r2:calculMinSec(time) minutesText.uc_hardtext = tostring(minNb) secondsText.uc_hardtext = tostring(secNb) -- who local whoInst = r2:getInstanceFromId(tostring(instanceChat.Actions[0].Who)) whoMenuText.uc_hardtext = whoInst.Name -- says what local textID = instanceChat.Actions[0].Says if textID ~= "" then editBox.uc_input_string = r2:getInstanceFromId(textID).Text else editBox.uc_input_string = "" end -- to who local toWhoInst = r2:getInstanceFromId(tostring(instanceChat.Actions[0].Facing)) if toWhoInst then toWhoMenuText.uc_hardtext = toWhoInst.Name else toWhoMenuText.uc_hardtext = tostring(i18n.get("uiR2EdNobody")) end -- emote local emoteName = r2.fromEmoteIdToName[instanceChat.Actions[0].Emote] if emoteName then emoteButtonText.uc_hardtext = emoteName else emoteButtonText.uc_hardtext = tostring(i18n.get("uiR2EdNoElt")) end else local name = tostring(i18n.get("uiR2EdChat")).." : " chatName.uc_hardtext = name minutesText.uc_hardtext = tostring(0) secondsText.uc_hardtext = tostring(0) whoMenuText.uc_hardtext = "" editBox.uc_input_string = "" toWhoMenuText.uc_hardtext = tostring(i18n.get("uiR2EdNobody")) emoteButtonText.uc_hardtext = tostring(i18n.get("uiR2EdNoElt")) end end ------------------ OPEN CHAT SEQUENCE EDITOR -------------------------------------------------- function r2:openChatSequenceEditor() local editor = getUI("ui:interface:r2ed_edit_chat_sequence") assert(editor) local chatsUI = getUI("ui:interface:r2ed_chat_sequence") assert(chatsUI) editor.x = chatsUI.x editor.y = chatsUI.y editor.active = true end ------------------- MAX / MIN CHAT ---------------------------------------------------------------- function r2:maximizeMinimizeChat() r2:maximizeMinimizeElement("r2ed_chat_sequence") end -------------------- NEW CHAT --------------------------------------------------------------------- function r2:newChat(firstRequest, instanceElement, sequenceUI) local uiName = "r2ed_chat_sequence" if firstRequest == true then instanceElement = r2.newComponent("ChatStep") instanceElement.Time = 3 local who local selectedInst = r2:getSelectedInstance() assert(selectedInst) if selectedInst:isGrouped() then who = r2:getLeader(selectedInst) else who = selectedInst end local chatAction = r2.newComponent("ChatAction") chatAction.Who = who.InstanceId table.insert(instanceElement.Actions, chatAction) local sequenceInstId = r2:getSelectedSequInstId(uiName) r2.requestInsertNode(sequenceInstId, "Components", -1, "", instanceElement) r2.ownCreatedInstances[instanceElement.InstanceId] = true else local templateParams = { selectElt="r2:selectChat()", openEltEditor="r2:openChatEditor()", maxMinElt="r2:maximizeMinimizeChat()", removeElt="r2:removeChat()", colOver="120 150 140 100", colPushed="120 150 140 255" } if sequenceUI == nil then sequenceUI = r2:getSelectedSequ(uiName) end local element = r2:newTriggerElement(uiName, tostring(i18n.get("uiR2EdChat")), templateParams, sequenceUI, instanceElement.InstanceId) r2:updateChatText(element) end end function r2:searchElementIndex(eltInst) local components = eltInst.Parent local index for i=0, components.Size-1 do local elt = components[i] if elt.InstanceId == eltInst.InstanceId then return (i+1) end end end function r2:buildChatTitle(chatUI, erase) local chatInst = r2:getInstanceFromId(chatUI.Env.elementId) assert(chatInst) -- part1 local index = r2:searchElementIndex(chatInst) if erase==true then index = index-1 end local part1 = tostring(i18n.get("uiR2EdChat")).." "..index.." : " -- part2 local minNb, secNb = r2:calculMinSec(chatInst.Time) local time = "" if minNb ~= 0 then time = tostring(minNb)..tostring(i18n.get("uiR2EdShortMinutes")) end time = time.." " ..tostring(secNb)..tostring(i18n.get("uiR2EdShortSeconds")) local part2 = "(" ..tostring(i18n.get("uiR2EdAfter")).." ".. time..") " -- part3 local part3 = "" local action = chatInst.Actions[0] local who = action.Who if who ~= "" then who = r2:getInstanceFromId(who) assert(who) part3 = who.Name .. " " ..tostring(i18n.get("uiR2EdSays")).. " " local says = action.Says if says ~= "" then says = r2:getInstanceFromId(says).Text says = string.substr(says, 0, 4) end part3 = part3 .. says .. "..." end -- title local title = chatUI:find("title") assert(title) title.uc_hardtext= part1..part2..part3 end function r2:getChatName(chatInst) -- part1 local index = r2:searchElementIndex(chatInst) if erase==true then index = index-1 end local part1 = tostring(i18n.get("uiR2EdChat")).." "..index.." : " -- part2 local minNb, secNb = r2:calculMinSec(chatInst.Time) local time = "" if minNb ~= 0 then time = tostring(minNb)..tostring(i18n.get("uiR2EdShortMinutes")) end time = time.." " ..tostring(secNb)..tostring(i18n.get("uiR2EdShortSeconds")) local part2 = "(" ..tostring(i18n.get("uiR2EdAfter")).." ".. time..") " -- part3 local part3 = "" local action = chatInst.Actions[0] local who = action.Who if who ~= "" then who = r2:getInstanceFromId(who) assert(who) part3 = who.Name .. " " ..tostring(i18n.get("uiR2EdSays")).. " " local says = action.Says if says ~= "" then says = r2:getInstanceFromId(says).Text says = string.sub(says, 1, 4) end part3 = part3 .. says .. "..." end return part1..part2..part3 end function r2:updateChatText(elementUI) if elementUI == nil then elementUI = r2:getSelectedEltUI("r2ed_chat_sequence") end assert(elementUI) local instance = r2:getInstanceFromId(elementUI.Env.elementId) assert(instance) local chatText = elementUI:find("text_list") assert(chatText) chatText:clear() local who = tostring(instance.Actions[0].Who) if who ~= "" then local text = "" local textEmpty = true local facing = tostring(instance.Actions[0].Facing) local emote = instance.Actions[0].Emote local says = instance.Actions[0].Says if facing ~= "" then text = "\n"..r2:getInstanceFromId(who).Name .." "..tostring(i18n.get("uiR2EdFaces")).." ".. r2:getInstanceFromId(facing).Name textEmpty = false end if r2.fromEmoteIdToName[emote] ~= nil then text = text .. "\n" .. r2:getInstanceFromId(who).Name .. " "..string.lower(tostring(i18n.get("uiR2EdEmote"))).." : " .. r2.fromEmoteIdToName[emote] textEmpty = false end if r2:getInstanceFromId(says)~=nil and r2:getInstanceFromId(says).Text ~= "" then text = text.."\n"..r2:getInstanceFromId(who).Name .. " "..tostring(i18n.get("uiR2EdSays")).." : " .. r2:getInstanceFromId(says).Text textEmpty = false end text = text.."\n" chatText:addTextChild(ucstring(text)) local sep = elementUI:find("sep") assert(sep) if textEmpty == false then sep.active = true else chatText:clear() sep.active = false end end r2:buildChatTitle(elementUI, false) local chatEditor = r2:getSelectedSequ("r2ed_chat_sequence"):find("edit_element") assert(chatEditor) if instance.InstanceId == r2:getSelectedEltInstId("r2ed_chat_sequence") then r2:updateChatEditor() end r2:updateActivitiesWhithThisChatSequence(instance, false) end -------------------- UP CHAT ---------------------------------------------------------------------- function r2:upChat() r2:upTriggerElement("r2ed_chat_sequence") end -------------------- DOWN CHAT -------------------------------------------------------------------- function r2:downChat() r2:downTriggerElement("r2ed_chat_sequence") end -------------------- MAX / MIN CHATS -------------------------------------------------------------- function r2:maximizeMinimizeChats() r2:maximizeMinimizeTriggerElements("r2ed_chat_sequence") end -------------------- REMOVE CHAT ------------------------------------------------------------------ function r2:removeChat() r2:removeTriggerElement("r2ed_chat_sequence", tostring(i18n.get("uiR2EdChat"))) end -------------------- CHAT TIME -------------------------------------------------------------------- function r2:setTime(minNb, secNb) local chatSequenceId = r2:getSelectedEltInstId("r2ed_chat_sequence") r2.requestSetNode(chatSequenceId, "Time", minNb*60+secNb) end -------------------- INIT TIME MENU ----------------------------------------------------------------- function r2: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 == true 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 end end r2:openTriggersMenu(getUICaller()) end -------------------- CHAT SECONDS ----------------------------------------------------------------- function r2:chatAfterSeconds(secNb) local chatStepInst = r2:getSelectedEltInst("r2ed_chat_sequence") local lastTime = chatStepInst.Time local minNb = 0 while lastTime > 59 do lastTime = lastTime - 60 minNb = minNb + 1 end r2:setTime(minNb, secNb) -- recover "says what" (equiv change focus) local chatEditor = r2:getSelectedSequ("r2ed_chat_sequence"):find("edit_element") assert(chatEditor) local saysWhat = chatEditor:find("says"):find("edit_box_group").input_string if chatStepInst.Actions[0].Says ~= r2.registerText(saysWhat).InstanceId then r2:setSaysWhat(saysWhat) end end -------------------- CHAT MINUTES ----------------------------------------------------------------- function r2:chatAfterMinutes(minNb) local chatStepInst = r2:getSelectedEltInst("r2ed_chat_sequence") local lastTime = chatStepInst.Time local secNb = lastTime while secNb > 59 do secNb = secNb - 60 end r2:setTime(minNb, secNb) -- recover "says what" (equiv change focus) local chatEditor = r2:getSelectedSequ("r2ed_chat_sequence"):find("edit_element") assert(chatEditor) local saysWhat = chatEditor:find("says"):find("edit_box_group").input_string if chatStepInst.Actions[0].Says ~= r2.registerText(saysWhat).InstanceId then r2:setSaysWhat(saysWhat) end end -------------------- WHO -------------------------------------------------------------------------- function r2:setWho(who, chatStepInst) if chatStepInst == nil then chatStepInst = r2:getSelectedEltInst("r2ed_chat_sequence") end assert(chatStepInst) r2.requestSetNode(chatStepInst.Actions[0].InstanceId, "Who", r2.RefId(who)) if who == chatStepInst.Actions[0].Facing then r2:setToWho(tostring(i18n.get("uiR2EdNobody"))) end -- recover "says what" (equiv change focus) local chatEditor = r2:getSelectedSequ("r2ed_chat_sequence"):find("edit_element") assert(chatEditor) local saysWhat = chatEditor:find("says"):find("edit_box_group").input_string if chatStepInst.Actions[0].Says ~= r2.registerText(saysWhat).InstanceId then r2:setSaysWhat(saysWhat) end end function r2:openWhoMenu(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(ucstring(i18n.get("uiR2EdNobody")), "lua", whoFunction.."('" ..tostring(i18n.get("uiR2EdNobody")).. "')", "Nobody") end for key, npc in 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= r2:getSelectedEltInst("r2ed_chat_sequence") assert(chatStepInst) local whoId = chatStepInst.Actions[0].Who if whoId~="" and whoId == npc.InstanceId then addLine = false end end if addLine then whoMenu:addLine(ucstring(npc.Name), "lua", whoFunction.."('" ..npc.InstanceId.. "')", npc.InstanceId) end end end r2:openTriggersMenu(getUICaller()) end -------------------- SAYS WHAT -------------------------------------------------------------------- function r2:setSaysWhat(what) if what == nil then what = getUICaller().input_string end local says = what local chatStep = r2:getSelectedEltInst("r2ed_chat_sequence") if chatStep ~= nil then if what ~= "" then what=r2.registerText(what).InstanceId end r2.requestSetNode(chatStep.Actions[0].InstanceId, "Says", what) local chatStepUI = r2:getSelectedEltUI("r2ed_chat_sequence") assert(chatStepUI) end end -------------------- CLOSE CHAT EDITOR ------------------------------------------------------------ function r2:closeChatEditor(chatEditor) if chatEditor == nil then chatEditor = r2:getSelectedSequ("r2ed_chat_sequence"):find("edit_element") end assert(chatEditor) local editSaysWhat = chatEditor:find("says"):find("edit_box_group") assert(editSaysWhat) if r2.callSetSaysWhat == true then r2:setSaysWhat(editSaysWhat.input_string) end end -------------------- TO WHO ----------------------------------------------------------------------- function r2:setToWho(toWho) local chatSequence = r2:getSelectedEltInst("r2ed_chat_sequence") assert(chatSequence) local chatEditor = r2:getSelectedSequ("r2ed_chat_sequence"):find("edit_element") assert(chatEditor) -- recover "says what" (equiv change focus) local saysWhat = chatEditor:find("says"):find("edit_box_group").input_string if chatSequence.Actions[0].Says ~= r2.registerText(saysWhat).InstanceId then r2:setSaysWhat(saysWhat) end if toWho == tostring(i18n.get("uiR2EdNobody")) then toWho="" end r2.requestSetNode(chatSequence.Actions[0].InstanceId, "Facing", r2.RefId(toWho)) end -------------------- EMOTE ------------------------------------------------------------------------ function r2:openEmoteMenu() local menuName = "ui:interface:r2ed_triggers_menu" local emoteMenu = getUI(menuName) local emoteMenu = emoteMenu:getRootMenu() assert(emoteMenu) emoteMenu:reset() initEmotesMenu(menuName, "r2:setEmote") r2:openTriggersMenu(getUICaller()) end function r2:setEmote(emoteId) local chatSequence = r2:getSelectedEltInst("r2ed_chat_sequence") assert(chatSequence) r2.requestSetNode(chatSequence.Actions[0].InstanceId, "Emote", emoteId) -- recover "says what" (equiv change focus) local chatEditor = r2:getSelectedSequ("r2ed_chat_sequence"):find("edit_element") assert(chatEditor) local saysWhat = chatEditor:find("says"):find("edit_box_group").input_string if chatSequence.Actions[0].Says ~= r2.registerText(saysWhat).InstanceId then r2:setSaysWhat(saysWhat) end end ------------------ SELECT CHAT SEQUENCE --------------------------------------------------------- function r2:selectChatsSequence(index) r2:selectElementsSequence("r2ed_chat_sequence", index) r2:updateMiniActivityView() end --------------------------------------------------------------------------------------------------- ------------------------------ FACTORISATION ---------------------------------------------------- --------------------------------------------------------------------------------------------------- ------------------------------ Remove element --------------------------------------------------- function r2:removeTriggerElement(uiName, elementName) local wndUI = getUI("ui:interface:"..uiName) assert(wndUI) local tab = wndUI:find("sequence_tabs") assert(tab) local sequenceUI = wndUI:find(tab.associatedGroupSelection) assert(sequenceUI) r2:removeElement(sequenceUI, uiName, elementName) end ----------------------------------------------------------------------------------------------------- function r2:removeElement(sequence, uiName, elementName, removedElement) local listElements = sequence:find("elements_list") assert(listElements) local toErasedInstId if removedElement == nil then toErasedInstId = r2:getSelectedEltInstId(uiName) else toErasedInstId = removedElement.Env.elementId end assert(toErasedInstId) -- request erase node if toErasedInstId ~= nil and r2:getInstanceFromId(toErasedInstId) ~= nil then r2.requestEraseNode(toErasedInstId, "", -1) end end function r2:removeElementUI(sequence, uiName, removedElement) local listElements = sequence:find("elements_list") assert(listElements) -- update follow elements number local removedIndex = listElements:getElementIndex(removedElement) for i = removedIndex+1, (listElements.childrenNb-1) do local element = listElements:getChild(i) assert(element) if not element.Env.isEditor then r2:buildElementTitle(uiName, element, true) end end -- delete element and update coordinates of elements list if removedElement == r2:getSelectedEltUI(uiName) then r2:setSelectedEltUIId(uiName, nil) -- inactive element editor local eltEditor = listElements:find("edit_element") assert(eltEditor) eltEditor.active = false -- disactive up and down element buttons local upElement = sequence:find("up_element") assert(upElement) local downElement = sequence:find("down_element") assert(downElement) local elementOrder = sequence:find("element_order") assert(elementOrder) upElement.active = false downElement.active = false elementOrder.active = false end listElements.Env.elementsNb = listElements.Env.elementsNb - 1 listElements:delChild(removedElement) listElements.parent:invalidateCoords() -- if any activity in list, disactive global minimize / maximize button if listElements.childrenNb == 1 then local minElts = sequence:find("minimize_elements") assert(minElts) local maxElts = sequence:find("maximize_elements") assert(maxElts) minElts.active = false maxElts.active = false end end ------------------------------ Max / Min elements ----------------------------------------------- function r2:maximizeMinimizeTriggerElements(uiName) local sequence = r2:getSelectedSequ(uiName) assert(sequence) r2:maximizeMinimizeElements(sequence, uiName) end ------------------------------ Max / Min elements ----------------------------------------------- function r2:maximizeMinimizeElements(sequence, uiName) local elements = sequence:find("elements_list") assert(elements) if elements.Env.minimize == nil then elements.Env.minimize = true end elements.Env.minimize = not elements.Env.minimize for i = 0, elements.childrenNb-1 do local element = elements:getChild(i) assert(element) if element.Env.isEditor ~= true then r2:maximizeMinimizeElement(uiName, element, elements.Env.minimize) end end local minElts = sequence:find("minimize_elements") assert(minElts) local maxElts = sequence:find("maximize_elements") assert(maxElts) if elements.Env.minimize == true then minElts.active = false maxElts.active = true else minElts.active = true maxElts.active = false end end ------------------------------ Max / Min element ------------------------------------------------ function r2:maximizeMinimizeElement(uiName, element, allMinimize) if element == nil then element = getUICaller().parent.parent.parent.parent.parent.parent end assert(element) local eltText = element:find("element_text") assert(eltText) local allMin, allMax = true, true if allMinimize ~= nil then allMin = allMinimize allMax = not allMin end local maxButton = element:find("maximize_element") assert(maxButton) local minButton = element:find("minimize_element") assert(minButton) -- maximize if allMax and eltText.active==false then eltText.active = true maxButton.active = false minButton.active = true -- minimize elseif allMin and eltText.active==true then eltText.active = false maxButton.active = true minButton.active = false end end ------------------------------------ Down element -------------------------------------------------- function r2:downTriggerElement(uiName) local eltSequenceUI = getUI("ui:interface:"..uiName) assert(eltSequenceUI) local tab = eltSequenceUI:find("sequence_tabs") assert(tab) local sequence = eltSequenceUI:find(tab.associatedGroupSelection) assert(sequence) local listElements = sequence:find("elements_list") assert(listElements) local selectedElement = r2:getSelectedEltUI(uiName) local index = listElements:getElementIndex(selectedElement) local sequenceId = r2:getSelectedSequInstId(uiName) if index < r2:getInstanceFromId(sequenceId).Components.Size-1 then r2.requestMoveNode(sequenceId, "Components", index+1, sequenceId, "Components", index) end end ------------------------------------ Down or up element UI ------------------------------------------ function r2:downUpElement(elementUI, uiName) local listElements = elementUI.parent assert(listElements) local eltEditor = listElements:find("edit_element") assert(eltEditor) local index = listElements:getElementIndex(elementUI) if index > 0 then local previousElement = listElements:getChild(index - 1) local editorBetweenBothElts = false if previousElement.Env.elementId==nil then previousElement = listElements:getChild(index - 2) editorBetweenBothElts = true end listElements:upChild(elementUI) if editorBetweenBothElts==true then listElements:upChild(elementUI) end local selectedEltUI = r2:getSelectedEltUI(uiName) if selectedEltUI~=nil then local selectedEltIndex = listElements:getElementIndex(selectedEltUI) local eltEditorIndex = listElements:getElementIndex(eltEditor) if eltEditorIndex~=selectedEltIndex+1 then if eltEditorIndex0 then local sequenceId = r2:getSelectedSequInstId(uiName) r2.requestMoveNode(sequenceId, "Components", index, sequenceId, "Components", index-1) end end --------------------------------------------------------------------------------------------------- function r2:selectTriggerElement(sequenceUI, uiName, selectedButtonElt) if sequenceUI == nil then sequenceUI = r2:getSelectedSequ(uiName) end r2:selectElement(sequenceUI, uiName, true, selectedButtonElt) end --------------------------------------------------------------------------------------------------- function r2:closeElementEditor(uiName) if uiName == "r2ed_chat_sequence" then r2:closeChatEditor(getUICaller()) end local sequenceUI = r2:getSelectedSequ(uiName) assert(sequenceUI) local selectedEltUI = r2:getSelectedEltUI(uiName) assert(selectedEltUI) local selectedEltButton = selectedEltUI:find("select") assert(selectedEltButton) selectedEltButton.pushed = false r2:selectElement(sequenceUI, uiName, false, selectedEltButton) end ---------------- SELECT ELEMENT ------------------------------------------------------------------- function r2:selectElement(sequence, uiName, eltOrder, selectedButtonElt) local upElement = sequence:find("up_element") assert(upElement) local downElement = sequence:find("down_element") assert(downElement) local orderElt = sequence:find("element_order") if selectedButtonElt == nil then selectedButtonElt = getUICaller() end -- new selected element if selectedButtonElt.pushed == true then if r2:getSelectedEltUIId(uiName) then local lastSelectedElement = r2:getSelectedEltUI(uiName) assert(lastSelectedElement) local lastEltsList = lastSelectedElement.parent local editElt = lastEltsList:find("edit_element") assert(editElt) if r2:getSelectedEltUIId(uiName) == selectedButtonElt.parent.parent.parent.id then return end lastSelectedElement.active = true lastSelectedElement:find("select").pushed = false editElt.active = false end r2:setSelectedEltUIId(uiName, selectedButtonElt.parent.parent.parent.id) local selectedElement = selectedButtonElt.parent.parent.parent assert(selectedElement) if eltOrder then upElement.active = true downElement.active = true orderElt.active = true end -- update element editor position in list local eltsList = sequence:find("elements_list") assert(eltsList) local editElt = eltsList:find("edit_element") assert(editElt) local indexSelectedElt = eltsList:getElementIndex(selectedElement) local indexEltEditor = eltsList:getElementIndex(editElt) if indexEltEditor=0) and (sequencesTab.tabButtonNb > index) then sequencesTab.selection = tonumber(index) local repeatButton = eltsWnd:find("repeat_group"):find("repeat"):find("toggle_butt") assert(repeatButton) local sequenceUI = sequencesTab:getGroup(index) assert(sequenceUI) local sequenceInstId = sequenceUI.Env.sequenceId if sequenceInstId and r2:getInstanceFromId(sequenceInstId) then local sequenceInst = r2:getInstanceFromId(sequenceInstId) repeatButton.pushed = (sequenceInst.Repeating == 0) end end end ---------------------------------------- Open element editor -------------------------------------- function r2:openElementEditor(uiName, title, baseWindowName) local elementEditor = r2:getSelectedSequ(uiName):find("edit_element") assert(elementEditor) local selectedElement = r2:getSelectedEltUI(uiName) assert(selectedElement) elementEditor.active = true selectedElement.active = false end ----------------------------------- Remove elements sequence -------------------------------------- function r2:removeElementsSequence(uiName, elementsTable, sequName) local eltSequenceUI = getUI("ui:interface:"..uiName) assert(eltSequenceUI) local tab = eltSequenceUI:find("sequence_tabs") assert(tab) local activeLogicEntity = r2:getSelectedInstance() assert(activeLogicEntity) local activitySequences = activeLogicEntity:getBehavior()[elementsTable] --local seq = sequName --for i=tab.selection+1,(tab.tabButtonNb-1) do -- local buttonTab = tab:find("tab"..i) -- assert(buttonTab) -- if activitySequences[i].Name == seq..(i+1) then -- local newText = seq..(i) -- r2.requestSetNode(activitySequences[i].InstanceId, "Name", newText) -- end --end local sequenceId = r2:getSelectedSequInstId(uiName) -- request erase node r2.requestEraseNode(sequenceId, "", -1) return sequenceId end function r2:removeElementsSequenceUI(tabIndex, uiName, elementsTable, sequName) local wndUI = getUI("ui:interface:"..uiName) assert(wndUI) local tab = wndUI:find("sequence_tabs") assert(tab) local activeLogicEntity = r2:getSelectedInstance() assert(activeLogicEntity) local activitySequences = activeLogicEntity:getBehavior()[elementsTable] for i=tabIndex+1,(tab.tabButtonNb-1) do local buttonTab = tab:find("tab"..i) assert(buttonTab) buttonTab.params_l = "r2:selectSequenceTab('"..uiName.."', "..tostring(i-1)..")" if buttonTab.hardtext == sequName..(i+1) then buttonTab.uc_hardtext = sequName..i end end -- recover name of the future "first sequence" local firstEltName local indexName if tab.tabButtonNb > 1 then if tabIndex==0 then indexName = 1 else indexName = 0 end --if activitySequences[indexName].Name==sequName..(indexName+1) then if r2:getSequenceName(activitySequences[indexName])==sequName..(indexName+1) then firstEltName = sequName.."1" else --firstEltName = activitySequences[indexName].Name firstEltName = r2:getSequenceName(activitySequences[indexName]) end else firstEltName = tostring(i18n.get("uiR2EDSequences")) end local selectedElt = r2:getSelectedEltUI(uiName) if selectedElt and selectedElt.parent.parent.parent.id == r2:getSelectedSequ(uiName).id then r2:setSelectedEltUIId(uiName, nil) end tab:removeTab(tabIndex) if tab.tabButtonNb == 0 then r2:cleanSequenceEditor(wndUI) end return firstEltName end function r2:cleanSequenceEditor(eltSequenceUI) local sepTop = eltSequenceUI:find("sep_top") assert(sepTop) local sepBottom = eltSequenceUI:find("sep_bottom") assert(sepBottom) local sepLeft = eltSequenceUI:find("sep_left") assert(sepLeft) local sepRight = eltSequenceUI:find("sep_right") assert(sepRight) local removeSequence = eltSequenceUI:find("remove_sequence_button") assert(removeSequence) local editSequence = eltSequenceUI:find("edit_sequence") assert(editSequence) sepTop.active = false sepBottom.active = false sepLeft.active= false sepRight.active= false removeSequence.active = false editSequence.active = false local repeatButtonGr = eltSequenceUI:find("repeat_group") repeatButtonGr.active = false end ------------------ new elements sequence ------------------------------------------------------------- function r2:newElementsSequence(uiName, templateParams, editorEltTemplate, instance, sequName) local eltSequenceUI = getUI("ui:interface:"..uiName) assert(eltSequenceUI) local menu = eltSequenceUI:find("sequence_menu") assert(menu) local tab = menu:find("sequence_tabs") assert(tab) local newTabNb = tab.tabButtonNb+1 local posParent, posRef, id, hardText, group if newTabNb == 1 then posParent = "parent" posRef = "TL TL" else posParent = "tab"..(newTabNb-2) posRef = "TR TL" end id = "tab"..(newTabNb-1) local group = "sequence"..r2.sequencesNb r2.sequencesNb = r2.sequencesNb + 1 local newTabGroup = createUIElement("sequence_elements_template", menu.id, {id=group, new_elt=templateParams.newElt, new_elt_text=templateParams.newEltText, elt_order_text=templateParams.eltOrderText, up_elt=templateParams.upElt, down_elt=templateParams.downElt, max_min_elts=templateParams.maxMinElts, down_up_color=templateParams.downUpColor}) assert(newTabGroup) menu:addGroup(newTabGroup) newTabGroup.Env.sequenceId = instance.InstanceId local tabName if instance.Name~= "" then tabName = instance.Name else local comps = instance.Parent for i=0, comps.Size-1 do if comps[i].InstanceId == instance.InstanceId then tabName = sequName..(i+1) break end end end local newTab = createUIElement("sequence_tab_template", tab.id, {id=id, posparent=posParent, posref=posRef, hardtext=tabName, group=group, col_pushed =templateParams.colPushed, params_l=templateParams.paramsL}) assert(newTab) tab:addTab(newTab) if r2.ownCreatedInstances[instance.InstanceId] == true then tab.selection = tab.tabButtonNb-1 r2.ownCreatedInstances[instance.InstanceId] = nil --local repeatButton = eltSequenceUI:find("repeat_group"):find("repeat"):find("toggle_butt") --assert(repeatButton) --repeatButton.pushed = (instance.Repeating == 0) r2:selectElementsSequence(uiName, tab.tabButtonNb-1) end if tab.tabButtonNb == 1 then local sepTop = menu:find("sep_top") assert(sepTop) local sepBottom = menu:find("sep_bottom") assert(sepBottom) local sepLeft = menu:find("sep_left") assert(sepLeft) local sepRight = menu:find("sep_right") assert(sepRight) local removeSequence = eltSequenceUI:find("remove_sequence_button") assert(removeSequence) local editSequence = eltSequenceUI:find("edit_sequence") assert(editSequence) sepTop.active = true sepBottom.active = true sepLeft.active= true sepRight.active= true removeSequence.active = true editSequence.active = true if uiName == "r2ed_triggers" then --TEMP TEMP TEMP local repeatButtonGr = eltSequenceUI:find("repeat_group") repeatButtonGr.active = true end --TEMP TEMP TEMP end local listElements = newTabGroup:find("elements_list") assert(listElements) listElements.Env.elementsCount = nil -- add element editor in list local newEditorElt = createGroupInstance(editorEltTemplate, listElements.id, {id="edit_element", active="false"}) assert(newEditorElt) listElements:addChild(newEditorElt) listElements.parent:updateCoords() newEditorElt.Env.isEditor = true newEditorElt.active = false return newTabGroup end ---------------------------- new element -------------------------------------------------------------- function r2:newTriggerElement(uiName, elementName, templateParams, sequenceUI, instanceId) if sequenceUI == nil then eltSequenceUI = getUI("ui:interface:"..uiName) assert(eltSequenceUI) local tab = eltSequenceUI:find("sequence_tabs") assert(tab) local sequenceUI = eltSequenceUI:find(tab.associatedGroupSelection) end assert(sequenceUI) local newElement = r2:newElement(sequenceUI, elementName, templateParams, true) newElement.Env.elementId = instanceId if r2.ownCreatedInstances[instanceId] == true then newElement:find("select").pushed = true r2:selectTriggerElement(sequenceUI, uiName, newElement:find("select")) r2.ownCreatedInstances[instanceId] = nil if uiName == "r2ed_triggers" then r2:updateActivityEditor() elseif uiName == "r2ed_chat_sequence" then r2:updateChatEditor() end end r2:maximizeMinimizeElement(uiName, newElement) return newElement end ---------------------------- new base element -------------------------------------------------------------- function r2:newElement(sequence, elementName, templateParams, eltOrder) local listElements = sequence:find("elements_list") assert(listElements) -- counter for element group id if listElements.Env.elementsCount == nil then listElements.Env.elementsCount = 0 listElements.Env.elementsNb = 1 else listElements.Env.elementsCount = listElements.Env.elementsCount+1 listElements.Env.elementsNb = listElements.Env.elementsNb+1 end local elementId = "elt"..listElements.Env.elementsCount local hardText = elementName.." "..listElements.Env.elementsNb.." : " -- create new element local newElement = createGroupInstance("element_template", listElements.id, {id=elementId, posref="TL TL", x="0", y="0", sizeref="w", hardtext=hardText, select_elt=templateParams.selectElt, open_elt_editor=templateParams.openEltEditor, max_min_elt=templateParams.maxMinElt, remove_elt=templateParams.removeElt, open_chat=templateParams.openChat, col_over=templateParams.colOver, col_pushed=templateParams.colPushed}) -- add element to list listElements:addChild(newElement) listElements.parent:updateCoords() -- active global minimize / maximize button if listElements.childrenNb == 2 then local maxElts = sequence:find("maximize_elements") assert(maxElts) maxElts.active = true if eltOrder then local elementOrder = sequence:find("element_order") assert(elementOrder) elementOrder.active=true end end -- scroll goes down to new element local sequenceContent = newElement.parent.parent.parent assert(sequenceContent) local scrollBar = sequenceContent:find("scroll_objects") assert(scrollBar) scrollBar.trackPos = 0 -- target sroll text local scroll = newElement:find("scroll_bar_text") assert(scroll) local scrollText = newElement:find("scroll_text_gr") assert(scrollText) scroll:setTarget(scrollText.id) return newElement end ------------------ OPEN SEQUENCE EDITOR -------------------------------------------------- function r2:openSequenceEditor(uiName, editorName) local editor = getUI("ui:interface:"..editorName) assert(editor) local eltsUI = getUI("ui:interface:"..uiName) assert(eltsUI) editor.x = eltsUI.x editor.y = eltsUI.y editor.active = true -- update edit box text with current sequence name local editName = editor:find("sequence_name"):find("edit_box_group") assert(editName) local tab = eltsUI:find("sequence_tabs") assert(tab) local buttonTab = tab:find("tab"..tab.selection) assert(buttonTab) editName.uc_input_string = buttonTab.uc_hardtext end ------------------ SET SEQUENCE NAME ----------------------------------------------------- function r2:setSequenceName(uiName, editorName) local editor = getUI("ui:interface:"..editorName) assert(editor) local editName = editor:find("sequence_name"):find("edit_box_group") assert(editName) local name = editName.input_string local sequenceInstId = r2:getSelectedSequInstId(uiName) r2.requestSetNode(sequenceInstId, "Name", name) end function r2:updateSequenceName(uiName, instance) --local name = instance.Name local name = r2:getSequenceName(instance) local sequInstId = instance.InstanceId local eltsUI = getUI("ui:interface:"..uiName) assert(eltsUI) local tab = eltsUI:find("sequence_tabs") assert(tab) local tabId for i=0, tab.tabButtonNb-1 do local sequenceUI = tab:getGroup(i) if sequenceUI.Env.sequenceId == sequInstId then tabId = i break end end local buttonTab = tab:find("tab"..tabId) assert(buttonTab) buttonTab.uc_hardtext = name if uiName == "r2ed_triggers" then r2:updateSequencesButtonBar(tabId, name) end end function r2:updateSequenceRepeatingOption(uiName, instance) local sequenceUI = r2:getSelectedSequ(uiName) if sequenceUI.Env.sequenceId == instance.InstanceId then local eltsUI = getUI("ui:interface:"..uiName) local repeatButton = eltsUI:find("repeat_group"):find("repeat"):find("toggle_butt") repeatButton.pushed = (instance.Repeating == 0) end end -------------------------------------------------------------------------------------------------- -------------------------- ACTIVE LOGIC ENTITY DisplayerProperties ----------------------------------------- -------------------------------------------------------------------------------------------------- local activeLogicEntityPropertySheetDisplayerTable = clone(r2:propertySheetDisplayer()) ------------------------------------------------ function activeLogicEntityPropertySheetDisplayerTable:onPostCreate(instance) end ------------------------------------------------ function activeLogicEntityPropertySheetDisplayerTable:onErase(instance) end ------------------------------------------------ function activeLogicEntityPropertySheetDisplayerTable:onPreHrcMove(instance) end ------------------------------------------------ function activeLogicEntityPropertySheetDisplayerTable:onPostHrcMove(instance) end ------------------------------------------------ function activeLogicEntityPropertySheetDisplayerTable:onFocus(instance, hasFocus) end ------------------------------------------------ r2.activitiesAndChatsUIUpdate = false function activeLogicEntityPropertySheetDisplayerTable:onSelect(instance, isSelected) r2:logicEntityPropertySheetDisplayer():onSelect(instance, isSelected) local triggersUI = getUI("ui:interface:r2ed_triggers") assert(triggersUI) if not isSelected then triggersUI.active = false r2:closeMiniActivityView() r2:closeChatSequencesUI() r2:cleanActivitiesAndChatsUI() r2:cleanLogicEntityUI() else r2.activitiesAndChatsUIUpdate = false end end r2.callSetSaysWhat = true ------------------------------------------------ function r2:cleanActivitiesAndChatsUI() -- update chat sequence combo box local triggersUI = getUI("ui:interface:r2ed_triggers") assert(triggersUI) local chatSequencesUI = getUI("ui:interface:r2ed_chat_sequence") assert(chatSequencesUI) -- remove all tabs local sequenceMenu = triggersUI:find("sequence_menu") assert(sequenceMenu) local tabActivities = triggersUI:find("sequence_tabs") assert(tabActivities) for i=0, tabActivities.tabButtonNb-1 do local groupTab = tabActivities:getGroup(i) assert(groupTab) sequenceMenu:delGroup(groupTab) end tabActivities:removeAll() r2:setSelectedEltUIId("r2ed_triggers", nil) r2:cleanSequenceEditor(triggersUI) -- delete chat sequences sequenceMenu = chatSequencesUI:find("sequence_menu") assert(sequenceMenu) local tabChats = chatSequencesUI:find("sequence_tabs") assert(tabChats) for i=0, tabChats.tabButtonNb-1 do local groupTab = tabChats:getGroup(i) assert(groupTab) sequenceMenu:delGroup(groupTab) end tabChats:removeAll() r2:setSelectedEltUIId("r2ed_chat_sequence", nil) r2:cleanSequenceEditor(chatSequencesUI) end function r2:updateActivitiesAndChatsUI(instance) if r2.activitiesAndChatsUIUpdate==true then return end r2.activitiesAndChatsUIUpdate = true if r2.lastSelectedActivitySequence==nil then r2:cleanActivitiesAndChatsUI() -- update chat sequence combo box local triggersUI = getUI("ui:interface:r2ed_triggers") assert(triggersUI) local chatSequencesUI = getUI("ui:interface:r2ed_chat_sequence") assert(chatSequencesUI) -- remove all tabs local tabActivities = triggersUI:find("sequence_tabs") assert(tabActivities) -- delete chat sequences local tabChats = chatSequencesUI:find("sequence_tabs") assert(tabChats) local activitySequences = instance:getBehavior().Activities local chatSequences = instance:getBehavior().ChatSequences -- build sequences of selected NPC group local uiName = "r2ed_triggers" for s = 0, activitySequences.Size - 1 do local sequence = activitySequences[s] r2:newActivitiesSequence(false, sequence, true) end if tabActivities.tabButtonNb>1 then tabActivities.selection = 0 r2:selectElementsSequence(uiName, 0) end for s=0, tabActivities.tabButtonNb-1 do local sequenceUI = tabActivities:getGroup(s) assert(sequenceUI) local eltsList = sequenceUI:find("elements_list") assert(eltsList) if eltsList.childrenNb > 1 then local firstElt = eltsList:getChild(1) local selectedButton = firstElt:find("select") selectedButton.pushed = true r2:selectElement(sequenceUI, uiName, true, selectedButton) r2:updateActivityEditor() break end end uiName = "r2ed_chat_sequence" r2.callSetSaysWhat = false for s = 0, chatSequences.Size - 1 do local sequence = chatSequences[s] r2:newChatsSequence(false, sequence, true) end r2.callSetSaysWhat = true if tabChats.tabButtonNb>1 then tabChats.selection = 0 r2:selectElementsSequence(uiName, 0) end for s=0, tabChats.tabButtonNb-1 do local sequenceUI = tabChats:getGroup(s) assert(sequenceUI) local eltsList = sequenceUI:find("elements_list") assert(eltsList) if eltsList.childrenNb > 1 then local firstElt = eltsList:getChild(1) local selectedButton = firstElt:find("select") r2.callSetSaysWhat = false selectedButton.pushed = true r2:selectElement(sequenceUI, uiName, true, selectedButton) r2.callSetSaysWhat = true r2:updateChatEditor() end end triggersUI.uc_title = tostring(i18n.get("uiR2EDActivitySequenceEditor")) .. r2:getSelectedInstance().Name chatSequencesUI.uc_title = tostring(i18n.get("uiR2EDChatSequenceEditor")) .. r2:getSelectedInstance().Name end end ------------------------------------------------ function activeLogicEntityPropertySheetDisplayerTable:onAttrModified(instance, attributeName) r2:logicEntityPropertySheetDisplayer():onAttrModified(instance, attributeName) if not r2.activitiesAndChatsUIUpdate or instance ~= r2:getSelectedInstance() then return end if attributeName == "Name" then local triggersUI = getUI("ui:interface:r2ed_triggers") assert(triggersUI) local chatSequencesUI = getUI("ui:interface:r2ed_chat_sequence") assert(chatSequencesUI) triggersUI.uc_title = tostring(i18n.get("uiR2EDActivitySequenceEditor")) .. instance[attributeName] chatSequencesUI.uc_title = tostring(i18n.get("uiR2EDChatSequenceEditor")) .. instance[attributeName] end end ------------------------------------------------ function r2:activeLogicEntityPropertySheetDisplayer() return activeLogicEntityPropertySheetDisplayerTable -- returned shared displayer to avoid wasting memory end -------------------------------------------------------------------------------------------------- -------------------------- NPC GROUP DisplayerProperties ----------------------------------------- -------------------------------------------------------------------------------------------------- local npcGroupPropertySheetDisplayerTable = clone(r2:propertySheetDisplayer()) ------------------------------------------------ function npcGroupPropertySheetDisplayerTable:onPostCreate(instance) end ------------------------------------------------ function npcGroupPropertySheetDisplayerTable:onErase(instance) end ------------------------------------------------ function npcGroupPropertySheetDisplayerTable:onPreHrcMove(instance) end ------------------------------------------------ function npcGroupPropertySheetDisplayerTable:onPostHrcMove(instance) end ------------------------------------------------ function npcGroupPropertySheetDisplayerTable:onFocus(instance, hasFocus) end ------------------------------------------------ function npcGroupPropertySheetDisplayerTable:onSelect(instance, isSelected) r2:activeLogicEntityPropertySheetDisplayer():onSelect(instance, isSelected) end ------------------------------------------------ function npcGroupPropertySheetDisplayerTable:onAttrModified(instance, attributeName) r2:activeLogicEntityPropertySheetDisplayer():onAttrModified(instance, attributeName) end ------------------------------------------------ function r2:npcGroupPropertySheetDisplayer() return npcGroupPropertySheetDisplayerTable -- returned shared displayer to avoid wasting memory end -------------------------------------------------------------------------------------------------- -------------------------------- ACTIVITY SEQUENCE DisplayerProperties --------------------------- -------------------------------------------------------------------------------------------------- local activitySequencePropertySheetDisplayerTable = clone(r2:propertySheetDisplayer()) ------------------------------------------------ function activitySequencePropertySheetDisplayerTable:onPostCreate(instance) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end r2:newActivitiesSequence(false, instance, false) end ------------------------------------------------ function activitySequencePropertySheetDisplayerTable:onErase(instance) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end local triggersUI = getUI("ui:interface:r2ed_triggers") assert(triggersUI) local sequenceTabs = triggersUI:find("sequence_tabs") assert(sequenceTabs) local sequIndex for i=0,sequenceTabs.tabButtonNb-1 do local sequence = sequenceTabs:getGroup(i) if sequence.Env.sequenceId == instance.InstanceId then sequIndex = i break end end if sequIndex~=nil then r2:removeActivitiesSequenceUI(sequIndex) end end ------------------------------------------------ function activitySequencePropertySheetDisplayerTable:onPreHrcMove(instance) end ------------------------------------------------ function activitySequencePropertySheetDisplayerTable:onPostHrcMove(instance) end ------------------------------------------------ function activitySequencePropertySheetDisplayerTable:onFocus(instance, hasFocus) end ------------------------------------------------ function activitySequencePropertySheetDisplayerTable:onSelect(instance, isSelected) end ------------------------------------------------ function activitySequencePropertySheetDisplayerTable:onAttrModified(instance, attributeName) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end if attributeName == "Name" then r2:updateSequenceName("r2ed_triggers", instance) elseif attributeName == "Repeating" then r2:updateSequenceRepeatingOption("r2ed_triggers", instance) end end ------------------------------------------------ function r2:activitySequencePropertySheetDisplayer() return activitySequencePropertySheetDisplayerTable -- returned shared displayer to avoid wasting memory end -------------------------------------------------------------------------------------------------- -------------------------------- CHAT SEQUENCE DisplayerProperties --------------------------- -------------------------------------------------------------------------------------------------- local chatSequencePropertySheetDisplayerTable = clone(r2:propertySheetDisplayer()) ------------------------------------------------ function chatSequencePropertySheetDisplayerTable:onPostCreate(instance) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end r2:newChatsSequence(false, instance) end ------------------------------------------------ function chatSequencePropertySheetDisplayerTable:onErase(instance) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end local chatsUI = getUI("ui:interface:r2ed_chat_sequence") assert(chatsUI) local sequenceTabs = chatsUI:find("sequence_tabs") assert(sequenceTabs) local sequIndex for i=0,sequenceTabs.tabButtonNb-1 do local sequence = sequenceTabs:getGroup(i) if sequence.Env.sequenceId == instance.InstanceId then sequIndex = i break end end if sequIndex~=nil then r2:removeChatsSequenceUI(sequIndex) end r2:updateMiniActivityView() end ------------------------------------------------ function chatSequencePropertySheetDisplayerTable:onPreHrcMove(instance) end ------------------------------------------------ function chatSequencePropertySheetDisplayerTable:onPostHrcMove(instance) end ------------------------------------------------ function chatSequencePropertySheetDisplayerTable:onFocus(instance, hasFocus) end ------------------------------------------------ function chatSequencePropertySheetDisplayerTable:onSelect(instance, isSelected) end ------------------------------------------------ function chatSequencePropertySheetDisplayerTable:onAttrModified(instance, attributeName) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end if attributeName == "Name" then r2:updateSequenceName("r2ed_chat_sequence", instance) elseif attributeName == "Repeating" then r2:updateSequenceRepeatingOption("r2ed_chat_sequence", instance) end end ------------------------------------------------ function r2:chatSequencePropertySheetDisplayer() return chatSequencePropertySheetDisplayerTable -- returned shared displayer to avoid wasting memory end -------------------------------------------------------------------------------------------------- -------------------------------- ACTIVITY STEP DisplayerProperties-------------------------------- -------------------------------------------------------------------------------------------------- local activityStepPropertySheetDisplayerTable = clone(r2:propertySheetDisplayer()) ------------------------------------------------ function activityStepPropertySheetDisplayerTable:onPostCreate(instance) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end local activitySequInst = instance.Parent.Parent local triggersUI = getUI("ui:interface:r2ed_triggers") assert(triggersUI) local sequenceTabs = triggersUI:find("sequence_tabs") assert(sequenceTabs) local sequenceUI for i=0,sequenceTabs.tabButtonNb-1 do local sequence = sequenceTabs:getGroup(i) if sequence.Env.sequenceId == activitySequInst.InstanceId then sequenceUI = sequence break end end r2:newActivity(false, nil, instance, sequenceUI) end ------------------------------------------------ function activityStepPropertySheetDisplayerTable:onErase(instance) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end local sequenceUI, elementUI = r2:findSequenceAndElementUIFromInstance(instance, "r2ed_triggers") if elementUI ~= nil then r2:removeActivityUI(sequenceUI, elementUI) end end ------------------------------------------------ function activityStepPropertySheetDisplayerTable:onPreHrcMove(instance) end ------------------------------------------------ function activityStepPropertySheetDisplayerTable:onPostHrcMove(instance) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end local sequenceUI, activityStepUI = r2:findSequenceAndElementUIFromInstance(instance, "r2ed_triggers") if activityStepUI then r2:downUpElement(activityStepUI, "r2ed_triggers") end end ------------------------------------------------ function activityStepPropertySheetDisplayerTable:onFocus(instance, hasFocus) end ------------------------------------------------ function activityStepPropertySheetDisplayerTable:onSelect(instance, isSelected) end ------------------------------------------------ function activityStepPropertySheetDisplayerTable:onAttrModified(instance, attributeName) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end local sequenceUI, elementUI = r2:findSequenceAndElementUIFromInstance(instance, "r2ed_triggers") if elementUI then r2:updateActivityChatSequence(elementUI) end end ------------------------------------------------ function activityStepPropertySheetDisplayerTable:onTargetInstanceEraseRequested(instance, refIdName, refIdIndexInArray) if refIdName == "ActivityZoneId" then r2.requestSetNode(instance.InstanceId, "Activity", "Stand Still") r2.requestSetNode(instance.InstanceId, "ActivityZoneId", r2.RefId("")) r2.requestSetNode(instance.InstanceId, "TimeLimit", "No Limit") r2.requestSetNode(instance.InstanceId, "TimeLimitValue", "") elseif refIdName == "Chat" then r2.requestSetNode(instance.InstanceId, "Chat", r2.RefId("")) end end ------------------------------------------------ function activityStepPropertySheetDisplayerTable:onTargetInstanceAttrModified(instance, refIdName, refIdIndexInArray, targetAttrName, targetAttrIndexInArray) end ------------------------------------------------- function r2:activityStepPropertySheetDisplayer() return activityStepPropertySheetDisplayerTable -- returned shared displayer to avoid wasting memory end -------------------------------------------------------------------------------------------------- -------------------------------- CHAT STEP DisplayerProperties------------------------------------ -------------------------------------------------------------------------------------------------- local chatStepPropertySheetDisplayerTable = clone(r2:propertySheetDisplayer()) ------------------------------------------------ function chatStepPropertySheetDisplayerTable:onPostCreate(instance) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end local chatSequInst = instance.Parent.Parent local chatsUI = getUI("ui:interface:r2ed_chat_sequence") assert(chatsUI) local sequenceTabs = chatsUI:find("sequence_tabs") assert(sequenceTabs) local sequenceUI for i=0,sequenceTabs.tabButtonNb-1 do local sequence = sequenceTabs:getGroup(i) if sequence.Env.sequenceId == chatSequInst.InstanceId then sequenceUI = sequence break end end r2:newChat(false, instance, sequenceUI) end ------------------------------------------------ function chatStepPropertySheetDisplayerTable:onErase(instance) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end local sequenceUI, elementUI = r2:findSequenceAndElementUIFromInstance(instance, "r2ed_chat_sequence") if elementUI ~= nil then local chatStepInst = r2:getInstanceFromId(elementUI.Env.elementId) assert(chatStepInst) r2:updateActivitiesWhithThisChatSequence(chatStepInst, true) r2:removeElementUI(sequenceUI, "r2ed_chat_sequence", elementUI) end end ------------------------------------------------ function chatStepPropertySheetDisplayerTable:onPreHrcMove(instance) end ------------------------------------------------ function chatStepPropertySheetDisplayerTable:onPostHrcMove(instance) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end r2:updateActivitiesWhithThisChatSequence(instance, false) local sequenceUI, chatStepUI = r2:findSequenceAndElementUIFromInstance(instance, "r2ed_chat_sequence") if chatStepUI then r2:downUpElement(chatStepUI, "r2ed_chat_sequence") end end ------------------------------------------------ function chatStepPropertySheetDisplayerTable:onFocus(instance, hasFocus) end ------------------------------------------------ function chatStepPropertySheetDisplayerTable:onSelect(instance, isSelected) end ------------------------------------------------ function chatStepPropertySheetDisplayerTable:onAttrModified(instance, attributeName) local activeLogicEntity = r2:getSelectedInstance() local activeLogicEntityParent = instance.Parent.Parent.Parent.Parent.Parent if not r2.activitiesAndChatsUIUpdate or activeLogicEntity==nil or activeLogicEntity ~= activeLogicEntityParent then return end local sequenceUI, chatStepUI = r2:findSequenceAndElementUIFromInstance(instance, "r2ed_chat_sequence") if chatStepUI then r2:updateChatText(chatStepUI) end end function r2:findSequenceAndElementUIFromInstance(instance, uiName) local sequenceInst = instance.Parent.Parent local wndUI = getUI("ui:interface:"..uiName) assert(wndUI) local sequenceTabs = wndUI:find("sequence_tabs") assert(sequenceTabs) local sequenceUI for i=0,sequenceTabs.tabButtonNb-1 do local sequence = sequenceTabs:getGroup(i) if sequence.Env.sequenceId == sequenceInst.InstanceId then sequenceUI = sequence break end end if sequenceUI ~= nil then local eltsList = sequenceUI:find("elements_list") assert(eltsList) for i=0,eltsList.childrenNb-1 do local element = eltsList:getChild(i) if element.Env.elementId == instance.InstanceId then return sequenceUI, element end end end end -------------------------------------------------- function r2:chatStepPropertySheetDisplayer() return chatStepPropertySheetDisplayerTable -- 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, "Says", "") r2.requestSetNode(instance.InstanceId, "Emote", "") r2.requestSetNode(instance.InstanceId, "Facing", r2.RefId("")) 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 r2.lastSelectedActivitySequence = nil r2.activityTexture = { ["Follow Route"] = "r2_mini_activity_follow_road.tga", ["Patrol"] = "r2_mini_activity_patrol_road.tga", ["Repeat Road"] = "r2_mini_activity_repeat_road.tga", ["Wander"] = "r2_mini_activity_wander_zone.tga", ["Stand Still"] = "r2_mini_activity_stand_still.tga", -- ["Inactive"] = "r2_mini_activity_inactive.tga" } --------------------------------------------------------------------------------------------------------- -- Show the mini activity view for this instance function r2:setupMiniActivityView(instance) if instance and instance:isKindOf("ActiveLogicEntity") then local selectedTab = 0 if r2.lastSelectedActivitySequence then selectedTab = r2.lastSelectedActivitySequence end r2:selectActivitiesSequence(selectedTab) r2:updateSequencesButtonBar(selectedTab) end end ------------------ SELECT ACTIVITY SEQUENCE --------------------------------------------------------- function r2:selectActivitiesSequence(index) r2:selectElementsSequence("r2ed_triggers", index) r2:openAndUpdateMiniActivityView(index) end ------------------ UPDATE SEQUENCES BUTTON BAR --------------------------------------------------------- function r2:updateSequencesButtonBar(index, sequenceName) local selectBar = getUI("ui:interface:r2ed_select_bar") assert(selectBar) local sequencesButton = selectBar:find("sequences") assert(sequencesButton) local activeLogicEntity = r2:getSelectedInstance() if activeLogicEntity then if sequenceName==nil and (index >=0) and (index < activeLogicEntity:getBehavior().Activities.Size) then local activitySequence = activeLogicEntity:getBehavior().Activities[index] assert(activitySequence) --sequencesButton.uc_hardtext = activitySequence.Name sequencesButton.uc_hardtext = r2:getSequenceName(activitySequence) elseif sequenceName~= nil then sequencesButton.uc_hardtext = sequenceName else sequencesButton.uc_hardtext = i18n.get("uiR2EDSequences") end end end function r2:newMiniActivitySequence() return r2:newActivitiesSequence(true) end function r2:openAndUpdateMiniActivityView(index) r2:openMiniActivityView() -- update activities list r2:updateMiniActivityView(index) end function r2:openMiniActivityView() local triggersUI = getUI("ui:interface:r2ed_triggers") assert(triggersUI) local selectedInst = r2:getSelectedInstance() if selectedInst and not selectedInst:isBotObject() and not selectedInst:isPlant() and not triggersUI.active then local miniActivityView = getUI("ui:interface:r2ed_mini_activity_view") assert(miniActivityView) miniActivityView.active = true end end function r2:updateMiniActivityView(index) local miniActivityView = getUI("ui:interface:r2ed_mini_activity_view") assert(miniActivityView) local miniActivities = miniActivityView:find("mini_activities") assert(miniActivities) local noActivityLabel = miniActivityView:find("no_activity") assert(noActivityLabel) local startCount = 0 local sequence if index~=nil then local activities = r2:getSelectedInstance():getBehavior().Activities if index < activities.Size then sequence = activities[index] end else sequence = r2:getSelectedSequInst("r2ed_triggers") end if sequence~=nil then --label "No activity" if sequence.Components.Size == 0 then noActivityLabel.active = true noActivityLabel.uc_hardtext = tostring(i18n.get("uiR2EdNoActivity")) else noActivityLabel.active = false end for i=0, sequence.Components.Size-1 do local activityInst = sequence.Components[i] assert(activityInst) if activityInst then local activityIndex = i if afterEltEditor==true then activityIndex = i-1 end local miniActivity = miniActivities[tostring(activityIndex)] assert(miniActivity) miniActivity.active = true miniActivity.Env.id = activityIndex -- chat button local chatButton = miniActivity:find("chat_sequence"):find("button") assert(chatButton) if tostring(activityInst.Chat) ~= "" then local chatTexture = "r2_mini_activity_chat.tga" chatButton.texture = chatTexture chatButton.texture_pushed = chatTexture chatButton.texture_over = chatTexture else local chatTexture = "r2_mini_activity_empty_chat.tga" chatButton.texture = chatTexture chatButton.texture_pushed = chatTexture chatButton.texture_over = chatTexture end -- activity type button local activityButton = miniActivity:find("activity"):find("button") assert(activityButton) local activityTexture = r2.activityTexture[activityInst.Activity] if activityTexture then activityButton.texture = activityTexture activityButton.texture_pushed = activityTexture activityButton.texture_over = activityTexture end -- activity type text local activityText = miniActivity:find("activity_name") assert(activityText) activityText.uc_hardtext = activityInst.Activity end end startCount = sequence.Components.Size else noActivityLabel.active = true noActivityLabel.uc_hardtext = tostring(i18n.get("uiR2EdNoSequence")) end -- hide remaining mini activity templates for i=startCount, r2.maxActivities-1 do local miniActivity = miniActivities[tostring(i)] assert(miniActivity) miniActivity.active = false end end function r2:closeMiniActivityView() local miniActivityView = getUI("ui:interface:r2ed_mini_activity_view") assert(miniActivityView) miniActivityView.active = false end function r2:openActivitiesSequence() r2:updateActivitiesAndChatsUI(r2:getSelectedInstance()) local triggersUI = getUI("ui:interface:r2ed_triggers") assert(triggersUI) triggersUI.active = true triggersUI:updateCoords() if triggersUI.Env.openFirst == nil then triggersUI:center() triggersUI.Env.openFirst = true end r2:closeMiniActivityView() end function r2:chooseOrOpenSelectedChatSequence() r2:updateActivitiesAndChatsUI(r2:getSelectedInstance()) -- init menu local menuName = "ui:interface:r2ed_chat_sequences_menu" launchContextMenuInGame(menuName) local menu = getUI(menuName) local rootMenu = menu:getRootMenu() assert(rootMenu) rootMenu:reset() -- update menu local miniActivity = getUICaller().parent.parent.parent assert(miniActivity) local miniActivityNb = tonumber(miniActivity.Env.id) local activitySequence = r2:getSelectedSequInst("r2ed_triggers") assert(activitySequence) local activityInst = activitySequence.Components[miniActivityNb] local chatSequenceId = tostring(activityInst.Chat) local newLine = 3 --title "Chat sequence" local chatSequence if chatSequenceId ~= "" then chatSequence = r2:getInstanceFromId(chatSequenceId) assert(chatSequence) --rootMenu:addLine(ucstring(tostring(i18n.get("uiR2EDChatSequence")).." " .. chatSequence.Name .." : "), "lua", "", "Title") rootMenu:addLine(ucstring(tostring(i18n.get("uiR2EDChatSequence")).." " .. r2:getSequenceName(chatSequence) .." : "), "lua", "", "Title") else rootMenu:addLine(ucstring(tostring(i18n.get("uiR2EDChatSequence")).." : "), "lua", "", "Title") end rootMenu:addSeparator() -- "Open chat sequence" if chatSequenceId ~= "" then --rootMenu:addLine(ucstring(tostring(i18n.get("uiR2EDOpen")).." "..chatSequence.Name), "lua", "r2:openMiniActivityChatSequence("..tostring(miniActivityNb)..")", "Open") rootMenu:addLine(ucstring(tostring(i18n.get("uiR2EDOpen")).." "..r2:getSequenceName(chatSequence)), "lua", "r2:openMiniActivityChatSequence("..tostring(miniActivityNb)..")", "Open") newLine = newLine + 1 end -- "Any chat sequence" rootMenu:addLine(ucstring(i18n.get("uiR2EdNoChat")), "lua", "r2:setSequenceChatToMiniActivity("..tostring(miniActivityNb)..")", "None") -- "new chat sequence" rootMenu:addLine(ucstring(tostring(i18n.get("uiR2EdNewChat")).."..."), "lua", "r2:newChatsSequenceAndSelect("..tostring(miniActivityNb)..")", "None") local menuButton = createGroupInstance("r2_menu_button", "", { bitmap = "r2_icon_create.tga", size="14" }) rootMenu:setUserGroupLeft(newLine, menuButton) rootMenu:addSeparator() local activeLogicEntity = r2:getSelectedInstance() assert(activeLogicEntity) for i=0, activeLogicEntity:getBehavior().ChatSequences.Size-1 do local sequence = activeLogicEntity:getBehavior().ChatSequences[i] assert(sequence) --rootMenu:addLine(ucstring(sequence.Name), "lua", "r2:setSequenceChatToMiniActivity("..tostring(miniActivityNb)..", " .. tostring(i)..")", sequence.InstanceId) rootMenu:addLine(ucstring(r2:getSequenceName(sequence)), "lua", "r2:setSequenceChatToMiniActivity("..tostring(miniActivityNb)..", " .. tostring(i)..")", sequence.InstanceId) end -- display menu menu:updateCoords() local ref = getUICaller() menu.y = ref.y_real - (menu.h - ref.h_real) menu.x = ref.x_real menu:updateCoords() end function r2:openMiniActivityChatSequence(miniActivityNb, chatSequenceId) local activitySequence = r2:getSelectedSequInst("r2ed_triggers") assert(activitySequence) local activityInst = activitySequence.Components[miniActivityNb] if chatSequenceId == nil then chatSequenceId = tostring(activityInst.Chat) end r2:openChatSequence(chatSequenceId) end function r2:openChatSequence(chatSequenceId) if chatSequenceId == nil then chatSequenceId = r2:getSelectedEltInst("r2ed_triggers").Chat end local chatSequences = getUI("ui:interface:r2ed_chat_sequence") assert(chatSequences) local tab = chatSequences:find("sequence_tabs") assert(tab) local selectedTab local sequenceUI for i=0, tab.tabButtonNb-1 do sequence = tab:getGroup(i) assert(sequence) if sequence.Env.sequenceId == chatSequenceId then sequenceUI = sequence selectedTab = i break end end if selectedTab then tab.selection = selectedTab local repeatButton = chatSequences:find("repeat_group"):find("repeat"):find("toggle_butt") assert(repeatButton) local sequenceInstId = sequenceUI.Env.sequenceId local sequenceInst = r2:getInstanceFromId(sequenceInstId) repeatButton.pushed = (sequenceInst.Repeating == 0) end r2:openChatSequences() end function r2:newChatsSequenceAndSelect(miniActivityNb) local chatSequenceId = r2:newChatsSequence(true) if chatSequenceName ~= -1 then r2:setSequenceChatToMiniActivity(miniActivityNb, -1, chatSequenceId) r2:openMiniActivityChatSequence(miniActivityNb, chatSequenceId) end end function r2:setSequenceChatToMiniActivity(miniActivityNb, sequenceNb, chatSequenceId) local miniActivityView = getUI("ui:interface:r2ed_mini_activity_view") assert(miniActivityView) local miniActivities = miniActivityView:find("mini_activities") assert(miniActivities) local miniActivity = miniActivities[tostring(miniActivityNb)] assert(miniActivity) local activitySequence = r2:getSelectedSequInst("r2ed_triggers") assert(activitySequence) local activityInst = activitySequence.Components[miniActivityNb] local chatTexture if sequenceNb == nil then r2:selectChatSequence("None", activityInst.InstanceId) chatTexture = "r2_mini_activity_empty_chat.tga" else local activeLogicEntity = r2:getSelectedInstance() assert(activeLogicEntity) if chatSequenceId == nil then local chatSequence = activeLogicEntity:getBehavior().ChatSequences[tonumber(sequenceNb)] assert(chatSequence) chatSequenceId = chatSequence.InstanceId end r2:selectChatSequence(chatSequenceId, activityInst.InstanceId) chatTexture = "r2_mini_activity_chat.tga" end local chatButton = miniActivity:find("chat_sequence"):find("button") assert(chatButton) chatButton.texture = chatTexture chatButton.texture_pushed = chatTexture chatButton.texture_over = chatTexture end function r2:openActivity() r2:updateActivitiesAndChatsUI(r2:getSelectedInstance()) local miniActivity = getUICaller().parent.parent.parent assert(miniActivity) local sequenceUI = r2:getSelectedSequ("r2ed_triggers") assert(sequenceUI) local activityList = sequenceUI:find("elements_list") assert(activityList) local eltEditor = activityList:find("edit_element") assert(eltEditor) local indexEltEditor = activityList:getElementIndex(eltEditor) local activityIndex = miniActivity.Env.id if indexEltEditor<=activityIndex then activityIndex=activityIndex+1 end local activityUI = activityList:getChild(activityIndex) assert(activityUI) local selectedButtonElt = activityUI:find("select") assert(selectedButtonElt) selectedButtonElt.pushed = true r2:selectTriggerElement(nil, "r2ed_triggers", selectedButtonElt) r2:updateActivityEditor() r2:openActivitiesSequence() end function r2:selectSequenceTab(uiName, index) if uiName == "r2ed_triggers" then r2:updateSequencesButtonBar(index) end local eltsUI = getUI("ui:interface:"..uiName) assert(eltsUI) local sequencesTab = eltsUI:find("sequence_tabs") assert(sequencesTab) local repeatButton = eltsUI:find("repeat_group"):find("repeat"):find("toggle_butt") assert(repeatButton) local sequenceUI = sequencesTab:getGroup(index) assert(sequenceUI) local sequenceInstId = sequenceUI.Env.sequenceId if sequenceInstId and r2:getInstanceFromId(sequenceInstId) then local sequenceInst = r2:getInstanceFromId(sequenceInstId) repeatButton.pushed = (sequenceInst.Repeating == 0) end end function r2:getSequenceName(sequenceInst) local name = sequenceInst.Name local index = -1 if name == "" then local components = sequenceInst.Parent for i=0, components.Size-1 do if components[i].InstanceId == sequenceInst.InstanceId then index = i break end end if index >= 0 then local startName if sequenceInst:isKindOf("ChatSequence") then startName = tostring(i18n.get("uiR2EdSequChat")) elseif sequenceInst:isKindOf("ActivitySequence") then startName = tostring(i18n.get("uiR2EdSeq")) end name = startName..(index+1) end end return name end