mirror of
https://github.com/Yonokid/PyTaiko.git
synced 2026-02-04 19:50:12 +01:00
feat: fix delay, most likely
This commit is contained in:
52
libs/tja.py
52
libs/tja.py
@@ -684,7 +684,30 @@ class TJAParser:
|
|||||||
section_bar = None
|
section_bar = None
|
||||||
lyric = ""
|
lyric = ""
|
||||||
scroll_type = ScrollType.NMSCROLL
|
scroll_type = ScrollType.NMSCROLL
|
||||||
|
|
||||||
|
# Only used during BMSCROLL or HBSCROLL
|
||||||
bpmchange_last_bpm = bpm
|
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:
|
for bar in notes:
|
||||||
#Length of the bar is determined by number of notes excluding commands
|
#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)
|
bar_length = sum(len(part) for part in bar if '#' not in part)
|
||||||
@@ -925,29 +948,14 @@ class TJAParser:
|
|||||||
elif part.startswith("#DELAY"):
|
elif part.startswith("#DELAY"):
|
||||||
delay_ms = float(part[6:]) * 1000
|
delay_ms = float(part[6:]) * 1000
|
||||||
if scroll_type == ScrollType.BMSCROLL or scroll_type == ScrollType.HBSCROLL:
|
if scroll_type == ScrollType.BMSCROLL or scroll_type == ScrollType.HBSCROLL:
|
||||||
if delay_ms < 0:
|
if delay_ms <= 0:
|
||||||
# No changes if negative
|
# No changes if not positive
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
# Do not modify current_ms, it will be modified live
|
# Do not modify current_ms, it will be modified live
|
||||||
delay_bar = Note()
|
delay_current += delay_ms
|
||||||
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 = self.current_ms
|
# Delays will be combined between notes, and attached to previous note
|
||||||
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)
|
|
||||||
else:
|
else:
|
||||||
self.current_ms += delay_ms
|
self.current_ms += delay_ms
|
||||||
continue
|
continue
|
||||||
@@ -1022,6 +1030,12 @@ class TJAParser:
|
|||||||
if item == '9' and curr_note_list and curr_note_list[-1].type == 9:
|
if item == '9' and curr_note_list and curr_note_list[-1].type == 9:
|
||||||
self.current_ms += increment
|
self.current_ms += increment
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if delay_current != 0:
|
||||||
|
logger.debug(delay_current)
|
||||||
|
add_delay_bar(self.current_ms, delay_current)
|
||||||
|
delay_current = 0
|
||||||
|
|
||||||
note = Note()
|
note = Note()
|
||||||
note.hit_ms = self.current_ms
|
note.hit_ms = self.current_ms
|
||||||
note.display = True
|
note.display = True
|
||||||
|
|||||||
@@ -481,16 +481,16 @@ class Player:
|
|||||||
def get_position_x(self, width: int, current_ms: float, load_ms: float, pixels_per_frame: float) -> int:
|
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"""
|
"""Calculates the x-coordinate of a note based on its load time and current time"""
|
||||||
# Override if delay active
|
# Override if delay active
|
||||||
if self.delay_end:
|
if self.delay_start:
|
||||||
current_ms = self.delay_end
|
current_ms = self.delay_start
|
||||||
time_diff = load_ms - current_ms
|
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
|
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:
|
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"""
|
"""Calculates the y-coordinate of a note based on its load time and current time"""
|
||||||
# Override if delay active
|
# Override if delay active
|
||||||
if self.delay_end:
|
if self.delay_start:
|
||||||
current_ms = self.delay_end
|
current_ms = self.delay_start
|
||||||
time_diff = load_ms - current_ms
|
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))
|
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
|
note.pixels_per_frame_y *= bpmchange.bpmchange
|
||||||
self.bpm *= bpmchange.bpmchange
|
self.bpm *= bpmchange.bpmchange
|
||||||
self.bpmchanges.popleft()
|
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 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 = self.delays[0]
|
||||||
delay_success = delay.is_ready(ms_from_start)
|
delay_success = delay.is_ready(ms_from_start)
|
||||||
if delay_success:
|
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
|
# Turn on delay visual
|
||||||
self.delay_start = delay.hit_ms
|
self.delay_start = delay.hit_ms
|
||||||
self.delay_end = delay.hit_ms + delay.delay
|
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 must be the same throughout the delay
|
||||||
# time_diff = note.load_ms - delay.hit_ms
|
# time_diff = note.load_ms - delay.hit_ms
|
||||||
note.hit_ms += delay.delay
|
note.hit_ms += delay.delay
|
||||||
note.load_ms += delay.delay
|
# note.load_ms += delay.delay
|
||||||
self.delays.popleft()
|
self.delays.popleft()
|
||||||
if self.lane_hit_effect is not None:
|
if self.lane_hit_effect is not None:
|
||||||
self.lane_hit_effect.update(current_time)
|
self.lane_hit_effect.update(current_time)
|
||||||
|
|||||||
Reference in New Issue
Block a user