r2.acts = { newLocation = "new location", enlargingFactor = 2, islands = {}, ecoSystemName = "r2_desert", islandButtonColors = { ["r2_desert"] = "157 110 74 255", ["r2_jungle"] = "47 110 54 255", ["r2_forest"] = "74 52 0 255", ["r2_lakes"] = "95 93 67 255", ["r2_roots"] = "66 52 41 255", }, islandSelectedButtonColors = { ["r2_desert"] = "152 60 39", ["r2_jungle"] = "18 156 51", ["r2_forest"] = "133 36 13", ["r2_lakes"] = "109 149 106", ["r2_roots"] = "73 148 122", }, islandOverButtonColors = { ["r2_desert"] = "127 48 33", ["r2_jungle"] = "0 51 20", ["r2_forest"] = "90 28 0", ["r2_lakes"] = "55 53 37", ["r2_roots"] = "36 22 11", }, ecosystemNames = { ["r2_desert"] = i18n.get("uiR2EDEcosystemDesert"):toUtf8(), ["r2_jungle"] = i18n.get("uiR2EDEcosystemJungle"):toUtf8(), ["r2_forest"] = i18n.get("uiR2EDEcosystemForest"):toUtf8(), ["r2_lakes"] = i18n.get("uiR2EDEcosystemLacustre"):toUtf8(), ["r2_roots"] = i18n.get("uiR2EDEcosystemPrimeRoots"):toUtf8(), }, selectedIslandButtonId = nil, selectedIslandName = nil, createNewScenario = true, deleteOldScenario = false, createNewLocation = true, currentScenario = { name="", level = 0, rules = "strict", notes = "" }, currentAct = { name="", weather = 0, manualWeather = true, notes = "", }, currentLocation = { name="", islandName = "", instanceId = "", season = "spring", manualSeason = true, notes = "", entryPoint = "", }, } -------------------------- to sort islands in function of their translated name ----------- function r2.acts:getIslandNb(islandName) local islandTrans = i18n.get(islandName):toUtf8() local islandNb = string.sub(islandTrans, -5) local endLen = 6 if string.sub(islandNb, 1, 1) ~= " " then islandNb = string.sub(islandNb, 3) endLen = endLen-1 else islandNb = string.sub(islandNb, 2) end -- outland test local outland = string.sub(islandTrans, 1, -endLen) outland = string.sub(outland, -7) if outland=="Outland" then return nil end islandNb = string.sub(islandNb, 1, -2) return tonumber(islandNb) end -------------------------------------------------------------------------------------- --------------------------- init location editor ------------------------------------- function r2.acts:initActsEditor() -- create scenario/act window local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) self.islands = {} local islands = getCompleteIslands() for islandName, islandAtts in pairs(islands) do local ecoSystemName = islandAtts.continent if self.islands[ecoSystemName] == nil then self.islands[ecoSystemName] = {} end local islandNb = self:getIslandNb(islandName) if islandNb then self.islands[ecoSystemName][islandNb] = {["name"] =islandName, ["table"] = islandAtts} end end local ecoList = actsUI:find("ecosystem_list_2") assert(ecoList) ecoList:clear() local ecoButtonsGr = actsUI:find("choose_ecosystem") assert(ecoButtonsGr) local buttonDim = 78 local maxWLine = actsUI:find("choose_island_2"):find("back_gr").w_real - 1 local nbButtonsInLine = math.floor(maxWLine/(buttonDim+2)) local addW = math.floor((maxWLine - buttonDim*nbButtonsInLine)/nbButtonsInLine) -- for each ecosystem group, create all islands buttons for ecoSysName, ecoSysTable in pairs(self.islands) do local ecoGr = createGroupInstance("template_lines", ecoList.id, {id=ecoSysName}) assert(ecoGr) ecoList:addChild(ecoGr) ecoGr.active = false local maxPackage = 0 local islandsNb = 0 for k, v in pairs(ecoSysTable) do local package = r2.getIslandRingAccess(v.name) if r2.RingAccess.testAccess(package) then local package = tonumber(string.sub(package, 2, 2)) if package>maxPackage then maxPackage = package end islandsNb=islandsNb+1 end end local nbLines = math.ceil(islandsNb/nbButtonsInLine) local ecoButton = ecoButtonsGr:find(ecoSysName):find("eco_button") assert(ecoButton) local uc_package = ucstring() uc_package:fromUtf8(i18n.get("uiR2EDEcosystemPackage"):toUtf8().." : "..maxPackage) ecoButton.tooltip = uc_package for i=0, nbLines-1 do local lineGr = createGroupInstance("template_line", ecoGr.id, {id="line"..i, h=buttonDim}) assert(lineGr) ecoGr:addChild(lineGr) end if ecoGr.childrenNb >0 then local currentLine = ecoGr:getChild(0) assert(currentLine) local currentEltInLine = 0 local currentLineNb = 0 for islandNb, islandAttrs in pairs(ecoSysTable) do local islandName = islandAttrs.name local islandTable = islandAttrs.table local textureName = islandName.."_sp_little.tga" local ringAccess = r2.RingAccess.testAccess( r2.getIslandRingAccess(islandName) ) if fileExists(textureName) and ringAccess then local tooltip = islandName local islandW = islandTable.xmax - islandTable.xmin local islandH = islandTable.ymax - islandTable.ymin local maxDim = math.max(islandW, islandH) local ratio = 64/maxDim local width = math.floor(islandW*ratio) local height = math.floor(islandH*ratio) local maxDim = buttonDim - 20 -- buttonDim - 2*(8+2) local w_button_texture local h_button_texture local x_button_texture local y_button_texture local scale = "false" scale, w_button_texture, h_button_texture, width, height = self:textureRedimension(textureName, maxDim, maxDim, width, height) scale = tostring(scale) -- center button island x_button_texture =((maxDim-width)/2 + 10) -- (8 + (maxDim-width)/2 + 2) y_button_texture =-((maxDim-height)/2 + 10) -- (-((maxDim-height)/2 + 8 + 2)) local tmplParams = { id=islandName, posparent="parent", posref="TL TL", sizeref= "", h = buttonDim+2, w = buttonDim+addW, x_button="0", y_button="0", w_button = -addW, h_button = "-2", icon = textureName, tooltip = tooltip, w_button_texture = w_button_texture, h_button_texture = h_button_texture, x_button_texture = x_button_texture, y_button_texture = y_button_texture, scale = scale, color= self.islandButtonColors[ecoSysName], back_color= self.islandButtonColors[ecoSysName], selected_color = self.islandSelectedButtonColors[ecoSysName].." 255", col_over = self.islandOverButtonColors[ecoSysName].." 80", group_params_l="r2.acts:openIslandCardFromButton('"..ecoSysName.."', '" ..islandName.."')", params_l="r2.acts:openIslandCardFromButton('"..ecoSysName.."', '" ..islandName.."')", } local buttonIsland = createGroupInstance("act_button_template", currentLine.id, tmplParams) if buttonIsland then currentLine:addChild(buttonIsland) buttonIsland.Env.Name = islandName end currentEltInLine = currentEltInLine+1 if currentEltInLine==nbButtonsInLine then currentLineNb = currentLineNb+1 if currentLineNb < ecoGr.childrenNb then currentLine = ecoGr:getChild(currentLineNb) end currentEltInLine = 0 end end end end end local newLocationMode = actsUI:find("new_location_mode_2") assert(newLocationMode) newLocationMode.Env.Name = self.newLocation local ringLevel = actsUI:find("ring_level") ringLevel.hardtext = "Ring level : " .. r2.getCharacterRingAccess() end -------------------------------------------------------------------------------------- --------------------------- open scenario editor ------------------------------------- function r2.acts:openScenarioActEditor(newScenario, noCancelOption, rebuildFirstAct) setKeyboardContext("r2ed_scenario_creation") local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) local locationEditor = actsUI:find("location") assert(locationEditor) local prevLocationEditor = actsUI:find("previous_location") assert(prevLocationEditor) actsUI.active = true setTopWindow(actsUI) self.createNewScenario = newScenario locationEditor.active = (newScenario==true or rebuildFirstAct==true) prevLocationEditor.active = not locationEditor.active self.createNewLocation = true local islandCancel = actsUI:find("island_cancel") assert(islandCancel) islandCancel.active = (noCancelOption~=true) local islandPrecedent = actsUI:find("island_precedent") assert(islandPrecedent) islandPrecedent.active = (self.createNewScenario~=true and rebuildFirstAct~=true) ----------------------------------------- -- init scenario/act/location properties self.currentScenario.level = 0 self.currentScenario.rules = "strict" self.currentAct.weather = math.random(0,1022) self.currentAct.manualWeather = true self.currentLocation.manualSeason = true local seasonNb = math.random(1,4) local seasons = {[1]="Spring", [2]="Summer", [3]="Autumn", [4]="Winter"} self.currentLocation.season = seasons[seasonNb] -- location season local seasonGr = actsUI:find("island_season") assert(seasonGr) local seasonButton = seasonGr:find(self.currentLocation.season) assert(seasonButton) self:selectButtonTemplate(seasonButton) local seasonManual = seasonGr:find("manual_season_2") assert(seasonManual) seasonManual:find("toggle_butt").pushed = not self.currentLocation.manualSeason -- act and scenario names if self.createNewScenario or rebuildFirstAct then self.currentAct.name = i18n.get("uiR2EDDefaultActTitle"):toUtf8() .. " 1" else local actNb = r2.Scenario.Acts.Size self.currentAct.name = i18n.get("uiR2EDDefaultActTitle"):toUtf8() .. " " .. actNb end if self.createNewScenario == true then self.currentScenario.name = i18n.get("uiR2EDNewScenario"):toUtf8() else r2.ScenarioWindow:setActNotes() -- select "new island" mode local newLocationMode = actsUI:find("new_location_mode_2") assert(newLocationMode) newLocationMode:find("button").active = false newLocationMode:find("selected_button").active = true self.currentLocation.islandName = "" self.currentLocation.instanceId = "" -- clean list of old previous locations local locationList = actsUI:find("location_list") assert(locationList) locationList:clear() self:openPreviousIslandsActs() local scrollPreviousLoc = actsUI:find("scroll_previous_islands") assert(scrollPreviousLoc) scrollPreviousLoc.trackPos = scrollPreviousLoc.h_real end self:openEcosystemIslands("r2_desert") end function r2.acts:backPreviousLocations() local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) local newLocationMode = actsUI:find("new_location_mode_2") assert(newLocationMode) self:locationIsland(newLocationMode:find("button")) local locationEditor = actsUI:find("location") assert(locationEditor) local prevLocationEditor = actsUI:find("previous_location") assert(prevLocationEditor) locationEditor.active = false prevLocationEditor.active = true end ------------------------------------------------------------------------------------------------------- function r2.acts:openPreviousIslandsActs() local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) local locationList = actsUI:find("location_list") assert(locationList) local enlargingFactor = self.enlargingFactor local locationActs = {} for key, act in specPairs(r2.Scenario.Acts) do local locationId = act.LocationId if locationActs[locationId]==nil then locationActs[locationId]={} end table.insert(locationActs[locationId], act.InstanceId) end for key, location in specPairs(r2.Scenario.Locations) do local islandName = location.IslandName local textureName = islandName .. "_sp.tga" local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) local islandTable local ecoSysName = nil for ecoSystem, ecoSysTable in pairs(self.islands) do local islandNb = self:getIslandNb(islandName) if ecoSysTable[islandNb] and ecoSysTable[islandNb].name == islandName then ecoSysName = ecoSystem islandTable = ecoSysTable[islandNb].table break end end if ecoSysName then local backTexture = ecoSysName .. "_back.tga" local islandW, islandH = (islandTable.xmax - islandTable.xmin)*enlargingFactor, (islandTable.ymax - islandTable.ymin)*enlargingFactor -- resize island button to see all island whitout deformation local totalDim = 200 local maxDim = totalDim-2*8 local w_button_texture local h_button_texture local x_button_texture local y_button_texture local scale = "false" local initW, initH = islandW, islandH scale, w_button_texture, h_button_texture, islandW, islandH = self:textureRedimension(textureName, maxDim, maxDim, islandW, islandH) scale = tostring(scale) -- center button island x_button_texture = (maxDim-islandW)/2 + 8 -- 8 + (maxDim-width)/2 + 2 y_button_texture = -((maxDim-islandH)/2 + 8) -- -((maxDim-height)/2 + 8 + 2) local h, h_button, y_button, h_text, y_text local marge=15 if locationList.childrenNb == 0 then h=totalDim h_button="0" y_button="0" h_text="0" y_text="0" else h=totalDim+marge h_button=-marge y_button=-marge h_text=-marge y_text=-marge end local tmplParams = { id=islandName, posparent="parent", posref="BR TR", sizeref="w", w="0", h=h, x="0", y="0", sizeref_act="h", w_act = totalDim, h_act="0", x_act="0", y_act="0", y_button=y_button, h_button=h_button, icon = textureName, w_button_texture = w_button_texture, h_button_texture = h_button_texture, x_button_texture = x_button_texture, y_button_texture = y_button_texture, scale = scale, color= self.islandButtonColors[ecoSysName], back_color= "255 255 255 255", selected_color = self.islandSelectedButtonColors[ecoSysName].." 255", col_over = self.islandSelectedButtonColors[ecoSysName].." 80", group_params_l="r2.acts:locationIsland(getUICaller())", params_l="r2.acts:locationIsland()", back_texture=backTexture, x_text=marge, w_text= -(totalDim + marge + 15), h_text=h_text, y_text=y_text, } local buttonIsland = createGroupInstance("previous_loc_template", locationList.id, tmplParams) if buttonIsland then locationList:addChild(buttonIsland) buttonIsland.Env.InstanceId = location.InstanceId local uc_island = ucstring() uc_island:fromUtf8(location.Name) buttonIsland:find("button"):find("center_button").tooltip = uc_island buttonIsland:find("selected_button"):find("center_button").tooltip = uc_island -- init text local textList = buttonIsland:find("text_list") assert(textList) local prevText = textList:find("previous_text") assert(prevText) local text = "'" .. location.Name .. "' Location used in acts :\n" prevText:addColoredTextChild(text, 200, 0, 0, 255) local acts = locationActs[location.InstanceId] for k, actId in pairs(acts) do local act = r2:getInstanceFromId(actId) local act_text = act.Name if act.ShortDescription~="" then act_text = act_text .. " : " end prevText:addColoredTextChild(act_text, 200, 120, 0, 255) if act.ShortDescription~="" then act_text = act.ShortDescription local uc_act = ucstring() uc_act:fromUtf8(act_text) prevText:addTextChild(uc_act) end end -- init scroll target local scroll = textList:find("scroll_previous") assert(scroll) local list = textList:find("list") assert(list) scroll:setTarget(list.id) end end end end -------------------------------------------------------------------------------------- --------------------------- texture button redimension ------------------------------- function r2.acts:textureRedimension(textureName, maxW, maxH, islandW, islandH) local scale = false local w, h if maxW 0) then -- color local ecoColor = self.islandSelectedButtonColors[self.ecoSystemName].." 255" local ecoColorBack = self.islandSelectedButtonColors[self.ecoSystemName].." 100" islandCard.active = true islandCard:find("bl").color = ecoColor islandCard:find("tl").color = ecoColor islandCard:find("tr").color = ecoColor islandCard:find("br").color = ecoColor islandCard:find("bottom").color = ecoColor islandCard:find("top").color = ecoColor islandCard:find("left").color = ecoColor islandCard:find("right").color = ecoColor islandCard:find("bg").color = ecoColorBack islandOk.active = true local firstIsland = selectedIslandsList:getChild(0) assert(firstIsland) self:openIslandCardFromButton(self.ecoSystemName, firstIsland.Env.Name) else local islandBitmap = actsUI:find("island_bitmap") assert(islandBitmap) islandBitmap.texture = "" islandCard.active = false islandOk.active = false end local scrollIslands = actsUI:find("scroll_islands_2") assert(scrollIslands) scrollIslands.trackPos = scrollIslands.h_real -- "choose island" title local title = actsUI:find("choose_island"):find("choose_island_title") assert(title) -- doesn't work in all language local titleText = " " .. i18n.get("uiR2EDChooseIsland"):toUtf8() .." " .. self.ecosystemNames[self.ecoSystemName] .. " " .. i18n.get("uiR2EDEcosystem"):toUtf8() .. " " local titleText = " " .. i18n.get("uiR2EDChooseIsland"):toUtf8() .. self.ecosystemNames[self.ecoSystemName] .. " " local uc_title = ucstring() uc_title:fromUtf8(titleText) title.uc_hardtext = uc_title end -------------------------------------------------------------------------------------- --------------------------- open island card and images ------------------------------ function r2.acts:openIslandCardFromButton(ecosystem, islandName) local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) local ecosystemList = actsUI:find("ecosystem_list_2") assert(ecosystemList) local ecosystemGr = ecosystemList:find(ecosystem) assert(ecosystemGr) local islandButton = ecosystemGr:find(islandName) assert(islandButton) -- unselect last selection if self.selectedIslandButtonId~=nil then local lastSelectedIsland = getUI(self.selectedIslandButtonId) if lastSelectedIsland ~= nil then lastSelectedIsland:find("button").active = true lastSelectedIsland:find("selected_button").active = false end end -- select button islandButton:find("button").active = false islandButton:find("selected_button").active = true self.selectedIslandButtonId = islandButton.id self.selectedIslandName = islandButton.Env.Name self.currentLocation.islandName = self.selectedIslandName self:openIslandCard(self.selectedIslandName) end -------------------------------------------------------------------------------------- --------------------------- open island card ----------------------------------------- function r2.acts:openIslandCard(islandName) local enlargingFactor = self.enlargingFactor local textureName = islandName .. "_sp.tga" local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) local islandBitmap = actsUI:find("island_bitmap") assert(islandBitmap) -- load texture islandBitmap.texture = textureName -- card title local title = actsUI:find("island_images"):find("card_title") assert(title) -- doesn't work in all language local titleText = " " .. i18n.get("uiR2EDZoomOn"):toUtf8() .." '" .. i18n.get(islandName):toUtf8() .. "' " .. i18n.get("uiR2EDIsland"):toUtf8() .. " " local titleText = " " .. i18n.get("uiR2EDZoomOn"):toUtf8() .. i18n.get(islandName):toUtf8() .. " " local uc_title = ucstring() uc_title:fromUtf8(titleText) title.uc_hardtext = uc_title local islandTable = self.islands[self.ecoSystemName][self:getIslandNb(islandName)].table local islandW, islandH = (islandTable.xmax - islandTable.xmin)*enlargingFactor, (islandTable.ymax - islandTable.ymin)*enlargingFactor local islandCard = actsUI:find("island_current_image") assert(islandCard) -- resize island button to see all island whitout deformation local maxW, maxH = islandCard.w_real-12, islandCard.h_real-12 local initW, initH = islandW, islandH islandBitmap.scale, islandBitmap.w, islandBitmap.h, islandW, islandH = self:textureRedimension(textureName, maxW, maxH, islandW, islandH) local cardButton = islandCard:find("selected_button") assert(cardButton) cardButton.w = - (maxW - islandW) cardButton.h = - (maxH - islandH) cardButton.x = (maxW - islandW)/2 cardButton.y = - (maxH - islandH)/2 -- center button island islandBitmap.x = 6 islandBitmap.y = -6 -- entry points local entryNb = 0 for location, entry in pairs(islandTable.entrypoints) do local entryPoinButton = actsUI:find("entrypoint"..entryNb):find("flag") entryPoinButton.active = true entryPoinButton.x = (enlargingFactor*(entry.x - islandTable.xmin)/initW)*islandW entryPoinButton.y = (enlargingFactor*(entry.y - islandTable.ymax)/initH)*islandH entryPoinButton.tooltip = i18n.get(location) entryPoinButton.parent.Env.Name = location if entryNb == 0 then entryPoinButton.texture = "r2ed_entry_point_pushed.tga" self.currentLocation.entryPoint = location else entryPoinButton.texture = "r2ed_entry_point.tga" end entryNb = entryNb+1 if entryNb==9 then break end end if entryNb < 9 then for i=entryNb, 9 do local entryPointGr = actsUI:find("entrypoint"..i) assert(entryPointGr) local entryPoinButton = entryPointGr:find("flag") entryPoinButton.active = false end end -- enlarge selected ecosystem button local ecoButton = actsUI:find(self.ecoSystemName) assert(ecoButton) local ecoList = ecoButton.parent assert(ecoList) for i=0, ecoList.childrenNb-1 do local button = ecoList:getChild(i) if button == ecoButton then button:find("eco_button").wmin = 164 else button:find("eco_button").wmin = 160 end end actsUI:invalidateCoords() actsUI:updateCoords() end -------------------------------------------------------------------------------------- --------------------------- select an entry point --------------------------------------- function r2.acts:selectEntryPoint() local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) for i=0, 9 do local entryPoinButton = actsUI:find("entrypoint"..i):find("flag") assert(entryPoinButton) if entryPoinButton == getUICaller() then getUICaller().texture = "r2ed_entry_point_pushed.tga" self.currentLocation.entryPoint = getUICaller().parent.Env.Name else entryPoinButton.texture = "r2ed_entry_point.tga" end end end -------------------------------------------------------------------------------------- --------------------------- choose a name for location ------------------------------- function r2.acts:chooseLocationName() local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) local chooseNamePopup = getUI("ui:interface:r2ed_choose_location_name") assert(chooseNamePopup) local editText = chooseNamePopup:find("edit_box_group") assert(editText) local name = editText.uc_input_string:toUtf8() -- check location name duplication if not self.createNewScenario then for i=0, r2.Scenario.Locations.Size-1 do local location = r2.Scenario.Locations[i] if location.Name == name then messageBox(i18n.get("uiR2EDLocationNameDuplicated")) return end end end if name~="" then self.currentLocation.name = name chooseNamePopup.active = false actsUI.active = false disableModalWindow() setKeyboardContext("r2ed") if self.createNewScenario==true then self:createScenario() else self:createAct() end else editText:setFocusOnText() end end -------------------------------------------------------------------------------------- --------------------------- choose a name for scenario/act --------------------------- function r2.acts:chooseScenarioActName() local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) local chooseNamePopup = getUI("ui:interface:r2ed_choose_scenario_act_name") assert(chooseNamePopup) -- act name local actGr = chooseNamePopup:find("act_name") assert(actGr) local actEditText = actGr:find("edit_box_group") assert(actEditText) local actName = actEditText.uc_input_string:toUtf8() local scenarioName = "" local scenarioEditText if self.createNewScenario == true then -- scenario name local scenarioGr = chooseNamePopup:find("scenario_name") assert(scenarioGr) scenarioEditText = scenarioGr:find("edit_box_group") assert(scenarioEditText) scenarioName = scenarioEditText.uc_input_string:toUtf8() end if (self.createNewScenario and scenarioName~="" and actName~="") or (not self.createNewScenario and actName~="") then chooseNamePopup.active = false disableModalWindow() self.currentScenario.name = scenarioName self.currentAct.name = actName if self.createNewLocation == true then local locationGr = actsUI:find("location") assert(locationGr) local scenarioActGr = actsUI:find("scenario_act") assert(scenarioActGr) scenarioActGr.active = false locationGr.active = true self:openEcosystemIslands("r2_desert") else actsUI.active = false if self.createNewScenario==true then self:createScenario() else self:createAct() end setKeyboardContext("r2ed") end elseif self.createNewScenario and scenarioName==""then scenarioEditText:setFocusOnText() elseif actName=="" then actEditText:setFocusOnText() end end -------------------------------------------------------------------------------------- --------------------------------- createScenario ------------------------------------- function r2.acts:createScenario() local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) -- scenario/act/location notes local scenarioNotes, actNotes scenarioNotes = "" actNotes = "" r2.resetNameGiver() -- create scenario component local scenario= r2.newComponent("Scenario") scenario.Ghost_Name = self.currentScenario.name scenario.Description.ShortDescription = scenarioNotes if r2.Scenario and r2.Scenario.Language then scenario.Language = r2.Scenario.Language end scenario.AccessRules = self.currentScenario.rules scenario.Description.LevelId = self.currentScenario.level scenario.Description.CreationDate = os.date() scenario.Description.Creator = r2:getUserEntityName() scenario.Description.CreatorMD5 = r2.getCharIdMd5() -- create permanent act component local act =r2.newComponent("Act") local features = act.Features local tmpDefault = r2.newComponent("DefaultFeature") act.Name = i18n.get("uiR2EDBaseAct"):toUtf8() table.insert(features, tmpDefault) table.insert(scenario.Acts, act) -- create act 1 component act = r2.newComponent("Act") local features = act.Features local tmpDefault = r2.newComponent("DefaultFeature") r2.ActUIDisplayer.LastSelfCreatedActInstanceId = act.InstanceId --act.Name = i18n.get("uiR2EDAct1"):toUtf8() .. ":" .. r2.currentAct.name act.Name = self.currentAct.name act.WeatherValue = self.currentAct.weather local manualWeather = 0 if self.currentAct.manualWeather == true then manualWeather = 1 end act.ManualWeather = manualWeather act.ShortDescription = actNotes table.insert(features, tmpDefault) table.insert(scenario.Acts, act) -- create location local location = r2.newComponent("Location") location.Season = self.currentLocation.season location.IslandName = self.currentLocation.islandName location.Name = self.currentLocation.name location.EntryPoint = self.currentLocation.entryPoint local manualSeason = 0 if self.currentLocation.manualSeason == true then manualSeason = 1 end location.ManualSeason = manualSeason table.insert(scenario.Locations, location) act.LocationId = location.InstanceId r2.requestCreateScenario(scenario) r2:waitScenarioScreen() self.deleteOldScenario = true end function r2.acts:createAct() r2.requestNewAction(i18n.get("uiR2EDNewActAction")) local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) -- act/location notes local actNotes = "" -- create act component local act =r2.newComponent("Act") local features = act.Features local tmpDefault = r2.newComponent("DefaultFeature") if (tmpDefault == nil) then debugWarning("Failed to create default feature"); return end r2.ActUIDisplayer.LastSelfCreatedActInstanceId = act.InstanceId local actNb = r2.Scenario.Acts.Size --act.Name = i18n.get("uiR2EDDefaultActTitle"):toUtf8() .. actNb .. ":" .. r2.currentAct.name act.Name = self.currentAct.name act.WeatherValue = self.currentAct.weather local manualWeather = 0 if self.currentAct.manualWeather == true then manualWeather = 1 end act.ManualWeather = manualWeather act.ShortDescription = actNotes table.insert(features, tmpDefault) if (act == nil) then debugWarning("Failed to create additionnal 'Act'"); return end -- create location local location if self.createNewLocation then location = r2.newComponent("Location") location.Season = self.currentLocation.season location.IslandName = self.currentLocation.islandName location.Name = self.currentLocation.name location.EntryPoint = self.currentLocation.entryPoint local manualSeason = 0 if self.currentLocation.manualSeason == true then manualSeason = 1 end location.ManualSeason = manualSeason act.LocationId = location.InstanceId r2.requestInsertNode(r2.Scenario.InstanceId, "Locations", -1, "", location) else act.LocationId = self.currentLocation.instanceId end r2.requestInsertNode(r2.Scenario.InstanceId, "Acts", -1, "", act) end -------------------------------------------------------------------------------------- --------------------------- choose location name popup ------------------------------- function r2.acts:openLocationName() local chooseNamePopup = getUI("ui:interface:r2ed_choose_location_name") assert(chooseNamePopup) local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) if not actsUI.active then return end local okButton = actsUI:find("island_ok") assert(okButton) enableModalWindow(okButton, chooseNamePopup.id) local editText = chooseNamePopup:find("edit_box_group") assert(editText) editText.uc_input_string = i18n.get(self.currentLocation.islandName) editText:setFocusOnText() end ------------------------ SELECT BUTTON IN LIST -------------------------------- -- only one button can be selected -------------------------------------------- function r2.acts:selectButtonTemplate(buttonTemplate) local list = buttonTemplate.parent assert(list) for i=0,list.childrenNb-1 do local child = list:getChild(i) assert(child) child:find("button").active = true child:find("selected_button").active = false end buttonTemplate:find("button").active = false buttonTemplate:find("selected_button").active = true end function r2.acts:selectButton(button) local list = button.parent assert(list) for i=0,list.childrenNb-1 do local child = list:getChild(i) assert(child) child:find("button").pushed = false end button:find("button").pushed = true end --------------------------- CHOOSE LOCATION SEASON --------------------------------------- function r2.acts:locationSeason(caller) local buttonTemplate if caller == nil then caller = getUICaller() buttonTemplate = caller.parent.parent else buttonTemplate = caller.parent end self:selectButtonTemplate(buttonTemplate) local list = buttonTemplate.parent local seasons = {[0]="Spring", [1]="Summer", [2]="Autumn", [3]="Winter"} local seasonNb = list:getElementIndex(buttonTemplate) self.currentLocation.season = seasons[seasonNb] end ----- MANUAL SEASON ACTIVATION ------------------------------------------------------- function r2.acts:manualSeason() local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) local manualButton = actsUI:find("manual_season_2"):find("toggle_butt") assert(manualButton) self.currentLocation.manualSeason = (manualButton.pushed==false) local seasonList = actsUI:find("season_list_2") assert(seasonList) seasonList.active = self.currentLocation.manualSeason end --- OPEN POPUP NAME FOR ACT/SCENARIO OR LOCATION ----------------------------------------- function r2.acts:openPopupName() local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) local createLocationGr = actsUI:find("location") assert(createLocationGr) local prevLocationGr = actsUI:find("previous_location") assert(prevLocationGr) if prevLocationGr.active then self:createLocationOrCreateAct() else self:openLocationName() end end --- CANCEL ACT/SCENARIO CREATION -------------------------------------------------------- function r2.acts:cancelActCreation() local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) actsUI.active =false setKeyboardContext("r2ed") end --------------------- update palette UI when change act ------------------------------ function r2.acts:updatePaletteFromEcosystem() local ecosystemTrees = { ["r2_desert"] = "fytrees", ["r2_forest"] = "fotrees", ["r2_jungle"] = "jutrees", ["r2_lakes"] = "trtrees", ["r2_roots"] = "prtrees", } local currentAct = r2:getCurrentAct() assert(currentAct) local botObjectsPalette = {} if not r2.Palette.BotEntries then return -- special case for the 'light' palette end botObjectsPalette = r2.Palette.BotEntries if not currentAct:isBaseAct() then local currentLocation = r2:getInstanceFromId(currentAct.LocationId) if currentLocation==nil then return end -- search for ecosystem of current location local islandEcosystem for ecoName, v in pairs(self.islands) do if self.islands[ecoName][self:getIslandNb(currentLocation.IslandName)].name==currentLocation.IslandName then islandEcosystem = ecoName break end end -- flag to display only vegetation of current ecosystem if islandEcosystem and ecosystemTrees[islandEcosystem] then for ecoName, v in pairs(ecosystemTrees) do botObjectsPalette[ecosystemTrees[ecoName]].Display = (ecoName==islandEcosystem) end end else for ecoName, v in pairs(ecosystemTrees) do botObjectsPalette[ecosystemTrees[ecoName]].Display = false end end r2:buildPaletteUI() end ---------------------------------------------------------------------------------------------- function r2.acts:locationIsland(caller) local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) local buttonTemplate if caller == nil then caller = getUICaller() buttonTemplate = caller.parent.parent else buttonTemplate = caller.parent end if buttonTemplate.Env.Name == self.newLocation then -- select "create new location" mode buttonTemplate:find("button").active = false buttonTemplate:find("selected_button").active = true self.createNewLocation = true -- deselect all previous locations local prevLocationList = actsUI:find("location_list") assert(prevLocationList) for i=0,prevLocationList.childrenNb-1 do local child = prevLocationList:getChild(i) assert(child) child:find("button").active = true child:find("selected_button").active = false end self.currentLocation.islandName = "" self.currentLocation.intanceId = "" else -- select this previous location self:selectButtonTemplate(buttonTemplate.parent) self.currentLocation.instanceId = buttonTemplate.parent.Env.InstanceId -- deselect "create new location" mode local newLocationMode = actsUI:find("new_location_mode_2") assert(newLocationMode) newLocationMode:find("button").active = true newLocationMode:find("selected_button").active = false self.createNewLocation = false end end -------------------------------------------------------------------------------------- --------------------------- choose a name for scenario/act --------------------------- function r2.acts:createLocationOrCreateAct() local actsUI = getUI("ui:interface:r2ed_acts") assert(actsUI) if self.createNewLocation then local createLocationGr = actsUI:find("location") assert(createLocationGr) local prevLocationGr = actsUI:find("previous_location") assert(prevLocationGr) createLocationGr.active = true prevLocationGr.active = false self:openEcosystemIslands("r2_desert") else actsUI.active = false disableModalWindow() setKeyboardContext("r2ed") self:createAct() end end