#include "ui/ui_extensions.lua" #include "challenges.lua" #include "game.lua" gChallengeLevelScale = 0 ChallengesView = {} ChallengesView = { selectedItem = nil, selectedIdx = 0, listState = UiCreateListState(true), listItems = {}, selectedChallengeType = "", reset = function(self) if self.selectedItem ~= nil then self.selectedItem.selected = false self.selectedItem = nil end self.selectedIdx = 0 self.listState:reset() if LastInputDevice() == UI_DEVICE_GAMEPAD then self:selectItem(1) end gChallengeLevelScale = 0 end, init = function(self) self.items = {} local id = 0 for i=1, #gSandbox do if not (gSandbox[i].level == "cullington" or gSandbox[i].level == "hub_carib") then id = id + 1 local item = { id = id, level = gSandbox[i].level, image = gSandbox[i].image, name = gSandbox[i].name, selected = false, locked = false, w = 350, h = 200, drawForGamepad = function(self) UiNavComponent(self.w, self.h) UiImageBox("common/item_preview_gradient.png", self.w, self.h, 8, 0) if self.selected then UiColor(1, 1, 0.5, 1) UiRoundedRectOutline(self.w, self.h, 6, 3) end end, drawForNotGamepad = function(self) UiNavComponent(self.w, self.h) local isFocused = ChallengesView.mouseOver and UiIsMouseInRect(self.w, self.h) local isClicked = isFocused and InputReleased("lmb") UiImageBox("common/item_preview_gradient.png", self.w, self.h, 8, 0) if self.selected then UiColor(1, 1, 0.5, 1) UiRoundedRectOutline(self.w, self.h, 6, 3) end self.focused = isFocused if isClicked then ChallengesView:selectItem(self.id) end end, draw = function(self) self.locked = not isLevelUnlocked(self.level) if LastInputDevice() == UI_DEVICE_GAMEPAD then if self.id == ChallengesView.selectedItem.id then if not self.locked then gChallengeLevelScale = 1 if ChallengesView.selectedChallengeType == "" then local list = getChallengesForLevel(self.level) local c = list[1] if #list ~= 0 and ChallengesView.canPlayChallenge(c) then ChallengesView.selectedChallengeType = c end end end end end UiPush() if self.locked then UiColorFilter(.5, .5, .5) else UiColorFilter(1, 1, 1 , 1) end UiColor(1, 1, 1, 1) if self.focused then UiColor(0.8, 0.8, 0.8) end UiImage(self.image) if LastInputDevice() == UI_DEVICE_GAMEPAD then self:drawForGamepad() else self:drawForNotGamepad() end UiPop() if self.locked then UiPush() UiTranslate(self.w / 2, self.h / 2) UiAlign("center middle") UiColor(1, 1, 1, 0.8) UiImageBox("menu/lock.png", 42, 42, 0, 0) UiPop() end UiPush() UiFont("bold.ttf", 27) UiTranslate(10, 163 + UiFontHeight()) UiColor(0.8, 0.8, 0.8, 0.8) UiWordWrap(self.w - 10) UiAlign("bottom") UiText(self.name) UiPop() end } table.insert(self.listItems, item) end end self:reset() end, selectItem = function(self, idx) if self.selectedItem ~= nil and self.listItems[idx].id == self.selectedItem.id then return end UiSound("common/click.ogg") self.listState:scrollToItem(idx, true) if self.selectedItem ~= nil then self.selectedItem.selected = false end self.selectedItem = self.listItems[idx] self.selectedItem.selected = true self.selectedIdx = idx -- if selection made with mouse then open details view if LastInputDevice() == UI_DEVICE_MOUSE and not self.selectedItem.locked then SetValue("gChallengeLevelScale", 1, "cosine", 0.25) end local list = getChallengesForLevel(self.selectedItem.level) if #list ~= 0 and self.canPlayChallenge(list[1]) then self.selectedChallengeType = list[1] else self.selectedChallengeType = "" end end } ChallengesView.listState.itemsPadding = 20 ChallengesView.listState.background.w = 1340 ChallengesView.listState.thumb.w = 300 ChallengesView.listState.scrollbarOffset = 30 ChallengesView.listState.allowListDrag = false ChallengesView.canPlayChallenge = function(id) if ChallengesView.selectedItem == nil then return false end local contains = false local challenges = getChallengesForLevel(ChallengesView.selectedItem.level) for i=1,#challenges do if challenges[i] == id then contains = true end end return isChallengeUnlocked(id) and isLevelUnlocked(ChallengesView.selectedItem.level) and contains end