feat: fix delay, most likely

This commit is contained in:
mc08
2025-11-28 15:03:56 -08:00
parent a09f3df35e
commit 8c09f1418f
2 changed files with 49 additions and 31 deletions

View File

@@ -684,7 +684,30 @@ class TJAParser:
section_bar = None
lyric = ""
scroll_type = ScrollType.NMSCROLL
# Only used during BMSCROLL or HBSCROLL
bpmchange_last_bpm = bpm
delay_current = 0
def add_delay_bar(hit_ms: float, delay: float):
delay_bar = Note()
delay_bar.pixels_per_frame_x = get_pixels_per_frame(bpm * time_signature * x_scroll_modifier, time_signature*4, self.distance)
delay_bar.pixels_per_frame_y = get_pixels_per_frame(bpm * time_signature * y_scroll_modifier, time_signature*4, self.distance)
pixels_per_ms = get_pixels_per_ms(delay_bar.pixels_per_frame_x)
delay_bar.hit_ms = hit_ms
if pixels_per_ms == 0:
delay_bar.load_ms = delay_bar.hit_ms
else:
delay_bar.load_ms = delay_bar.hit_ms - (self.distance / pixels_per_ms)
delay_bar.type = 0
delay_bar.display = False
delay_bar.gogo_time = gogo_time
delay_bar.bpm = bpm
delay_bar.delay = delay
bisect.insort(curr_bar_list, delay_bar, key=lambda x: x.load_ms)
for bar in notes:
#Length of the bar is determined by number of notes excluding commands
bar_length = sum(len(part) for part in bar if '#' not in part)
@@ -925,29 +948,14 @@ class TJAParser:
elif part.startswith("#DELAY"):
delay_ms = float(part[6:]) * 1000
if scroll_type == ScrollType.BMSCROLL or scroll_type == ScrollType.HBSCROLL:
if delay_ms < 0:
# No changes if negative
if delay_ms <= 0:
# No changes if not positive
pass
else:
# Do not modify current_ms, it will be modified live
delay_bar = Note()
delay_bar.pixels_per_frame_x = get_pixels_per_frame(bpm * time_signature * x_scroll_modifier, time_signature*4, self.distance)
delay_bar.pixels_per_frame_y = get_pixels_per_frame(bpm * time_signature * y_scroll_modifier, time_signature*4, self.distance)
pixels_per_ms = get_pixels_per_ms(delay_bar.pixels_per_frame_x)
delay_current += delay_ms
delay_bar.hit_ms = self.current_ms
if pixels_per_ms == 0:
delay_bar.load_ms = delay_bar.hit_ms
else:
delay_bar.load_ms = delay_bar.hit_ms - (self.distance / pixels_per_ms)
delay_bar.type = 0
delay_bar.display = False
delay_bar.gogo_time = gogo_time
delay_bar.bpm = bpm
delay_bar.delay = delay_ms
bisect.insort(curr_bar_list, delay_bar, key=lambda x: x.load_ms)
# Delays will be combined between notes, and attached to previous note
else:
self.current_ms += delay_ms
continue
@@ -1022,6 +1030,12 @@ class TJAParser:
if item == '9' and curr_note_list and curr_note_list[-1].type == 9:
self.current_ms += increment
continue
if delay_current != 0:
logger.debug(delay_current)
add_delay_bar(self.current_ms, delay_current)
delay_current = 0
note = Note()
note.hit_ms = self.current_ms
note.display = True

View File

@@ -481,16 +481,16 @@ class Player:
def get_position_x(self, width: int, current_ms: float, load_ms: float, pixels_per_frame: float) -> int:
"""Calculates the x-coordinate of a note based on its load time and current time"""
# Override if delay active
if self.delay_end:
current_ms = self.delay_end
if self.delay_start:
current_ms = self.delay_start
time_diff = load_ms - current_ms
return int(width + pixels_per_frame * 0.06 * time_diff - (tex.textures["notes"]["1"].width//2)) - self.visual_offset
def get_position_y(self, current_ms: float, load_ms: float, pixels_per_frame: float, pixels_per_frame_x) -> int:
"""Calculates the y-coordinate of a note based on its load time and current time"""
# Override if delay active
if self.delay_end:
current_ms = self.delay_end
if self.delay_start:
current_ms = self.delay_start
time_diff = load_ms - current_ms
return int((pixels_per_frame * 0.06 * time_diff) + ((self.tja.distance * pixels_per_frame) / pixels_per_frame_x))
@@ -1001,17 +1001,21 @@ class Player:
note.pixels_per_frame_y *= bpmchange.bpmchange
self.bpm *= bpmchange.bpmchange
self.bpmchanges.popleft()
if len(self.delays) != 0:
if self.delay_start is not None and self.delay_end is not None:
# Currently, a delay is active: notes should be frozen at ms = delay_start
# Check if it ended
if ms_from_start >= self.delay_end:
delay = self.delay_end - self.delay_start
for note in chain(self.play_notes, self.current_bars, self.draw_bar_list):
note.load_ms += delay
self.delay_start = None
self.delay_end = None
# else:
if len(self.delays) != 0:
delay = self.delays[0]
delay_success = delay.is_ready(ms_from_start)
if delay_success:
if self.delay_start is not None and self.delay_end is not None:
logger.error('Needs fix: delay is currently active, but another delay is being activated')
# Turn on delay visual
self.delay_start = delay.hit_ms
self.delay_end = delay.hit_ms + delay.delay
@@ -1020,7 +1024,7 @@ class Player:
# time_diff must be the same throughout the delay
# time_diff = note.load_ms - delay.hit_ms
note.hit_ms += delay.delay
note.load_ms += delay.delay
# note.load_ms += delay.delay
self.delays.popleft()
if self.lane_hit_effect is not None:
self.lane_hit_effect.update(current_time)