Compare commits

..

4 Commits

Author SHA1 Message Date
fd6838f798 test commit
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2026-05-07 22:37:24 +02:00
e0680f06cd set new update server in yaml 2026-05-07 22:17:38 +02:00
b752457aec set new update server
All checks were successful
ci/woodpecker/manual/woodpecker Pipeline was successful
2026-05-07 22:10:53 +02:00
6055b74ccf timedeltafix 2026-05-07 21:48:33 +02:00
14 changed files with 35 additions and 30 deletions

View File

@@ -2,6 +2,7 @@
## Installation
This game is designed for the TIC-80 fantasy computer. To play, follow these steps:
1. **Download and Install TIC-80:** If you don't already have it, download the TIC-80 fantasy computer from its official website: [https://tic80.com/](https://tic80.com/)

View File

@@ -135,7 +135,7 @@ end
--- @within Ascension
function Ascension.draw_flash()
if not _flash_active then return end
_flash_timer = _flash_timer + 1
_flash_timer = _flash_timer + Context.dt60
local sw = Config.screen.width
local sh = Config.screen.height
@@ -160,7 +160,7 @@ end
--- @within Ascension
function Ascension.update_fade()
if not _fade_active then return end
_fade_timer = _fade_timer + 1
_fade_timer = _fade_timer + Context.dt60
if _fade_timer >= FADE_DURATION then
_fade_active = false
end

View File

@@ -105,14 +105,14 @@ function Focus.update()
if driven then return end
if closing then
radius = radius - speed
radius = radius - speed * Context.dt60
if radius <= 0 then
local cb = on_complete
Focus.stop()
if cb then cb() end
end
else
radius = radius + speed
radius = radius + speed * Context.dt60
if radius >= max_radius(center_x, center_y) then
local cb = on_complete
Focus.stop()

View File

@@ -23,7 +23,7 @@ function Glitch.draw()
if not Context or not Context.glitch or not Context.glitch.enabled then return end
-- Update state timer
Context.glitch.timer = Context.glitch.timer - 1
Context.glitch.timer = Context.glitch.timer - Context.dt60
if Context.glitch.timer <= 0 then
if Context.glitch.state == "active" then
Context.glitch.state = "waiting"

View File

@@ -96,7 +96,7 @@ function Meter.update()
local in_minigame = string.find(Window.get_current_id(), "^minigame_") ~= nil
if not in_minigame then
if m.combo > 0 then
m.combo_timer = m.combo_timer + 1
m.combo_timer = m.combo_timer + Context.dt60
if m.combo_timer >= COMBO_TIMEOUT_FRAMES then
m.combo = 0
m.combo_timer = 0

View File

@@ -28,7 +28,7 @@ function Timer.update()
local in_minigame = string.find(Window.get_current_id(), "^minigame_") ~= nil
if not in_minigame then
t.progress = t.progress + (1 / timer_duration)
t.progress = t.progress + (Context.delta_time / (timer_duration / 60))
if t.progress >= 1 then
t.progress = t.progress - 1
end

View File

@@ -110,7 +110,7 @@ function Trigger.update()
for id, state in pairs(Context.triggers) do
local trigger = triggers[id]
if trigger then
state.elapsed = state.elapsed + 1
state.elapsed = state.elapsed + Context.dt60
if state.elapsed >= trigger.duration then
table.insert(fired, id)
end

View File

@@ -177,7 +177,7 @@ end
local state = STATE_TEXT
local text_y = Config.screen.height
local text_speed = 12 -- pixels per second
local text_speed = 25 -- pixels per second
local day_timer = 0
local day_display_seconds = 2
local text_done = false

View File

@@ -26,6 +26,7 @@ function TIC()
Context.delta_time = (now - Context.last_frame_time) / 1000
end
Context.last_frame_time = now
Context.dt60 = Context.delta_time * 60
cls(Config.colors.black)
local handler = Window.get_current_handler() -- Get handler from Window manager

View File

@@ -7,8 +7,8 @@ local TEXTBOX_Y = math.floor((Config.screen.height - TEXTBOX_H) / 2 - 8)
local TEXTBOX_MAX_CHARS = 30
local DISCUSSION_LINE_HEIGHT = 8
local PADDING = 4
local AUTO_SCROLL_DELAY = 12
local AUTO_SCROLL_STEP = 1
local AUTO_SCROLL_DELAY = 8
local AUTO_SCROLL_STEP = 2
--- Draws the discussion window.
--- @within DiscussionWindow
@@ -61,7 +61,7 @@ function DiscussionWindow.update()
if max_scroll > 0 then
if Context.discussion.auto_scroll then
Context.discussion.scroll_timer = Context.discussion.scroll_timer + 1
Context.discussion.scroll_timer = Context.discussion.scroll_timer + Context.dt60
if Context.discussion.scroll_timer >= AUTO_SCROLL_DELAY then
Context.discussion.scroll_timer = 0
Context.discussion.scroll_y = Context.discussion.scroll_y + AUTO_SCROLL_STEP

View File

@@ -1,6 +1,6 @@
--- @section BriefIntroWindow
BriefIntroWindow.y = Config.screen.height
BriefIntroWindow.speed = 30 -- pixels per second
BriefIntroWindow.speed = 45 -- pixels per second
BriefIntroWindow.text = [[
Norman Reds everyday life
seems ordinary: work,

View File

@@ -339,8 +339,9 @@ function MinigameDDRWindow.update()
local mg = Context.minigame_ddr
if mg.win_timer > 0 then
mg.win_timer = mg.win_timer - 1
if mg.win_timer == 0 then
mg.win_timer = mg.win_timer - Context.dt60
if mg.win_timer <= 0 then
mg.win_timer = 0
Audio.music_stop()
Meter.apply_ddr_reward(mg.total_misses)
if not Context.game_in_progress then return end
@@ -359,7 +360,7 @@ function MinigameDDRWindow.update()
return
end
mg.frame_counter = mg.frame_counter + 1
mg.frame_counter = mg.frame_counter + Context.dt60
if mg.use_pattern and mg.current_song and mg.current_song.end_frame then
if mg.frame_counter > mg.current_song.end_frame and #mg.arrows == 0 then
@@ -381,7 +382,7 @@ function MinigameDDRWindow.update()
end
end
else
mg.arrow_spawn_timer = mg.arrow_spawn_timer + 1
mg.arrow_spawn_timer = mg.arrow_spawn_timer + Context.dt60
if mg.arrow_spawn_timer >= mg.arrow_spawn_interval then
spawn_arrow()
mg.arrow_spawn_timer = 0
@@ -391,7 +392,7 @@ function MinigameDDRWindow.update()
-- move arrow downwards
local arrows_to_remove = {}
for i, arrow in ipairs(mg.arrows) do
arrow.y = arrow.y + mg.arrow_fall_speed
arrow.y = arrow.y + mg.arrow_fall_speed * Context.dt60
if check_miss(arrow) then
table.insert(arrows_to_remove, i)
mg.bar_fill = math.max(0, mg.bar_fill - mg.miss_penalty)
@@ -406,13 +407,13 @@ function MinigameDDRWindow.update()
for dir, _ in pairs(mg.input_cooldowns) do
if mg.input_cooldowns[dir] > 0 then
mg.input_cooldowns[dir] = mg.input_cooldowns[dir] - 1
mg.input_cooldowns[dir] = mg.input_cooldowns[dir] - Context.dt60
end
end
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
mg.button_pressed_timers[dir] = mg.button_pressed_timers[dir] - Context.dt60
end
end

View File

@@ -103,8 +103,9 @@ function MinigameButtonMashWindow.update()
local mg = Context.minigame_button_mash
if mg.win_timer > 0 then
mg.win_timer = mg.win_timer - 1
if mg.win_timer == 0 then
mg.win_timer = mg.win_timer - Context.dt60
if mg.win_timer <= 0 then
mg.win_timer = 0
if mg.meter_on_complete then
mg.meter_on_complete(mg.elapsed_sec or 0)
else
@@ -142,13 +143,13 @@ function MinigameButtonMashWindow.update()
mg.win_timer = Config.timing.minigame_win_duration
return
end
local degradation = mg.base_degradation + (mg.bar_fill * mg.degradation_multiplier)
local degradation = (mg.base_degradation + (mg.bar_fill * mg.degradation_multiplier)) * Context.dt60
mg.bar_fill = mg.bar_fill - degradation
if mg.bar_fill < 0 then
mg.bar_fill = 0
end
if mg.button_pressed_timer > 0 then
mg.button_pressed_timer = mg.button_pressed_timer - 1
mg.button_pressed_timer = mg.button_pressed_timer - Context.dt60
end
if mg.focus_center_x then
Focus.set_percentage(mg.bar_fill / mg.target_points)

View File

@@ -71,8 +71,9 @@ function MinigameRhythmWindow.update()
local mg = Context.minigame_rhythm
if mg.win_timer > 0 then
mg.win_timer = mg.win_timer - 1
if mg.win_timer == 0 then
mg.win_timer = mg.win_timer - Context.dt60
if mg.win_timer <= 0 then
mg.win_timer = 0
Meter.on_minigame_complete(false)
if not Context.game_in_progress then return end
if mg.focus_center_x then Focus.stop() end
@@ -86,7 +87,7 @@ function MinigameRhythmWindow.update()
return
end
mg.line_position = mg.line_position + (mg.line_speed * mg.line_direction)
mg.line_position = mg.line_position + (mg.line_speed * mg.line_direction * Context.dt60)
if mg.line_position > 1 then
mg.line_position = 1
mg.line_direction = -1
@@ -95,11 +96,11 @@ function MinigameRhythmWindow.update()
mg.line_direction = 1
end
if mg.press_cooldown > 0 then
mg.press_cooldown = mg.press_cooldown - 1
mg.press_cooldown = mg.press_cooldown - Context.dt60
end
local mouse_on_button = Mouse.zone_circle({ x = mg.button_x, y = mg.button_y, r = mg.button_size })
if (Input.select() or mouse_on_button) and mg.press_cooldown == 0 then
if (Input.select() or mouse_on_button) and mg.press_cooldown <= 0 then
mg.button_pressed_timer = mg.button_press_duration
mg.press_cooldown = mg.press_cooldown_duration
local target_left = mg.target_center - (mg.target_width / 2)
@@ -123,7 +124,7 @@ function MinigameRhythmWindow.update()
return
end
if mg.button_pressed_timer > 0 then
mg.button_pressed_timer = mg.button_pressed_timer - 1
mg.button_pressed_timer = mg.button_pressed_timer - Context.dt60
end
if mg.focus_center_x then
Focus.set_percentage(1 - mg.score / mg.max_score)