mirror of
https://github.com/Yonokid/PyTaiko.git
synced 2026-02-04 11:40:13 +01:00
fix all errors
This commit is contained in:
@@ -209,7 +209,7 @@ class BackBox(BaseBox):
|
|||||||
self.yellow_box.draw(self, fade_override, is_ura, self.name)
|
self.yellow_box.draw(self, fade_override, is_ura, self.name)
|
||||||
|
|
||||||
class SongBox(BaseBox):
|
class SongBox(BaseBox):
|
||||||
def __init__(self, name: str, back_color: Optional[tuple[int, int, int]], fore_color: Optional[tuple[int, int, int]], texture_index: TextureIndex, tja: TJAParser):
|
def __init__(self, name: str, back_color: Optional[tuple[int, int, int]], fore_color: Optional[tuple[int, int, int]], texture_index: TextureIndex, tja: TJAParser | OsuParser):
|
||||||
super().__init__(name, back_color, fore_color, texture_index)
|
super().__init__(name, back_color, fore_color, texture_index)
|
||||||
self.scores = dict()
|
self.scores = dict()
|
||||||
self.hash = dict()
|
self.hash = dict()
|
||||||
@@ -298,45 +298,7 @@ class SongBox(BaseBox):
|
|||||||
if self.score_history is not None and get_current_ms() >= self.history_wait + 3000:
|
if self.score_history is not None and get_current_ms() >= self.history_wait + 3000:
|
||||||
self.score_history.draw()
|
self.score_history.draw()
|
||||||
|
|
||||||
class SongBoxOsu(BaseBox):
|
class SongBoxOsu(SongBox):
|
||||||
def __init__(self, name: str, back_color: Optional[tuple[int, int, int]], fore_color: Optional[tuple[int, int, int]], texture_index: TextureIndex, parser: OsuParser):
|
|
||||||
super().__init__(name, back_color, fore_color, texture_index)
|
|
||||||
self.scores = dict()
|
|
||||||
self.hash = dict()
|
|
||||||
self.score_history = None
|
|
||||||
self.history_wait = 0
|
|
||||||
self.parser = parser
|
|
||||||
self.is_favorite = False
|
|
||||||
self.yellow_box = None
|
|
||||||
|
|
||||||
def load_text(self):
|
|
||||||
super().load_text()
|
|
||||||
self.text_loaded = True
|
|
||||||
|
|
||||||
def get_scores(self):
|
|
||||||
with sqlite3.connect(global_data.score_db) as con:
|
|
||||||
cursor = con.cursor()
|
|
||||||
# Batch database query for all diffs at once
|
|
||||||
if self.parser.metadata.course_data:
|
|
||||||
hash_values = [self.hash[diff] for diff in self.parser.metadata.course_data if diff in self.hash]
|
|
||||||
placeholders = ','.join('?' * len(hash_values))
|
|
||||||
|
|
||||||
batch_query = f"""
|
|
||||||
SELECT hash, score, good, ok, bad, drumroll, clear
|
|
||||||
FROM Scores
|
|
||||||
WHERE hash IN ({placeholders})
|
|
||||||
"""
|
|
||||||
cursor.execute(batch_query, hash_values)
|
|
||||||
|
|
||||||
hash_to_score = {row[0]: row[1:] for row in cursor.fetchall()}
|
|
||||||
|
|
||||||
for diff in self.parser.metadata.course_data:
|
|
||||||
if diff not in self.hash:
|
|
||||||
continue
|
|
||||||
diff_hash = self.hash[diff]
|
|
||||||
self.scores[diff] = hash_to_score.get(diff_hash)
|
|
||||||
self.score_history = None
|
|
||||||
|
|
||||||
def update(self, current_time: float, is_diff_select: bool):
|
def update(self, current_time: float, is_diff_select: bool):
|
||||||
super().update(current_time, is_diff_select)
|
super().update(current_time, is_diff_select)
|
||||||
is_open_prev = self.is_open
|
is_open_prev = self.is_open
|
||||||
@@ -376,11 +338,6 @@ class SongBoxOsu(BaseBox):
|
|||||||
elif score and score[5] >= Crown.CLEAR:
|
elif score and score[5] >= Crown.CLEAR:
|
||||||
tex.draw_texture('yellow_box', 'crown_clear', x=x, y=y, frame=min(Difficulty.URA, highest_key), fade=outer_fade_override)
|
tex.draw_texture('yellow_box', 'crown_clear', x=x, y=y, frame=min(Difficulty.URA, highest_key), fade=outer_fade_override)
|
||||||
|
|
||||||
def draw_score_history(self):
|
|
||||||
if self.is_open and get_current_ms() >= self.wait + 83.33:
|
|
||||||
if self.score_history is not None and get_current_ms() >= self.history_wait + 3000:
|
|
||||||
self.score_history.draw()
|
|
||||||
|
|
||||||
class FolderBox(BaseBox):
|
class FolderBox(BaseBox):
|
||||||
def __init__(self, name: str, back_color: Optional[tuple[int, int, int]], fore_color: Optional[tuple[int, int, int]], texture_index: TextureIndex, genre_index: GenreIndex, tja_count: int = 0, box_texture: Optional[str] = None):
|
def __init__(self, name: str, back_color: Optional[tuple[int, int, int]], fore_color: Optional[tuple[int, int, int]], texture_index: TextureIndex, genre_index: GenreIndex, tja_count: int = 0, box_texture: Optional[str] = None):
|
||||||
super().__init__(name, back_color, fore_color, texture_index)
|
super().__init__(name, back_color, fore_color, texture_index)
|
||||||
@@ -493,7 +450,7 @@ class FolderBox(BaseBox):
|
|||||||
|
|
||||||
class YellowBox:
|
class YellowBox:
|
||||||
"""A song box when it is opened."""
|
"""A song box when it is opened."""
|
||||||
def __init__(self, is_back: bool, tja: Optional[TJAParser] = None, is_dan: bool = False):
|
def __init__(self, is_back: bool, tja: Optional[TJAParser | OsuParser] = None, is_dan: bool = False):
|
||||||
self.is_diff_select = False
|
self.is_diff_select = False
|
||||||
self.is_back = is_back
|
self.is_back = is_back
|
||||||
self.tja = tja
|
self.tja = tja
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import hashlib
|
|||||||
import math
|
import math
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from libs.parsers.tja import CourseData, Note, NoteType, Drumroll, Balloon, NoteList, TJAMetadata
|
from libs.parsers.tja import CourseData, Note, NoteType, Drumroll, Balloon, NoteList, TJAEXData, TJAMetadata
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@@ -11,33 +11,32 @@ class OsuParser:
|
|||||||
editor: dict[str, str]
|
editor: dict[str, str]
|
||||||
osu_metadata: dict[str, str]
|
osu_metadata: dict[str, str]
|
||||||
difficulty: dict[str, str]
|
difficulty: dict[str, str]
|
||||||
events: list[int]
|
events: list[list[float]]
|
||||||
timing_points: list[int]
|
timing_points: list[list[float]]
|
||||||
hit_objects: list[int]
|
hit_objects: list[list[float]]
|
||||||
|
|
||||||
bpm: list[int]
|
bpm: list[float]
|
||||||
|
|
||||||
def __init__(self, osu_file: Path):
|
def __init__(self, osu_file: Path):
|
||||||
self.general = self.read_osu_data(osu_file, target_header="General", is_dict=True)
|
self.general = self.read_osu_data_dict(osu_file, target_header="General")
|
||||||
self.editor = self.read_osu_data(osu_file, target_header="Editor", is_dict=True)
|
self.editor = self.read_osu_data_dict(osu_file, target_header="Editor")
|
||||||
self.osu_metadata = self.read_osu_data(osu_file, target_header="Metadata", is_dict=True)
|
self.osu_metadata = self.read_osu_data_dict(osu_file, target_header="Metadata")
|
||||||
self.difficulty = self.read_osu_data(osu_file, target_header="Difficulty", is_dict=True)
|
self.difficulty = self.read_osu_data_dict(osu_file, target_header="Difficulty")
|
||||||
self.events = self.read_osu_data(osu_file, target_header="Events")
|
self.events = self.read_osu_data_list(osu_file, target_header="Events")
|
||||||
self.timing_points = self.read_osu_data(osu_file, target_header="TimingPoints")
|
self.timing_points = self.read_osu_data_list(osu_file, target_header="TimingPoints")
|
||||||
#self.general = self.read_osu_data(osu_file, target_header="Colours", is_dict=True)
|
#self.general = self.read_osu_data(osu_file, target_header="Colours", is_dict=True)
|
||||||
self.hit_objects = self.read_osu_data(osu_file, target_header="HitObjects")
|
self.hit_objects = self.read_osu_data_list(osu_file, target_header="HitObjects")
|
||||||
self.bpm = []
|
self.bpm = []
|
||||||
self.metadata = TJAMetadata()
|
self.metadata = TJAMetadata()
|
||||||
self.metadata.wave = osu_file.parent / self.general["AudioFilename"]
|
self.metadata.wave = osu_file.parent / self.general["AudioFilename"]
|
||||||
self.metadata.course_data[0] = CourseData()
|
self.metadata.course_data[0] = CourseData()
|
||||||
|
self.ex_data = TJAEXData()
|
||||||
for points in self.timing_points:
|
for points in self.timing_points:
|
||||||
self.bpm.append(math.floor(1 / points[1] * 1000 * 60))
|
self.bpm.append(math.floor(1 / points[1] * 1000 * 60))
|
||||||
self.osu_NoteList = self.note_data_to_NoteList(self.hit_objects)
|
self.osu_NoteList = self.note_data_to_NoteList(self.hit_objects)
|
||||||
|
|
||||||
def read_osu_data(self, file_path: Path, target_header="HitObjects", is_dict = False):
|
def read_osu_data_list(self, file_path: Path, target_header="HitObjects") -> list[list[float]]:
|
||||||
data = []
|
data = []
|
||||||
if is_dict:
|
|
||||||
data = {}
|
|
||||||
current_header = None
|
current_header = None
|
||||||
|
|
||||||
with file_path.open(mode='r', encoding='utf-8') as f:
|
with file_path.open(mode='r', encoding='utf-8') as f:
|
||||||
@@ -55,6 +54,24 @@ class OsuParser:
|
|||||||
int_array = [float(num_str) for num_str in string_array]
|
int_array = [float(num_str) for num_str in string_array]
|
||||||
data.append(int_array)
|
data.append(int_array)
|
||||||
|
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
def read_osu_data_dict(self, file_path: Path, target_header="HitObjects") -> dict[str, str]:
|
||||||
|
data = dict()
|
||||||
|
current_header = None
|
||||||
|
|
||||||
|
with file_path.open(mode='r', encoding='utf-8') as f:
|
||||||
|
|
||||||
|
for line in f:
|
||||||
|
line = line.rstrip("\n")
|
||||||
|
|
||||||
|
if re.match(r"\[\w*\]", line): # header pattern
|
||||||
|
current_header = line[1:-1]
|
||||||
|
|
||||||
|
if current_header == target_header:
|
||||||
if re.match(r'(\w*)\:\s?(\w*.?\w*)', line): # General, Editor, Metadata, Difficulty
|
if re.match(r'(\w*)\:\s?(\w*.?\w*)', line): # General, Editor, Metadata, Difficulty
|
||||||
match = re.search(r'(\w*)\:\s?(\w*.?\w*)', line)
|
match = re.search(r'(\w*)\:\s?(\w*.?\w*)', line)
|
||||||
if match:
|
if match:
|
||||||
@@ -216,11 +233,13 @@ class OsuParser:
|
|||||||
counter = counter + 1
|
counter = counter + 1
|
||||||
balloon.moji = 0
|
balloon.moji = 0
|
||||||
|
|
||||||
|
'''
|
||||||
od = int(self.difficulty["OverallDifficulty"])
|
od = int(self.difficulty["OverallDifficulty"])
|
||||||
# thank you https://github.com/IepIweidieng/osu2tja/blob/dev-iid/osu2tja/osu2tja.py
|
# thank you https://github.com/IepIweidieng/osu2tja/blob/dev-iid/osu2tja/osu2tja.py
|
||||||
hit_multiplyer = (5 - 2 * (5 - od) / 5 if od < 5
|
hit_multiplyer = (5 - 2 * (5 - od) / 5 if od < 5
|
||||||
else 5 + 2.5 * (od - 5) / 5 if od > 5
|
else 5 + 2.5 * (od - 5) / 5 if od > 5
|
||||||
else 5) * 1.65
|
else 5) * 1.65
|
||||||
|
'''
|
||||||
balloon.count = 20#int(max(1, (ret[-1][1] - ret[-2][1]) / 1000 * hit_multiplier))
|
balloon.count = 20#int(max(1, (ret[-1][1] - ret[-2][1]) / 1000 * hit_multiplier))
|
||||||
# end of 'stolen' code
|
# end of 'stolen' code
|
||||||
source.index = counter
|
source.index = counter
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ class SongSelectScreen(Screen):
|
|||||||
self.navigator.mark_crowns_dirty_for_song(selected_song)
|
self.navigator.mark_crowns_dirty_for_song(selected_song)
|
||||||
|
|
||||||
curr_item = self.navigator.get_current_item()
|
curr_item = self.navigator.get_current_item()
|
||||||
if isinstance(curr_item, SongFile) or isinstance(curr_item, SongFileOsu):
|
if not isinstance(curr_item, Directory):
|
||||||
curr_item.box.get_scores()
|
curr_item.box.get_scores()
|
||||||
self.navigator.add_recent()
|
self.navigator.add_recent()
|
||||||
|
|
||||||
@@ -446,7 +446,7 @@ class SongSelectScreen(Screen):
|
|||||||
|
|
||||||
if self.state == State.BROWSING and self.navigator.items != []:
|
if self.state == State.BROWSING and self.navigator.items != []:
|
||||||
curr_item = self.navigator.get_current_item()
|
curr_item = self.navigator.get_current_item()
|
||||||
if isinstance(curr_item, SongFile) or isinstance(curr_item, SongFileOsu):
|
if not isinstance(curr_item, Directory):
|
||||||
curr_item.box.draw_score_history()
|
curr_item.box.draw_score_history()
|
||||||
|
|
||||||
self.draw_overlay()
|
self.draw_overlay()
|
||||||
|
|||||||
Reference in New Issue
Block a user