local SKIN_S = tex.get_screen_scale() local SKIN = { diff_sort_margin_1 = { x = 25 * SKIN_S }, diff_sort_margin_2 = { x = 23 * SKIN_S }, diff_sort_margin_3 = { x = 10 * SKIN_S }, diff_sort_offset = { x = 100 * SKIN_S }, diff_sort_offset_2 = { x = 245 * SKIN_S }, diff_sort_star_spacing = { x = 40.5 * SKIN_S }, diff_sort_stat_num_star = { x = 70 * SKIN_S, y = -108 * SKIN_S }, } -- Default difficulty / star sort window. The engine's DiffSortSelect keeps the state (cursor, -- confirmation, statistics, animations); this draws it. -- -- Not a SongSelect class: SongSelectScript installs draw_sort_window from here when the skin's own -- SongSelect does not define one, or when it returns false (a one-menu skin declines the classic -- window, which is what this draws). local M = {} local function T(name) return tex.get_texture("song_select/diff_sort/" .. name) end local function digit_of(counter, i) return counter:byte(i) - 48 end local function draw_statistics(w) local box, in_level = w:box(), w:in_level() tex.draw_texture(T("stat_bg_" .. tex.player_num() .. "p")) tex.draw_texture(T("stat_overlay")) tex.draw_texture(T("stat_diff"), { frame = math.min(box, 4) }) local m1 = SKIN.diff_sort_margin_1.x local m2 = SKIN.diff_sort_margin_2.x local m3 = SKIN.diff_sort_margin_3.x -- centred digit row at the given margin local function centred(sprite, counter, margin, params) local total_width = #counter * margin for i = 1, #counter do local p = { frame = digit_of(counter, i), x = -(total_width / 2) + (i - 1) * margin } for k, v in pairs(params or {}) do p[k] = v end tex.draw_texture(sprite, p) end end if in_level or box == 5 then tex.draw_texture(T("stat_starx")) local stats local counter if box == 5 then tex.draw_texture(T("stat_prev")) counter = tostring(w:prev_level()) stats = w:stats(w:prev_diff(), w:prev_level()) else counter = tostring(w:level()) stats = w:stats(box, w:level()) end local star = SKIN.diff_sort_stat_num_star for i = 1, #counter do tex.draw_texture(T("stat_num_star"), { frame = digit_of(counter, i), x = star.x - (#counter - (i - 1)) * m1, y = star.y }) end local total = tostring(stats.total) centred(T("stat_num"), total, m2) for j = 0, 1 do centred(T("stat_num_small"), total, m3, { index = j }) end for j = 0, 1 do centred(T("stat_num_star"), tostring(j == 0 and stats.full_combos or stats.clears), m1, { index = j + 1 }) end else local sums = w:sums(box) local total = tostring(sums.total) centred(T("stat_num"), total, m2) for j = 0, 1 do centred(T("stat_num_small"), total, m3, { index = j }) end for j = 0, 1 do centred(T("stat_num_star"), tostring(j == 0 and sums.full_combos or sums.clears), m1, { index = j + 1 }) end end end local function draw_diff_select(w, a) local box, num_boxes = w:box(), w:num_boxes() tex.draw_texture(T("background"), { scale = a.bg_resize, center = true }) tex.draw_texture(T("back"), { fade = a.fade_in }) local offset = SKIN.diff_sort_offset.x for i = 0, num_boxes - 1 do if i == box then tex.draw_texture(T("box_highlight"), { x = offset * i, fade = a.fade_in }) tex.draw_texture(T("box_text_highlight"), { frame = i, x = offset * i, fade = a.fade_in }) else tex.draw_texture(T("box"), { x = offset * i, fade = a.fade_in }) tex.draw_texture(T("box_text"), { frame = i, x = offset * i, fade = a.fade_in }) end end if box == -1 then tex.draw_texture(T("back_outline"), { fade = a.flicker }) else tex.draw_texture(T("box_outline"), { x = offset * box, fade = a.flicker }) end for i = 0, num_boxes - 1 do if i < 5 then tex.draw_texture(T("box_diff"), { frame = i, x = offset * i }) end end if box ~= -1 and box ~= num_boxes - 1 then draw_statistics(w) end end local function draw_level_select(w, a) local box, level = w:box(), w:level() tex.draw_texture(T("background"), { scale = a.bg_resize, center = true }) if w:confirmation() then tex.draw_texture(T("star_select_prompt")) else tex.draw_texture(T("star_select_text"), { fade = a.fade_in }) end tex.draw_texture(T("star_limit"), { frame = box, fade = a.fade_in }) tex.draw_texture(T("level_box"), { fade = a.fade_in }) tex.draw_texture(T("diff"), { frame = box, fade = a.fade_in }) tex.draw_texture(T("star_num"), { frame = level, fade = a.fade_in }) local spacing = SKIN.diff_sort_star_spacing.x for i = 0, level - 1 do tex.draw_texture(T("star"), { x = i * spacing, fade = a.fade_in }) end if w:confirmation() then local lb = tex.get_texture_info("diff_sort", "level_box") if lb then tex.draw_rect(lb.x[1], lb.y[1], lb.x2[1], lb.y2[1], 0, 0, 0, 127) end local y = a.bounce local offset = SKIN.diff_sort_offset_2.x for i = 0, 2 do if i == w:confirm_index() then tex.draw_texture(T("small_box_highlight"), { x = i * offset, y = y }) tex.draw_texture(T("small_box_text_highlight"), { frame = i, x = i * offset, y = y }) tex.draw_texture(T("small_box_outline"), { x = i * offset, y = y, fade = a.flicker }) else tex.draw_texture(T("small_box"), { x = i * offset, y = y }) tex.draw_texture(T("small_box_text"), { frame = i, x = i * offset, y = y }) end end else tex.draw_texture(T("pongos")) if level ~= 1 then tex.draw_texture(T("arrow"), { x = -a.arrow_move, fade = a.arrow_fade, index = 0 }) end if level ~= w:limit(box) then tex.draw_texture(T("arrow"), { mirror = "horizontal", x = a.arrow_move, fade = a.arrow_fade, index = 1 }) end end draw_statistics(w) end -- Installed as SongSelect:draw_sort_window. function M.draw_sort_window(_self, w) if w:one_menu() then return end tex.draw_rect(0, 0, tex.get_screen_width(), tex.get_screen_height(), 0, 0, 0, 153) local a = w:anim() if w:in_level() then draw_level_select(w, a) else draw_diff_select(w, a) end end return M