--- @section Timer local timer_duration = 1800 --- Gets initial timer values. --- @within Timer --- @return result table Initial timer values.
--- Fields:
--- * progress (number) Clock timer revolution progress (0 to 1). function Timer.get_initial() return { progress = 0, } end --- Sets the number of frames for one full timer revolution. --- @within Timer --- @param frames number Frames per revolution. function Timer.set_duration(frames) timer_duration = frames end --- Updates the timer and handles revolution events. --- @within Timer function Timer.update() if not Context or not Context.game_in_progress or not Context.meters or not Context.timer then return end local t = Context.timer local in_minigame = string.find(Window.get_current_id(), "^minigame_") ~= nil if not in_minigame then t.progress = t.progress + (1 / timer_duration) if t.progress >= 1 then Day.increase() t.progress = t.progress - 1 end end end --- Draws the clock timer indicator as a circular progress bar. --- @within Timer function Timer.draw() if not Context or not Context.game_in_progress or not Context.meters or not Context.timer then return end if Context.meters.hidden and not Context.stat_screen_active then return end local cx = 10 local cy = 20 local r_outer = 5 local r_inner = 3 local progress = Context.timer.progress local fg_color if progress <= 0.25 then fg_color = Config.colors.white elseif progress <= 0.5 then fg_color = Config.colors.light_blue elseif progress <= 0.75 then fg_color = Config.colors.blue elseif progress <= 1 then fg_color = Config.colors.red end local bg_color = Config.colors.dark_grey local start_angle = -math.pi * 0.5 local progress_angle = progress * 2 * math.pi local r_outer_sq = r_outer * r_outer local r_inner_sq = r_inner * r_inner for dy = -r_outer, r_outer do for dx = -r_outer, r_outer do local dist_sq = dx * dx + dy * dy if dist_sq <= r_outer_sq and dist_sq > r_inner_sq then local angle = math.atan(dy, dx) local relative = angle - start_angle if relative < 0 then relative = relative + 2 * math.pi end if relative <= progress_angle then pix(cx + dx, cy + dy, fg_color) else pix(cx + dx, cy + dy, bg_color) end end end end local hand_angle = start_angle + progress_angle local hand_x = math.floor(cx + math.cos(hand_angle) * (r_inner - 1) + 0.5) local hand_y = math.floor(cy + math.sin(hand_angle) * (r_inner - 1) + 0.5) line(cx, cy, hand_x, hand_y, Config.colors.white) end