-- ring access point window RingAccessPoint = { CurrList = {}, CurrActiveList = {}, SortDir = {}, SelectedSessionId = nil, TextCache = {}, -- cache for text widgets CenteredTextCache = {}, NumberCache = {}, -- cache for number widgets BitmapCache = {}, -- cache for bitmap widgets JaugeCache = {}, -- cache for jauge widgets -- Map language to the displayed texture LangToTex = { en = "flag-en.tga", fr = "flag-fr.tga", de = "flag-de.tga" }, -- Map scenario flags to the bitmaps displayed in the first column FlagsToTex = { [0] = { Bitmap = "blank.tga", Color = "0 0 0 0 " }, [1] = { Bitmap = "rap_not_invited_dm.tga", Color = "255 255 255 255" }, [2] = { Bitmap = "rap_invited_no_dm.tga", Color = "255 255 255 255" }, [3] = { Bitmap = "rap_invited_dm.tga", Color = "255 255 255 255" }, [4] = { Bitmap = "r2ed_icon_stop.tga", Color = "255 255 255 255" }, }, LangFilter = { en = true, fr = true, de = true, misc = true }, WaitingList = false, FirstShow = true, RefreshPeriod = 10, WaitingPeriod = 15, MinRefreshPeriod = 4, LastRefreshTime = 0, LastRefreshQuerryTime = 0, PendingRefresh = false, ListReceived = false, -- ScenarioTypeToUtf8 = {} } local sampleList1 = { } local function luaDate(y, mo, d, h, m) assert(nil) -- a adapter return { year = y, month = mo, day = d, hour = h, min = m } end local refTime = os.time() table.insert(sampleList1, { Id=0, Owner = "", Title="Scenar de toto", Desc="Fight scenario", Level=0, Flags=0, PlayerCount=0, Language="en", LaunchDate=refTime - 1000, ScenarioType = 0, NbRating=1, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=1, Owner = "titi", Title="Titi's scenario", Desc="Un peu de RP", Level=0, Flags=1, PlayerCount=4, Language="en", LaunchDate=refTime - 2000, ScenarioType = 1, NbRating=0, RateFun=0, RateDifficulty=0, RateAccessibility=0, RateOriginality=0, RateDirection=0}) table.insert(sampleList1, { Id=2, Owner = "bob", Title="Yubo's back", Desc="Chasse aux yubos", Level=0, Flags=1, PlayerCount=10, Language="en", LaunchDate=refTime - 3000, ScenarioType = 2, NbRating=3, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=3, Owner = "bobette", Title="Capriny hill", Desc="Une colline est envahie de capriny, nettoyer la", Level=1, Flags=1, PlayerCount=2, Language="fr", LaunchDate=refTime - 4000, ScenarioType = 3, NbRating=1, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=4, Owner = "nico", Title="Nico test", Desc="Scenario de test de nico", Level=1, Flags=2, PlayerCount=3, Language="fr", LaunchDate=refTime - 10000, ScenarioType = 4, NbRating=1, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=5, Owner = "toto2", Title="Scenar de toto", Desc="Fight scenario", Level=-1, Flags=2, PlayerCount=0, Language="de", LaunchDate=refTime - 20000, ScenarioType = 5, NbRating=7, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=6, Owner = "titi2", Title="Titi's scenario", Desc="Un peu de RP", Level=10, Flags=3, PlayerCount=4, Language="it", LaunchDate=refTime - 40000, ScenarioType = 6, NbRating=1, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=7, Owner = "bob2", Title="Yubo's back", Desc="Chasse aux yubos", Level=2, Flags=3, PlayerCount=10, Language="cz", LaunchDate=refTime - 60000, ScenarioType = 0, NbRating=1, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=8, Owner = "bobette2", Title="Capriny hill", Desc="Une colline est envahie de capriny, nettoyer la", Level=2, Flags=0, PlayerCount=2, Language="en", LaunchDate=refTime - 80000, ScenarioType = 1, NbRating=1, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=9, Owner = "nico2", Title="Nico test", Desc="Scenario de test de nico", Level=3, Flags=0, PlayerCount=3, Language="fr", LaunchDate=refTime - 100000, ScenarioType = 2, NbRating=100, RateFun=0, RateDifficulty=45, RateAccessibility=78, RateOriginality=123, RateDirection=99}) table.insert(sampleList1, { Id=10, Owner = "toto3", Title="Scenar de toto", Desc="Fight scenario", Level=3, Flags=0, PlayerCount=0, Language="de", LaunchDate=refTime - 200000, ScenarioType = 3, NbRating=1, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=11, Owner = "titi3", Title="Titi's scenario", Desc="Un peu de RP", Level=4, Flags=0, PlayerCount=4, Language="en", LaunchDate=refTime - 300000, ScenarioType = 4, NbRating=1, RateFun=8, RateDifficulty=12, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=12, Owner = "bob3", Title="Yubo's back", Desc="Chasse aux yubos", Level=4, Flags=0, PlayerCount=10, Language="fr", LaunchDate=refTime - 500000, ScenarioType = 5, NbRating=45, RateFun=8, RateDifficulty=2, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=13, Owner = "bobette3", Title="Capriny hill", Desc="Une colline est envahie de capriny, nettoyer la", Level=4, Flags=0, PlayerCount=2, Language="de", LaunchDate=refTime - 600000, ScenarioType = 6, NbRating=1, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=14, Owner = "nico3", Title="Nico test", Desc="Scenario de test de nico", Level=5, Flags=0, PlayerCount=3, Language="en", LaunchDate=refTime - 800000, ScenarioType = 0, NbRating=12, RateFun=8, RateDifficulty=2, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=15, Owner = "toto4", Title="Scenar de toto", Desc="Fight scenario", Level=5, Flags=0, PlayerCount=0, Language="fr", LaunchDate=refTime - 1000000, ScenarioType = 1, NbRating=11, RateFun=8, RateDifficulty=56, RateAccessibility=78, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=16, Owner = "titi'", Title="Titi's scenario", Desc="Un peu de RP", Level=5, Flags=0, PlayerCount=4, Language="en", LaunchDate=refTime - 2000000, ScenarioType = 2, NbRating=12, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=88, RateDirection=99}) table.insert(sampleList1, { Id=17, Owner = "bob4", Title="Yubo's back", Desc="Chasse aux yubos", Level=5, Flags=0, PlayerCount=10, Language="fr", LaunchDate=refTime - 3000000, ScenarioType = 3, NbRating=13, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=18, Owner = "bobette4", Title="Capriny hill", Desc="Une colline est envahie de capriny, nettoyer la", Level=5, Flags=0, PlayerCount=2, Language="de", LaunchDate=refTime - 4000000, ScenarioType = 4, NbRating=14, RateFun=8, RateDifficulty=56, RateAccessibility=88, RateOriginality=78, RateDirection=99}) table.insert(sampleList1, { Id=19, Owner = "nico4", Title="Nico test", Desc="Scenario de test de nico", Level=5, Flags=0, PlayerCount=3, Language="en", LaunchDate=refTime - 5000000, ScenarioType = 5, NbRating=18, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) local sampleList2 = { } table.insert(sampleList2, { Id=0, Owner = "", Title="Scenar de toto", Desc="Fight scenario", Level=0, Flags=0, PlayerCount=0, Language="en", LaunchDate=refTime - 1000, ScenarioType = 0, NbRating=18, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList2, { Id=1, Owner = "titi", Title="Titi's scenario", Desc="Un peu de RP", Level=0, Flags=1, PlayerCount=4, Language="en", LaunchDate=refTime - 2000, ScenarioType = 1, NbRating=18, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList2, { Id=2, Owner = "bob", Title="Yubo's back", Desc="Chasse aux yubos", Level=0, Flags=1, PlayerCount=10, Language="en", LaunchDate=refTime - 3000, ScenarioType = 2, NbRating=18, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList2, { Id=3, Owner = "bobette", Title="Capriny hill", Desc="Une colline est envahie de capriny, nettoyer la", Level=1, Flags=1, PlayerCount=2, Language="fr", LaunchDate=refTime - 4000, ScenarioType = 3, NbRating=18, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList2, { Id=4, Owner = "nico", Title="Nico test", Desc="Scenario de test de nico", Level=1, Flags=2, PlayerCount=3, Language="fr", LaunchDate=refTime - 10000, ScenarioType = 4, NbRating=18, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList2, { Id=5, Owner = "toto2", Title="Scenar de toto", Desc="Fight scenario", Level=1, Flags=2, PlayerCount=0, Language="de", LaunchDate=refTime - 20000, ScenarioType = 5, NbRating=18, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList2, { Id=6, Owner = "titi2", Title="Titi's scenario", Desc="Un peu de RP", Level=1, Flags=3, PlayerCount=4, Language="it", LaunchDate=refTime - 40000, ScenarioType = 6, NbRating=18, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) table.insert(sampleList2, { Id=7, Owner = "bob2", Title="Yubo's back", Desc="Chasse aux yubos", Level=2, Flags=3, PlayerCount=10, Language="cz", LaunchDate=refTime - 60000, ScenarioType = 0, NbRating=18, RateFun=8, RateDifficulty=56, RateAccessibility=32, RateOriginality=78, RateDirection=99}) local boolToInt = { } boolToInt[false] = 0 boolToInt[true] = 1 --********************************* -- standard comparison local function less(lhs, rhs) if type(lhs) == "boolean" then return boolToInt[lhs] < boolToInt[rhs] else return lhs < rhs end end --********************************* -- reversed comparison local function more(lhs, rhs) return not less(lhs,rhs) end --********************************* -- sorting by language local function isBuiltInLang(lang) return RingAccessPoint.LangToTex[lang] ~= nil end local function lessLang(lhs, rhs) if isBuiltInLang(lhs) and isBuiltInLang(rhs) then return lhs < rhs else if isBuiltInLang(rhs) then return false end if isBuiltInLang(lhs) then return true end return lhs < rhs end end --********************************* -- sorting by scenario type local function lessScenarioType(lhs, rhs) return RingAccessPoint.ScenarioTypeToUtf8[lhs] < RingAccessPoint.ScenarioTypeToUtf8[rhs] end --********************************* local function readableHour(time) if config.LanguageCode=="en" then return os.date("%I:%M %p", time) else return os.date("%H:%M", time) end end --********************************* local function readableDay(time) if config.LanguageCode=="en" then return os.date("%m/%d/%Y", time) else return os.date("%d/%m/%Y", time) end end --********************************* -- build a readable date local function readableDate(time) if os.date("%d/%m/%Y") == os.date("%d/%m/%Y", time) then -- session started today return readableHour(time) else return "@{AAAF}" .. readableDay(time) .. " @{FFFF}" .. readableHour(time) end end -- init sort dir table.insert(RingAccessPoint.SortDir, { Var="Flags", Up=false, Cmp = more }) table.insert(RingAccessPoint.SortDir, { Var="LaunchDate", Up=false, Cmp = less}) table.insert(RingAccessPoint.SortDir, { Var="Owner", Up=false, Cmp = less }) table.insert(RingAccessPoint.SortDir, { Var="Title", Up=false, Cmp = less }) table.insert(RingAccessPoint.SortDir, { Var="Desc", Up=false, Cmp = less }) table.insert(RingAccessPoint.SortDir, { Var="Level", Up=false, Cmp = less }) table.insert(RingAccessPoint.SortDir, { Var="PlayerCount", Up=false, Cmp = less }) table.insert(RingAccessPoint.SortDir, { Var="ScenarioType", Up=false, Cmp = lessScenarioType }) table.insert(RingAccessPoint.SortDir, { Var="Language", Up=false, Cmp = lessLang }) table.insert(RingAccessPoint.SortDir, { Var="AllowFreeTrial", Up=false, Cmp = more }) table.insert(RingAccessPoint.SortDir, { Var="RateFun", Up=false, Cmp = less }) table.insert(RingAccessPoint.SortDir, { Var="RateDifficulty", Up=false, Cmp = less }) table.insert(RingAccessPoint.SortDir, { Var="RateAccessibility", Up=false, Cmp = less }) table.insert(RingAccessPoint.SortDir, { Var="RateOriginality", Up=false, Cmp = less }) table.insert(RingAccessPoint.SortDir, { Var="RateDirection", Up=false, Cmp = less }) --*********************************************************************** function RingAccessPoint:getWindow() return getUI("ui:interface:ring_sessions") end --*********************************************************************** function RingAccessPoint:initScenarioTypes() for k = 0, 6 do self.ScenarioTypeToUtf8[k] = i18n.get("uiRAP_ST_" .. tostring(k)):toUtf8() end end --*********************************************************************** function RingAccessPoint:isInvited(flags) return flags == 2 or flags == 3 end --*********************************************************************** function RingAccessPoint:isAllowedSession(allowFreeTrial) local freeTrial = isPlayerFreeTrial() return (not freeTrial or (freeTrial and allowFreeTrial~=0)) end --*********************************************************************** function RingAccessPoint:isKicked(flags) return flags == 4 end --*********************************************************************** function RingAccessPoint:getColumn(name) return getUI("ui:interface:ring_sessions:content:main:enclosing:columns:getw:column_group:" .. name .. ":values") end --*********************************************************************** function RingAccessPoint:getSelectList() return getUI("ui:interface:ring_sessions:content:main:enclosing:columns:getw:select") --return getUI("ui:interface:checkpass:content:enclosing:select") end local scratchUCStr = ucstring() --*********************************************************************** function RingAccessPoint:newTemplate(name, cache) local group if table.getn(cache) ~= 0 then group = cache[table.getn(cache)] table.remove(cache, table.getn(cache)) else group = createGroupInstance(name, "", {}) end return group end local lineFeed = ucstring("\n") local lineEnd = ucstring(". ") --*********************************************************************** -- build a new text group from utf8 text function RingAccessPoint:newTextLabel(value) local group = self:newTemplate("rap_text", self.TextCache) scratchUCStr:fromUtf8(value) scratchUCStr = findReplaceAll(scratchUCStr, lineFeed, lineEnd) group:find("t").uc_hardtext_single_line_format = scratchUCStr return group end --*********************************************************************** -- build a new text group from utf8 text function RingAccessPoint:newCenteredTextLabel(value) local group = self:newTemplate("rap_text_centered", self.CenteredTextCache) scratchUCStr:fromUtf8(value) group:find("t").uc_hardtext_single_line_format = scratchUCStr return group end --*********************************************************************** function RingAccessPoint:newNumberLabel(value) local group = self:newTemplate("rap_number", self.NumberCache) group:find("t").uc_hardtext_single_line_format = tostring(value) return group end --*********************************************************************** function RingAccessPoint:newBitmap(texName, color) if color == nil then color = "255 255 255 255" end local group = self:newTemplate("rap_bitmap", self.BitmapCache) group.f.texture = texName group.f.color = color return group end --*********************************************************************** function RingAccessPoint:newBooleanLabel(value) local group = self:newTemplate("rap_bitmap", self.BitmapCache) if value == true then group.f.texture="patch_on.tga" group.f.color="255 255 255 255" else group.f.texture="blank.tga" group.f.color="0 0 0 0" end return group end --*********************************************************************** function RingAccessPoint:newJauge(value) local group = self:newTemplate("rap_rating", self.JaugeCache) local jaugeUI = group:find("jauge_bar") local levelUI = group:find("level_rating") local level, progress = RingPlayerInfo:getLevelRatingAndImprovementRate(value) jaugeUI.w = progress*group.f.w levelUI.texture = "r2ed_ring_rating_" .. level .. ".tga" return group end --*********************************************************************** function RingAccessPoint:addLine(line) self:getColumn("owner"):addChild(self:newTextLabel(line.Owner)) self:getColumn("title"):addChild(self:newTextLabel(line.Title)) local level = line.Level-1 if level >= 0 and level <= 5 then self:getColumn("level"):addChild(self:newNumberLabel(i18n.get("uiRAP_Level" .. tostring(level)):toUtf8())) else self:getColumn("level"):addChild(self:newNumberLabel("?")) end self:getColumn("flags"):addChild(self:newBitmap(self.FlagsToTex[line.Flags].Bitmap, self.FlagsToTex[line.Flags].Color)) self:getColumn("player_count"):addChild(self:newNumberLabel(tostring(line.PlayerCount))) if self.LangToTex[line.Language] ~= nil then self:getColumn("language"):addChild(self:newBitmap(self.LangToTex[line.Language])) elseif i18n.hasTranslation("uiR2ED" .. line.Language) then self:getColumn("language"):addChild(self:newCenteredTextLabel(i18n.get("uiR2ED" .. line.Language):toUtf8())) else self:getColumn("language"):addChild(self:newCenteredTextLabel(line.Language)) end if self.ScenarioTypeToUtf8[line.ScenarioType] == nil then self:getColumn("scenario_type"):addChild(self:newTextLabel("?")) else self:getColumn("scenario_type"):addChild(self:newTextLabel(self.ScenarioTypeToUtf8[line.ScenarioType])) end self:getColumn("launch_date"):addChild(self:newNumberLabel(readableDate(line.LaunchDate))) -- --self:getColumn("author_rrp_rating"):addChild(self:newJauge(line.AuthorRating)) --self:getColumn("owner_rrp_rating"):addChild(self:newJauge(line.OwnerRating)) -- --self:getColumn("scenario_rrp_rating"):addChild(self:newNumberLabel(line.ScenarioRRPTotal)) end --*********************************************************************** function RingAccessPoint:putColumnInCache(column, cache) local childrenCount = column.childrenNb for i = 0, childrenCount - 1 do local child = column:getChild(column.childrenNb - 1) table.insert(cache, child) column:detachChild(child) end end --*********************************************************************** function RingAccessPoint:putMixedColumnInCache(column, textCache, bitmapCache) local childrenCount = column.childrenNb for i = 0, childrenCount - 1 do local child = column:getChild(column.childrenNb - 1) if child:find("t") then table.insert(textCache, child) else table.insert(bitmapCache, child) end column:detachChild(child) end end --*********************************************************************** function RingAccessPoint:putInCache() self.TextCache = {} self.CenteredTextCache = {} self.NumberCache = {} self.BitmapCache = {} self:putColumnInCache(self:getColumn("owner"), self.TextCache) self:putColumnInCache(self:getColumn("scenario_type"), self.TextCache) self:putColumnInCache(self:getColumn("title"), self.TextCache) self:putColumnInCache(self:getColumn("launch_date"), self.NumberCache) -- self:putColumnInCache(self:getColumn("level"), self.NumberCache) self:putColumnInCache(self:getColumn("player_count"), self.NumberCache) -- self:putColumnInCache(self:getColumn("flags"), self.BitmapCache) -- self:putMixedColumnInCache(self:getColumn("language"), self.CenteredTextCache, self.BitmapCache) -- --self:putColumnInCache(self:getColumn("author_rrp_rating"), self.JaugeCache) --self:putColumnInCache(self:getColumn("owner_rrp_rating"), self.JaugeCache) --self:putColumnInCache(self:getColumn("scenario_rrp_rating"), self.NumberCache) end --*********************************************************************** function RingAccessPoint:clear() self:getColumn("owner"):clear() self:getColumn("scenario_type"):clear() self:getColumn("title"):clear() self:getColumn("launch_date"):clear() self:getColumn("level"):clear() self:getColumn("flags"):clear() self:getColumn("player_count"):clear() self:getColumn("language"):clear() -- --self:getColumn("author_rrp_rating"):clear() --self:getColumn("owner_rrp_rating"):clear() --self:getColumn("scenario_rrp_rating"):clear() self.TextCache = {} self.CenteredTextCache = {} self.NumberCache = {} self.BitmapCache = {} self:getSelectList():clear() self:getSelectList().active = false self.CurrList = {} self.CurrActiveList = {} self.ListReceived = false end --*********************************************************************** function RingAccessPoint:testFill1() self:onSessionListReceived(sampleList1) end --*********************************************************************** function RingAccessPoint:testFill2() self:onSessionListReceived(sampleList2) end --*********************************************************************** function RingAccessPoint:onSessionListReceived(list) self.WaitingList = false self.LastRefreshTime = nltime.getLocalTime() / 1000 self.ListReceived = true self:fill(list) --self:getWindow():find("refreshText").active = false end --*********************************************************************** function RingAccessPoint:fill(list) local enlargeButton = self:getWindow():find("enlarge") enlargeButton.frozen = false -- if the window is not active, then maybe an old msg -> ignore if not self:getWindow().active then return end self:enableButtons(true) -- local startTime = nltime.getPreciseLocalTime() -- self:getWindow():find("join").frozen = true self:getWindow():find("tell").frozen = true -- self:putInCache() -- -- ("***********************") --debugInfo("TextCache size = " .. table.getn(self.TextCache)) --debugInfo("CenteredTextCache size = " .. table.getn(self.CenteredTextCache)) --debugInfo("NumberCache size = " .. table.getn(self.NumberCache)) --debugInfo("BitmapCache size = " .. table.getn(self.BitmapCache)) --self:clear() self.CurrList = list self.CurrActiveList = {} self:sort() local selectList = self:getSelectList() selectList:clear() local count = 0 local displayedCount = 0 local lastSessionFound = false for k, v in pairs(self.CurrList) do count = count + 1 local active if isBuiltInLang(v.Language) then active = self.LangFilter[v.Language] else active = self.LangFilter["misc"] end -- if player is invited, then always display if self:isInvited(v.Flags) then active = true end if active then self:addLine(v) local newGroup = createGroupInstance("rap_select_line", selectList.id, { id=tostring(v.Id)}) newGroup.active = active selectList:addChild(newGroup) newGroup:find("but").pushed = (v.Id == self.SelectedSessionId) if v.Id == self.SelectedSessionId then lastSessionFound = true end table.insert(self.CurrActiveList, v) displayedCount = displayedCount + 1 end end if not lastSessionFound then self.SelectedSessionId = nil end if displayedCount == 0 then if count ~= 0 then self:setErrorMessage(i18n.get("uiRAP_NoSessionForLangFilter")) else self:setErrorMessage(i18n.get("uiRAP_NoSessionFound")) self:enableButtons(false) end else self:clearMessage() end local endTime = nltime.getPreciseLocalTime() self:updateJoinAndTellButtons() end --*********************************************************************** function RingAccessPoint:setMessage(msg, color) -- display the error msg at the bottom of the window local errorTxt = self:getWindow():find("refreshText") -- The version below set the msg in the middle of the window --local errorTxt = self:getWindow():find("errorMsg") errorTxt.uc_hardtext = msg errorTxt.color = color errorTxt.active=true --self:getWindow():invalidateCoords() end --*********************************************************************** function RingAccessPoint:clearMessage() --local errorTxt = self:getWindow():find("errorMsg") local errorTxt = self:getWindow():find("refreshText") errorTxt.active = false end --*********************************************************************** function RingAccessPoint:setErrorMessage(msg) self:setMessage(msg, "192 64 0 255") end --*********************************************************************** function RingAccessPoint:setInfoMessage(msg) self:setMessage(msg, "255 255 255 255") end --*********************************************************************** function RingAccessPoint:sort(list) local sortDir = self.SortDir local function sorter(lhs, rhs) for k = 1, table.getn(sortDir) do if lhs[sortDir[k].Var] ~= rhs[sortDir[k].Var] then if sortDir[k].Up then return not sortDir[k].Cmp(lhs[sortDir[k].Var], rhs[sortDir[k].Var]) else return sortDir[k].Cmp(lhs[sortDir[k].Var], rhs[sortDir[k].Var]) end end end return false end table.sort(self.CurrList, sorter) end --*********************************************************************** function RingAccessPoint:headerLeftClick(down, criterion) -- change column sort order local parent = getUICaller().parent parent.tdown.active = down parent.tup.active = not down -- insert local sortDir = self.SortDir for k = 1, table.getn(sortDir) do if sortDir[k].Var == criterion then sortDir[k].Up = not sortDir[k].Up table.insert(sortDir, 1, sortDir[k]) table.remove(sortDir, k + 1) if self.ListReceived then self:fill(self.CurrList) -- update only if list has been received end return end end end --*********************************************************************** function RingAccessPoint:getSessionFromId(id) for k, v in pairs(self.CurrList) do if v.Id == id then return v end end return nil end --*********************************************************************** function RingAccessPoint:onLineLeftClick() self.SelectedSessionId = self.CurrActiveList[self:getSelectList():getElementIndex(getUICaller().parent) + 1].Id local selectList = self:getSelectList() for k = 0, selectList.childrenNb - 1 do local but = selectList:getChild(k):find("but") if but == getUICaller() then but.pushed = true else but.pushed = false end end self:updateJoinAndTellButtons() local session = self:getSessionFromId(self.SelectedSessionId) if not self:isAllowedSession(session.AllowFreeTrial) then local text = getUI("ui:interface:warning_free_trial:text") if text then text.hardtext = i18n.get("uiRingWarningFreeTrial") end runAH(nil, "enter_modal", "group=ui:interface:warning_free_trial") end end --*********************************************************************** function RingAccessPoint:onLineSessionTooltip() local activeLine = self.CurrActiveList[self:getSelectList():getElementIndex(getUICaller().parent) + 1] local contextHelpText if self:isInvited(activeLine.Flags) then contextHelpText = i18n.get("uiRAP_HowToJoin"):toUtf8() else contextHelpText = i18n.get("uiRAP_HowToBeInvited"):toUtf8() end local desc = activeLine.Desc if desc=="" then desc="-" end contextHelpText = contextHelpText .. "\n\n@{6F6F}" .. i18n.get("uiR2EDProp_LoadScenario_Description"):toUtf8() .. " : @{FFFF}" .. ucstring(desc):toUtf8() .. "\n\n" local rateFun = "@{6F6F}" .. i18n.get("uiRAP_RateFun"):toUtf8() .. " : @{FFFF}" local rateDiff = "@{6F6F}" .. i18n.get("uiRAP_RateDifficulty"):toUtf8() .. " : @{FFFF}" local rateAccess = "@{6F6F}" .. i18n.get("uiRAP_RateAccessibility"):toUtf8() .. " : @{FFFF}" local rateOrig = "@{6F6F}" .. i18n.get("uiRAP_RateOriginality"):toUtf8() .. " : @{FFFF}" local rateDirection = "@{6F6F}" .. i18n.get("uiRAP_RateDirection"):toUtf8() .. " : @{FFFF}" if activeLine.NbRating>0 then rateFun = rateFun .. tostring(math.min(100, activeLine.RateFun)) .. "/100" rateDiff = rateDiff .. tostring(math.min(100, activeLine.RateDifficulty)) .. "/100" rateAccess = rateAccess .. tostring(math.min(100, activeLine.RateAccessibility)) .. "/100" rateOrig = rateOrig .. tostring(math.min(100, activeLine.RateOriginality)) .. "/100" rateDirection = rateDirection .. tostring(math.min(100, activeLine.RateDirection)) .. "/100" else rateFun = rateFun .. i18n.get("uiRAP_NoRate"):toUtf8() rateDiff = rateDiff .. i18n.get("uiRAP_NoRate"):toUtf8() rateAccess = rateAccess .. i18n.get("uiRAP_NoRate"):toUtf8() rateOrig = rateOrig .. i18n.get("uiRAP_NoRate"):toUtf8() rateDirection = rateDirection .. i18n.get("uiRAP_NoRate"):toUtf8() end -- contextHelpText = contextHelpText .. rateFun .. "\n" -- contextHelpText = contextHelpText .. rateDiff .. "\n" -- contextHelpText = contextHelpText .. rateAccess .. "\n" -- contextHelpText = contextHelpText .. rateOrig .. "\n" -- contextHelpText = contextHelpText .. rateDirection .. "\n" local uc_contextHelpText = ucstring() uc_contextHelpText:fromUtf8(contextHelpText) setContextHelpText(uc_contextHelpText) end --*********************************************************************** function RingAccessPoint:updateJoinAndTellButtons() if self.SelectedSessionId then local session = self:getSessionFromId(self.SelectedSessionId) self:getWindow():find("join").frozen = not self:isInvited(session.Flags) or not self:isAllowedSession(session.AllowFreeTrial) self:getWindow():find("tell").frozen = self:isKicked(session.Flags) or not self:isAllowedSession(session.AllowFreeTrial) else self:getWindow():find("join").frozen = true self:getWindow():find("tell").frozen = true end end --*********************************************************************** function RingAccessPoint:onLineRightClick() self:onLineLeftClick() local menu = getUI("ui:interface:ring_session_menu") local session = self:getSessionFromId(self.SelectedSessionId) menu:find("join").grayed = not self:isInvited(session.Flags) or not self:isAllowedSession(session.AllowFreeTrial) menu:find("tell").grayed = self:isKicked(session.Flags) or not self:isAllowedSession(session.AllowFreeTrial) launchContextMenuInGame("ui:interface:ring_session_menu") end --*********************************************************************** function RingAccessPoint:onJoin() if not isFullyPatched() then runAH(nil, "leave_modal", "") self:getWindow().active = false bgdownloader:inGamePatchUncompleteWarning() return end if self:isInvited(self:getSessionFromId(self.SelectedSessionId).Flags) then --debugInfo("join session with id = " .. self.SelectedSessionId) game.joinRingSession(self.SelectedSessionId) self:getWindow().active = false else -- can't join this session without invitation displaySystemInfo(i18n.get("uiRAP_NotInvited"), "BC") end end --*********************************************************************** -- called by C++ if session joining failed function RingAccessPoint:onJoinFailed() messageBoxWithHelp(i18n.get("uiRAP_JoinFailed")) end --*********************************************************************** function RingAccessPoint:onTell() --debugInfo("tell to owner of session" .. self.SelectedSessionId) player = ucstring() player:fromUtf8(self:getSessionFromId(self.SelectedSessionId).Owner) tell(player, i18n.get("uiRAP_AskForInvite")) displaySystemInfo(concatUCString(i18n.get("uiRAP_TellSentTo"), player), "BC") end --*********************************************************************** function RingAccessPoint:onLineLeftDblClick() local session = self:getSessionFromId(self.SelectedSessionId) if self:isKicked(session.Flags) then return end if not self:isAllowedSession(session.AllowFreeTrial) then local text = getUI("ui:interface:warning_free_trial:text") if text then text.hardtext = i18n.get("uiRingWarningFreeTrial") end runAH(nil, "enter_modal", "group=ui:interface:warning_free_trial") return end if self:isInvited(session.Flags) then validMessageBox(i18n.get("uiRAP_JoinConfirm"), "lua", "RingAccessPoint:onJoin()", "", "", "ui:interface") else -- default to a tell self:onTell() end end --*********************************************************************** function RingAccessPoint:updateLangFilterUI() self:getWindow():find("lang_en").pushed = self.LangFilter.en self:getWindow():find("lang_fr").pushed = self.LangFilter.fr self:getWindow():find("lang_de").pushed = self.LangFilter.de self:getWindow():find("lang_misc").pushed = self.LangFilter.misc end --*********************************************************************** function RingAccessPoint:toggleLangfilter(lang) self.LangFilter[lang] = not self.LangFilter[lang] self:updateLangFilterUI() self:fill(self.CurrList) end --*********************************************************************** function RingAccessPoint:refresh() self.PendingRefresh = true self.LastRefreshTime = nltime.getLocalTime() / 1000 self.WaitingList = true --debugInfo("*refresh*") end --*********************************************************************** -- Special : called when a tell tagged as 'R2_INVITE' has been received (called by C++) -- Because the player is now invited in a session, force a refresh to display -- the 'invite' icon function RingAccessPoint:forceRefresh() self:refresh() self.LastRefreshQuerryTime = 0 -- make believe last refresh was *quite* long ago... end --*********************************************************************** function RingAccessPoint:updatePendingRefresh() if self.PendingRefresh then local currTime = nltime.getLocalTime() / 1000 if currTime - self.LastRefreshQuerryTime > self.MinRefreshPeriod and game.getRingSessionList then --debugInfo("doing actual querry") self.LastRefreshQuerryTime = currTime self.PendingRefresh = false -- when you load an animation, lua state isn't initialized for a short time game.getRingSessionList() end end end --*********************************************************************** function RingAccessPoint:onShow() runAH(nil, 'context_ring_sessions', '') if(getUI("ui:interface:ring_sessions").active) then self:initScenarioTypes() setOnDraw(self:getWindow(), "RingAccessPoint:onDraw()") self:updateLangFilterUI() self:clear() self:enableButtons(false) self:refresh() local enlargeButton = self:getWindow():find("enlarge") enlargeButton.frozen = false end end local waitTextColor = CRGBA(255, 255, 255, 255) function RingAccessPoint:connectError(errorTextId) if not self.WaitingList then return end self:clear() self:setErrorMessage(i18n.get(errorTextId)) self.WaitingList = false self.PendingRefresh = false self.LastRefreshTime = nltime.getLocalTime() / 1000 -- force to wait some more --self:getWindow():find("refreshText").active = false end --*********************************************************************** -- called by C++ if retrieving of sessions failed function RingAccessPoint:onConnectionFailed() self:connectError("uiRAP_ConnectionFailed") end --*********************************************************************** -- called by C++ if retrieving of sessions failed function RingAccessPoint:onDisconnection() self:connectError("uiRAP_Disconnection") end --*********************************************************************** -- called by C++ if retrieving of sessions failed function RingAccessPoint:onConnectionClosed() self:connectError("uiRAP_ConnectionClosed") end --*********************************************************************** function RingAccessPoint:enableButtons(enabled) self:updateLangFilterUI() local win = self:getWindow() win:find("lang_en").frozen = not enabled win:find("lang_fr").frozen = not enabled win:find("lang_de").frozen = not enabled win:find("lang_misc").frozen = not enabled local alpha if enabled then alpha = 255 else alpha = 128 end win:find("en_bm").alpha = alpha win:find("fr_bm").alpha = alpha win:find("de_bm").alpha = alpha win:find("misc_bm").alpha = alpha self:getSelectList().active = enabled end --*********************************************************************** function RingAccessPoint:show() -- update msg local win = self:getWindow() win.active = true if self.FirstShow then local w, h = getWindowSize() win.w = w * 5 / 6 win.h = h * 5 / 6 win:invalidateCoords() win:updateCoords() win:center() win:invalidateCoords() win:updateCoords() self.FirstShow = false end win:blink(1) end --*********************************************************************** function RingAccessPoint:enlargeColumns() self:getWindow():find("header_line"):enlargeColumns(10) local enlargeButton = self:getWindow():find("enlarge") enlargeButton.frozen = true end --*********************************************************************** function RingAccessPoint:onResize() local enlargeButton = self:getWindow():find("enlarge") enlargeButton.frozen = false end --*********************************************************************** function RingAccessPoint:onDraw() local timeInSec = nltime.getLocalTime() / 1000 if self.WaitingList then if timeInSec - self.LastRefreshTime > self.WaitingPeriod then self.WaitingList = false self.LastRefreshTime = nltime.getLocalTime() / 1000 --self:getWindow():find("refreshText").active = false else local waitText = i18n.get("uiRAP_WaitMsg" .. math.fmod(os.time(), 3)) self:setInfoMessage(waitText) --local refreshText = self:getWindow():find("refreshText") --if not self.ListReceived then -- self:setInfoMessage(waitText) -- waitTextColor.A = 127 + 127 * (0.5 + 0.5 * math.cos(6 * timeInSec)) -- local errorTxt = self:getWindow():find("errorMsg") -- errorTxt.color_rgba = waitTextColor -- refreshText.active = false --else -- refreshText.active = true -- refreshText.uc_hardtext = waitText --end end else if timeInSec - self.LastRefreshTime > self.RefreshPeriod then self:refresh() end end self:updatePendingRefresh() end --*********************************************************************** function RingAccessPoint:newScenario() if not isFullyPatched() then self:getWindow().active = false bgdownloader:inGamePatchUncompleteWarning() return end --self:getWindow().active = false --getUI("ui:interface:r2ed_scenario_control").active=true runAH(getUICaller(), 'open_scenario_control', '') if getUI("ui:interface:ring_scenario_loading_window").active then self:getWindow().active = false end end