diff --git a/libs/tja.py b/libs/tja.py index a9b62d6..7bfc0e5 100644 --- a/libs/tja.py +++ b/libs/tja.py @@ -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 diff --git a/scenes/game.py b/scenes/game.py index cde7683..584fdf0 100644 --- a/scenes/game.py +++ b/scenes/game.py @@ -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 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 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: - self.delay_start = None - self.delay_end = None - # else: 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)