linter fixes
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline failed

This commit is contained in:
2026-02-18 08:16:10 +01:00
parent f589b9bbca
commit 3922f51c8e
18 changed files with 132 additions and 153 deletions

View File

@@ -58,7 +58,9 @@ function AudioTestWindow.init()
AudioTestWindow.index_menu = 1
AudioTestWindow.index_func = 1
AudioTestWindow.list_func = AudioTestWindow.generate_listfunc()
AudioTestWindow.menuitems = AudioTestWindow.generate_menuitems(AudioTestWindow.list_func, AudioTestWindow.index_func)
AudioTestWindow.menuitems = AudioTestWindow.generate_menuitems(
AudioTestWindow.list_func, AudioTestWindow.index_func
)
end
function AudioTestWindow.draw()
@@ -72,11 +74,21 @@ function AudioTestWindow.update()
elseif Input.down() then
AudioTestWindow.index_menu = Util.safeindex(AudioTestWindow.menuitems, AudioTestWindow.index_menu + 1)
elseif Input.left() then
AudioTestWindow.index_func = Util.safeindex(AudioTestWindow.list_func, AudioTestWindow.index_func - 1)
AudioTestWindow.menuitems = AudioTestWindow.generate_menuitems(AudioTestWindow.list_func, AudioTestWindow.index_func)
AudioTestWindow.index_func = Util.safeindex(
AudioTestWindow.list_func,
AudioTestWindow.index_func - 1
)
AudioTestWindow.menuitems = AudioTestWindow.generate_menuitems(
AudioTestWindow.list_func, AudioTestWindow.index_func
)
elseif Input.right() then
AudioTestWindow.index_func = Util.safeindex(AudioTestWindow.list_func, AudioTestWindow.index_func + 1)
AudioTestWindow.menuitems = AudioTestWindow.generate_menuitems(AudioTestWindow.list_func, AudioTestWindow.index_func)
AudioTestWindow.index_func = Util.safeindex(
AudioTestWindow.list_func,
AudioTestWindow.index_func + 1
)
AudioTestWindow.menuitems = AudioTestWindow.generate_menuitems(
AudioTestWindow.list_func, AudioTestWindow.index_func
)
elseif Input.menu_confirm() then
AudioTestWindow.menuitems[AudioTestWindow.index_menu].desition()
elseif Input.menu_back() then

View File

@@ -27,15 +27,14 @@ function ConfigurationWindow.draw()
for i, control in ipairs(ConfigurationWindow.controls) do
local current_y = y_start + (i - 1) * 12
local color = Config.colors.green
if control.type == "numeric_stepper" then
local value = control.get()
local label_text = control.label
local value_text = string.format(control.format, value)
-- Calculate x position for right-aligned value
local value_x = x_value_right_align - (#value_text * char_width)
if i == ConfigurationWindow.selected_control then
color = Config.colors.item
Print.text("<", x_start -8, current_y, color)
@@ -58,7 +57,6 @@ function ConfigurationWindow.draw()
end
end
end
Print.text("Press B to go back", x_start, 120, Config.colors.light_grey)
end
@@ -97,4 +95,4 @@ function ConfigurationWindow.update()
end
end
end
end
end

View File

@@ -1,8 +1,6 @@
function GameWindow.draw()
local currentScreenData = Context.screens[Context.current_screen]
UI.draw_top_bar(currentScreenData.name)
if currentScreenData and currentScreenData.decisions and #currentScreenData.decisions > 0 then
local available_desitions = {}
for _, desition_id in ipairs(currentScreenData.decisions) do
@@ -41,7 +39,6 @@ function GameWindow.update()
end
local currentScreenData = Context.screens[Context.current_screen]
if currentScreenData and currentScreenData.decisions and #currentScreenData.decisions > 0 then
local available_desitions = {}
for _, desition_id in ipairs(currentScreenData.decisions) do
@@ -79,4 +76,4 @@ end
function GameWindow.set_state(new_state)
Context.active_window = new_state
-- Add any state-specific initialization/cleanup here later if needed
end
end

View File

@@ -1,9 +1,9 @@
function IntroWindow.draw()
function IntroWindow.draw()
local x = (Config.screen.width - 132) / 2 -- Centered text
Print.text(Context.intro.text, x, Context.intro.y, Config.colors.green)
end
function IntroWindow.update()
function IntroWindow.update()
Context.intro.y = Context.intro.y - Context.intro.speed
-- Count lines in intro text to determine when scrolling is done
@@ -21,5 +21,4 @@ function IntroWindow.update()
if Input.menu_confirm() then
GameWindow.set_state(WINDOW_MENU)
end
end
end

View File

@@ -4,7 +4,6 @@ function MinigameDDRWindow.init()
local arrow_spacing = 30
local total_width = (4 * arrow_size) + (3 * arrow_spacing)
local start_x = (Config.screen.width - total_width) / 2
Context.minigame_ddr = {
-- Progress bar (matching button mash style)
bar_fill = 0, -- 0 to 100
@@ -15,14 +14,12 @@ function MinigameDDRWindow.init()
bar_y = 10,
bar_width = 200,
bar_height = 12,
-- Arrow settings
arrow_size = arrow_size,
arrow_spawn_timer = 0,
arrow_spawn_interval = 45, -- Frames between arrow spawns (for random mode)
arrow_fall_speed = 1.5, -- Pixels per frame
arrows = {}, -- Active falling arrows {dir, x, y}
-- Target arrows at bottom (evenly spaced, centered on screen)
target_y = 115, -- Y position of target arrows
target_arrows = {
@@ -31,12 +28,10 @@ function MinigameDDRWindow.init()
{dir = "up", x = start_x + (arrow_size + arrow_spacing) * 2},
{dir = "right", x = start_x + (arrow_size + arrow_spacing) * 3}
},
-- Hit detection
hit_threshold = 8, -- Pixels of tolerance for perfect hit
button_pressed_timers = {}, -- Visual feedback per arrow
button_press_duration = 8,
-- Input cooldown per direction
input_cooldowns = {
left = 0,
@@ -45,13 +40,11 @@ function MinigameDDRWindow.init()
right = 0
},
input_cooldown_duration = 10,
-- Song/Pattern system
frame_counter = 0, -- Tracks frames since start
current_song = nil, -- Current song data
pattern_index = 1, -- Current position in pattern
use_pattern = false, -- If true, use song pattern; if false, use random spawning
return_window = WINDOW_GAME
}
end
@@ -59,10 +52,8 @@ end
function MinigameDDRWindow.start(return_window, song_key)
MinigameDDRWindow.init()
Context.minigame_ddr.return_window = return_window or WINDOW_GAME
-- Debug: Store song_key for display
Context.minigame_ddr.debug_song_key = song_key
-- Load song pattern if specified
if song_key and Songs and Songs[song_key] then
Context.minigame_ddr.current_song = Songs[song_key]
@@ -78,7 +69,6 @@ function MinigameDDRWindow.start(return_window, song_key)
Context.minigame_ddr.debug_status = "Random mode"
end
end
Context.active_window = WINDOW_MINIGAME_DDR
end
@@ -126,7 +116,6 @@ end
local function draw_arrow(x, y, direction, color)
local size = 12
local half = size / 2
-- Draw arrow shape based on direction
if direction == "left" then
-- Triangle pointing left
@@ -149,16 +138,13 @@ end
function MinigameDDRWindow.update()
local mg = Context.minigame_ddr
-- Check for completion (bar filled to 100%)
if mg.bar_fill >= mg.max_fill then
Context.active_window = mg.return_window
return
end
-- Increment frame counter
mg.frame_counter = mg.frame_counter + 1
-- Check if song has ended (pattern mode only)
if mg.use_pattern and mg.current_song and mg.current_song.end_frame then
-- Song has ended if we've passed the end frame AND all arrows are cleared
@@ -168,16 +154,13 @@ function MinigameDDRWindow.update()
return
end
end
-- Spawn arrows based on mode (pattern or random)
if mg.use_pattern and mg.current_song and mg.current_song.pattern then
-- Pattern-based spawning (synced to song)
local pattern = mg.current_song.pattern
-- Check if current frame matches any pattern entry
while mg.pattern_index <= #pattern do
local spawn_entry = pattern[mg.pattern_index]
if mg.frame_counter >= spawn_entry.frame then
-- Time to spawn this arrow!
spawn_arrow_dir(spawn_entry.dir)
@@ -195,12 +178,10 @@ function MinigameDDRWindow.update()
mg.arrow_spawn_timer = 0
end
end
-- Update falling arrows
local arrows_to_remove = {}
for i, arrow in ipairs(mg.arrows) do
arrow.y = arrow.y + mg.arrow_fall_speed
-- Check if arrow went off-screen (miss)
if check_miss(arrow) then
table.insert(arrows_to_remove, i)
@@ -211,26 +192,22 @@ function MinigameDDRWindow.update()
end
end
end
-- Remove off-screen arrows (iterate backwards to avoid index issues)
for i = #arrows_to_remove, 1, -1 do
table.remove(mg.arrows, arrows_to_remove[i])
end
-- Update input cooldowns
for dir, _ in pairs(mg.input_cooldowns) do
if mg.input_cooldowns[dir] > 0 then
mg.input_cooldowns[dir] = mg.input_cooldowns[dir] - 1
end
end
-- Update button press timers
for dir, _ in pairs(mg.button_pressed_timers) do
if mg.button_pressed_timers[dir] > 0 then
mg.button_pressed_timers[dir] = mg.button_pressed_timers[dir] - 1
end
end
-- Check for arrow key inputs
local input_map = {
left = Input.left(),
@@ -238,12 +215,10 @@ function MinigameDDRWindow.update()
up = Input.up(),
right = Input.right()
}
for dir, pressed in pairs(input_map) do
if pressed and mg.input_cooldowns[dir] == 0 then
mg.input_cooldowns[dir] = mg.input_cooldown_duration
mg.button_pressed_timers[dir] = mg.button_press_duration
-- Check if any arrow matches this direction and is in hit range
local hit = false
for i, arrow in ipairs(mg.arrows) do
@@ -258,7 +233,6 @@ function MinigameDDRWindow.update()
break
end
end
-- If pressed but no arrow to hit, apply small penalty
if not hit then
mg.bar_fill = mg.bar_fill - 2
@@ -272,7 +246,6 @@ end
function MinigameDDRWindow.draw()
local mg = Context.minigame_ddr
-- Safety check
if not mg then
cls(0)
@@ -283,19 +256,15 @@ function MinigameDDRWindow.draw()
end
return
end
-- Draw the underlying window first (for overlay effect)
if mg.return_window == WINDOW_GAME then
GameWindow.draw()
end
-- Draw semi-transparent overlay background
rect(0, 0, Config.screen.width, Config.screen.height, Config.colors.black)
-- Draw progress bar background
rect(mg.bar_x - 2, mg.bar_y - 2, mg.bar_width + 4, mg.bar_height + 4, Config.colors.light_grey)
rectb(mg.bar_x - 2, mg.bar_y - 2, mg.bar_width + 4, mg.bar_height + 4, Config.colors.dark_grey)
-- Draw progress bar fill
local fill_width = (mg.bar_fill / mg.max_fill) * mg.bar_width
if fill_width > 0 then
@@ -306,14 +275,11 @@ function MinigameDDRWindow.draw()
elseif mg.bar_fill > 33 then
bar_color = Config.colors.bar
end
rect(mg.bar_x, mg.bar_y, fill_width, mg.bar_height, bar_color)
end
-- Draw progress percentage
local percentage = math.floor((mg.bar_fill / mg.max_fill) * 100)
Print.text_center(percentage .. "%", mg.bar_x + mg.bar_width / 2, mg.bar_y + 2, Config.colors.black)
-- Draw target arrows at bottom (light grey when not pressed)
if mg.target_arrows then
for _, target in ipairs(mg.target_arrows) do
@@ -322,17 +288,14 @@ function MinigameDDRWindow.draw()
draw_arrow(target.x, mg.target_y, target.dir, color)
end
end
-- Draw falling arrows (blue)
if mg.arrows then
for _, arrow in ipairs(mg.arrows) do
draw_arrow(arrow.x, arrow.y, arrow.dir, Config.colors.bar) -- blue color
end
end
-- Draw instruction text
Print.text_center("Hit the arrows!", Config.screen.width / 2, mg.bar_y + mg.bar_height + 10, Config.colors.light_grey)
-- Debug info (large and visible)
local debug_y = 60
if mg.debug_status then
@@ -340,11 +303,21 @@ function MinigameDDRWindow.draw()
debug_y = debug_y + 10
end
if mg.use_pattern then
Print.text_center("PATTERN MODE - Frame:" .. mg.frame_counter, Config.screen.width / 2, debug_y, Config.colors.green)
Print.text_center(
"PATTERN MODE - Frame:" .. mg.frame_counter,
Config.screen.width / 2,
debug_y,
Config.colors.green
)
if mg.current_song and mg.current_song.pattern then
Print.text_center("Pattern Len:" .. #mg.current_song.pattern .. " Index:" .. mg.pattern_index, Config.screen.width / 2, debug_y + 10, Config.colors.green)
Print.text_center(
"Pattern Len:" .. #mg.current_song.pattern .. " Index:" .. mg.pattern_index,
Config.screen.width / 2,
debug_y + 10,
Config.colors.green
)
end
else
Print.text_center("RANDOM MODE", Config.screen.width / 2, debug_y, Config.colors.bar)
end
end
end

View File

@@ -26,33 +26,27 @@ end
function MinigameButtonMashWindow.update()
local mg = Context.minigame_button_mash
-- Check for Z button press
if Input.select() then
mg.bar_fill = mg.bar_fill + mg.fill_per_press
mg.button_pressed_timer = mg.button_press_duration
-- Clamp to max
if mg.bar_fill > mg.max_fill then
mg.bar_fill = mg.max_fill
end
end
-- Check if bar is full (completed)
if mg.bar_fill >= mg.max_fill then
Context.active_window = mg.return_window
return
end
-- Automatic degradation (increases with bar fill level)
local degradation = mg.base_degradation + (mg.bar_fill * mg.degradation_multiplier)
mg.bar_fill = mg.bar_fill - degradation
-- Clamp to minimum
if mg.bar_fill < 0 then
mg.bar_fill = 0
end
-- Update button press timer
if mg.button_pressed_timer > 0 then
mg.button_pressed_timer = mg.button_pressed_timer - 1
@@ -61,20 +55,16 @@ end
function MinigameButtonMashWindow.draw()
local mg = Context.minigame_button_mash
-- Draw the underlying window first (for overlay effect)
if mg.return_window == WINDOW_GAME then
GameWindow.draw()
end
-- Draw semi-transparent overlay background
-- Draw darker rectangles to create overlay effect
rect(0, 0, Config.screen.width, Config.screen.height, Config.colors.black)
-- Draw progress bar background
rect(mg.bar_x - 2, mg.bar_y - 2, mg.bar_width + 4, mg.bar_height + 4, Config.colors.light_grey)
rectb(mg.bar_x - 2, mg.bar_y - 2, mg.bar_width + 4, mg.bar_height + 4, Config.colors.dark_grey)
-- Draw progress bar fill
local fill_width = (mg.bar_fill / mg.max_fill) * mg.bar_width
if fill_width > 0 then
@@ -85,29 +75,22 @@ function MinigameButtonMashWindow.draw()
elseif mg.bar_fill > 33 then
bar_color = Config.colors.bar -- medium color
end
rect(mg.bar_x, mg.bar_y, fill_width, mg.bar_height, bar_color)
rect(mg.bar_x, mg.bar_y, fill_width, bar_color)
end
-- Draw button indicator
local button_color = Config.colors.light_grey
if mg.button_pressed_timer > 0 then
button_color = Config.colors.green -- Highlight when pressed
end
-- Draw button as circle (approximated with rect for TIC-80)
circb(mg.button_x, mg.button_y, mg.button_size, button_color)
if mg.button_pressed_timer > 0 then
circ(mg.button_x, mg.button_y, mg.button_size - 2, button_color)
end
-- Draw Z text in the button
Print.text_center(" Z", mg.button_x - 2, mg.button_y - 3, Config.colors.light_grey)
-- Draw instruction text
Print.text_center("MASH Z!", Config.screen.width / 2, mg.bar_y + mg.bar_height + 10, Config.colors.light_grey)
-- Draw progress percentage
local percentage = math.floor((mg.bar_fill / mg.max_fill) * 100)
Print.text_center(percentage .. "%", mg.bar_x + mg.bar_width / 2, mg.bar_y + 2, Config.colors.black)
end
end

View File

@@ -13,18 +13,15 @@ function MinigameRhythmWindow.init()
button_pressed_timer = 0,
button_press_duration = 10,
return_window = WINDOW_GAME,
-- Visual layout (match button mash minigame dimensions)
bar_x = 20,
bar_y = 10,
bar_width = 200,
bar_height = 12,
-- Button indicator
button_x = 210,
button_y = 110,
button_size = 10,
-- Cooldown to prevent multiple presses in one frame
press_cooldown = 0,
press_cooldown_duration = 15
@@ -39,10 +36,8 @@ end
function MinigameRhythmWindow.update()
local mg = Context.minigame_rhythm
-- Move the line across the bar (bidirectional)
mg.line_position = mg.line_position + (mg.line_speed * mg.line_direction)
-- Reverse direction when reaching either end
if mg.line_position > 1 then
mg.line_position = 1
@@ -51,21 +46,17 @@ function MinigameRhythmWindow.update()
mg.line_position = 0
mg.line_direction = 1
end
-- Decrease cooldown timer
if mg.press_cooldown > 0 then
mg.press_cooldown = mg.press_cooldown - 1
end
-- Check for Z button press (only if cooldown expired)
if Input.select() and mg.press_cooldown == 0 then
mg.button_pressed_timer = mg.button_press_duration
mg.press_cooldown = mg.press_cooldown_duration
-- Calculate if line is within target area
local target_left = mg.target_center - (mg.target_width / 2)
local target_right = mg.target_center + (mg.target_width / 2)
if mg.line_position >= target_left and mg.line_position <= target_right then
-- HIT! Award point
mg.score = mg.score + 1
@@ -76,7 +67,6 @@ function MinigameRhythmWindow.update()
mg.score = 0
end
end
-- Calculate target width dynamically based on score
-- Each point shrinks by 10%, so reverse the formula
mg.target_width = mg.initial_target_width * (mg.target_shrink_rate ^ mg.score)
@@ -84,13 +74,11 @@ function MinigameRhythmWindow.update()
mg.target_width = mg.min_target_width
end
end
-- Check win condition
if mg.score >= mg.max_score then
Context.active_window = mg.return_window
return
end
-- Update button press timer
if mg.button_pressed_timer > 0 then
mg.button_pressed_timer = mg.button_pressed_timer - 1
@@ -99,56 +87,46 @@ end
function MinigameRhythmWindow.draw()
local mg = Context.minigame_rhythm
-- Draw the underlying window first (for overlay effect)
if mg.return_window == WINDOW_GAME then
GameWindow.draw()
end
-- Draw semi-transparent overlay background
rect(0, 0, Config.screen.width, Config.screen.height, Config.colors.black)
-- Calculate actual pixel positions
local bar_center_x = mg.bar_x + mg.bar_width / 2
-- Draw bar container background
rect(mg.bar_x - 2, mg.bar_y - 2, mg.bar_width + 4, mg.bar_height + 4, Config.colors.light_grey)
rectb(mg.bar_x - 2, mg.bar_y - 2, mg.bar_width + 4, mg.bar_height + 4, Config.colors.dark_grey)
-- Draw bar background (empty area)
rect(mg.bar_x, mg.bar_y, mg.bar_width, mg.bar_height, Config.colors.dark_grey)
-- Draw target area (highlighted section in middle)
local target_left = mg.target_center - (mg.target_width / 2)
local target_right = mg.target_center + (mg.target_width / 2)
local target_x = mg.bar_x + (target_left * mg.bar_width)
local target_width_pixels = mg.target_width * mg.bar_width
rect(target_x, mg.bar_y, target_width_pixels, mg.bar_height, Config.colors.green)
-- Draw the moving line
local line_x = mg.bar_x + (mg.line_position * mg.bar_width)
rect(line_x - 1, mg.bar_y, 2, mg.bar_height, Config.colors.item) -- Yellow line
-- Draw score text
local score_text = "SCORE: " .. mg.score .. " / " .. mg.max_score
Print.text_center(score_text, Config.screen.width / 2, mg.bar_y + mg.bar_height + 8, Config.colors.light_grey)
-- Draw instruction text
Print.text_center("Press Z when line is in green!", Config.screen.width / 2, mg.bar_y + mg.bar_height + 20, Config.colors.light_grey)
Print.text_center(
"Press Z when line is in green!",
Config.screen.width / 2,
mg.bar_y + mg.bar_height + 20,
Config.colors.light_grey
)
-- Draw button indicator in bottom-right corner
local button_color = Config.colors.light_grey
if mg.button_pressed_timer > 0 then
button_color = Config.colors.green -- Highlight when pressed
end
-- Draw button circle
circb(mg.button_x, mg.button_y, mg.button_size, button_color)
if mg.button_pressed_timer > 0 then
circ(mg.button_x, mg.button_y, mg.button_size - 2, button_color)
end
-- Draw Z text in the button
Print.text_center("Z", mg.button_x - 2, mg.button_y - 3, button_color)
end
end