diff --git a/src/tja2fumen/__init__.py b/src/tja2fumen/__init__.py index 7945c91..83036ad 100644 --- a/src/tja2fumen/__init__.py +++ b/src/tja2fumen/__init__.py @@ -33,12 +33,17 @@ def main(argv=None): # Generate output filenames baseName = os.path.splitext(fnameTJA)[0] - outputFilenames = [baseName + f"_{COURSE_IDS[course]}.bin" if len(parsedSongsTJA) > 1 - else baseName + ".bin" - for course in parsedSongsFumen.keys()] - - # Write fumen data to files - for fumenData, outputName in zip(parsedSongsFumen.values(), outputFilenames): + outputFilenames = [] + for courseName, fumenData in parsedSongsFumen.items(): + if len(parsedSongsTJA) == 1: + outputName = f"{baseName}.bin" + else: + splitName = courseName.split("P") # e.g. 'OniP2' -> ['Oni', '2'], 'Oni' -> ['Oni'] + outputName = f"{baseName}_{COURSE_IDS[splitName[0]]}" + if len(splitName) == 2: + outputName += f"_{splitName[1]}" # Add "_1" or "_2" if P1/P2 chart + outputName += ".bin" + outputFilenames.append(outputName) writeFumen(outputName, fumenData) if return_vars: diff --git a/src/tja2fumen/parsers.py b/src/tja2fumen/parsers.py index 5873bd1..7c9013a 100644 --- a/src/tja2fumen/parsers.py +++ b/src/tja2fumen/parsers.py @@ -28,6 +28,7 @@ def parseTJA(fnameTJA): def getCourseData(lines): courses = {} currentCourse = '' + currentCourseCached = '' songBPM = 0 songOffset = 0 @@ -47,6 +48,7 @@ def getCourseData(lines): # Course-specific header fields elif nameUpper == 'COURSE': currentCourse = NORMALIZE_COURSE[value] + currentCourseCached = currentCourse if currentCourse not in courses.keys(): courses[currentCourse] = { 'metadata': {'course': currentCourse, 'bpm': songBPM, 'offset': songOffset, 'level': 0, @@ -63,12 +65,10 @@ def getCourseData(lines): if value: balloons = [int(v) for v in value.split(",") if v] courses[currentCourse]['metadata']['balloon'] = balloons - # STYLE is a P1/P2 command, which we don't support yet, so normally this would be a - # NotImplemetedError. However, TakoTako outputs `STYLE:SINGLE` when converting Ura - # charts, so throwing an error here would prevent Ura charts from being converted. - # See: https://github.com/vivaria/tja2fumen/issues/15#issuecomment-1575341088 elif nameUpper == 'STYLE': - pass + # Reset the course name to remove "P1/P2" that may have been added by a previous STYLE:DOUBLE chart + if value == 'Single': + currentCourse = currentCourseCached else: pass # Ignore other header fields such as 'TITLE', 'SUBTITLE', 'WAVE', etc. @@ -79,10 +79,24 @@ def getCourseData(lines): if match_command: nameUpper = match_command.group(1).upper() value = match_command.group(2).strip() if match_command.group(2) else '' + # For STYLE:Double, #START P1/P2 indicates the start of a new chart + # But, we want multiplayer charts to inherit the metadata from the course as a whole, so we deepcopy + if nameUpper == "START" and value in ["P1", "P2"]: + currentCourse = currentCourseCached + value + courses[currentCourse] = deepcopy(courses[currentCourseCached]) + courses[currentCourse]['data'] = list() # Keep the metadata, but reset the note data + value = '' # Once we've made the new course, we can reset this to a normal #START command elif match_notes: nameUpper = 'NOTES' value = match_notes.group(1) courses[currentCourse]['data'].append({"name": nameUpper, "value": value}) + + # If a course has no song data, then this is likely because the course has "STYLE: Double" but no "STYLE: Single". + # To fix this, we copy over the P1 chart from "STYLE: Double" to fill the "STYLE: Single" role. + for courseName, course in courses.items(): + if not course['data']: + if courseName+"P1" in courses.keys(): + courses[courseName] = deepcopy(courses[courseName+"P1"]) return courses diff --git a/testing/data/senpac.tja b/testing/data/senpac.tja new file mode 100644 index 0000000..ef8a063 --- /dev/null +++ b/testing/data/senpac.tja @@ -0,0 +1,688 @@ +BPM:160 +OFFSET:-1.705 + +COURSE:Edit +LEVEL:10 + +STYLE:Double +BALLOON:12 +SCOREINIT:430 +SCOREDIFF:112 + + +#START P1 + + +10000201, +10100220, +1000002220002010, +1000100000111020, +10000201, +10100220, +1000222000200020, +#MEASURE 2/4 +1010, +#MEASURE 4/4 +300000000000000111200000, +1112121211121222, +1112121211211212, +1112111212211212, +1112111212121000, +1112121211121222, +1212111212121112, +1112111212221222, +1112111212121110, +3003003000303030, +#MEASURE 2/4 +, +#MEASURE 4/4 +1010221010102210, +1010221020111020, +1010221010102210, +1010221010222220, +1010221010102210, +1010221020111020, +1010221010102210, +1000000010212121, +20011020, +1000001110100010, +10011020, +1000001110201000, +1020102210201011, +1020102210201011, +1020102210201011, +1022102121212111, +1000000030000022, + +#GOGOSTART +1010001010221020, +1022101110102000, +1110201010221020, +1000700000000800, +1020112010222000, +1020112010222000, +1122002011220020, +1022102210221110, +1020112011111020, +1022102011111000, +1020112011111020, +1022121010221210, +1000201000102220, +1000201010101111, +1000202000002220, +3000202000002220, +5, +000000000000000000000000000000000008000000000000, + +#GOGOEND +1112121211121212, +1121121211211212, +1112111211121112, +1122112212121212, +1212111212121112, +1212112112121121, +2211221122112221, +1112111212121222, +1221221022121210, +3, + + +#END + + +#START P2 + + +10000201, +10100220, +1000002220002010, +1000100000111020, +10000201, +10100220, +1000222000200020, +#MEASURE 2/4 +1010, +#MEASURE 4/4 +300000000000000111200000, +1112121211121222, +1112121211211212, +1112111212211212, +1112111212103000, +1212111212121112, +1112121211211212, +1112111212221222, +1112111212121110, +3003003000303030, +#MEASURE 2/4 +, +#MEASURE 4/4 +1010102210101022, +1010102210201220, +1010102210101022, +1010102210112220, +1010102210101022, +1010102210202220, +1010102210101022, +1000000010212121, +20011020, +1000001110100010, +10011020, +1000001110001020, +1011202010102010, +1011201020101020, +1011201010112000, +1112111212121000, +3000000030000022, + +#GOGOSTART +1022102010100010, +1110102011201000, +1022102010102210, +1020101011103000, +3011201020112010, +1011201020112010, +1000112210001122, +1000111011102020, +1022102010100010, +1110102011201020, +1022102011102020, +1122102011221020, +1000102210201110, +1020102210201110, +3000202000002220, +3000202000002220, +5, +000000000000000000000000000000000008000000000000, + +#GOGOEND +1212111212121112, +1212112112121121, +2211221122112221, +1112111212121212, +1112121211121212, +1121121211211212, +1112111211121112, +1122112212121222, +1221221022121210, +3, + + +#END + + +COURSE:Oni +LEVEL:10 + +STYLE:Double +BALLOON:12 +SCOREINIT:430 +SCOREDIFF:112 + + +#START P1 + + +10000201, +10100220, +1000002220002010, +1000100000111020, +10000201, +10100220, +1000222000200020, +#MEASURE 2/4 +1010, +#MEASURE 4/4 +300000000000000111200000, +1112121211121222, +1112121211211212, +1112111212211212, +1112111212121000, +1112121211121222, +1212111212121112, +1112111212221222, +1112111212121110, +3003003000303030, +#MEASURE 2/4 +, +#MEASURE 4/4 +1010221010102210, +1010221020111020, +1010221010102210, +1010221010222220, +1010221010102210, +1010221020111020, +1010221010102210, +1000000010212121, +20011020, +1000001110100010, +10011020, +1000001110201000, +1020102210201011, +1020102210201011, +1020102210201011, +1022102121212111, +1000000030000022, + +#GOGOSTART +1010001010221020, +1022101110102000, +1110201010221020, +1000700000000800, +1020112010222000, +1020112010222000, +1122002011220020, +1022102210221110, +1020112011111020, +1022102011111000, +1020112011111020, +1022121010221210, +1000201000102220, +1000201010101111, +1000202000002220, +3000202000002220, +5, +000000000000000000000000000000000008000000000000, + +#GOGOEND +1112121211121212, +1121121211211212, +1112111211121112, +1122112212121212, +1212111212121112, +1212112112121121, +2211221122112221, +1112111212121222, +1221221022121210, +3, + + +#END + + +#START P2 + + +10000201, +10100220, +1000002220002010, +1000100000111020, +10000201, +10100220, +1000222000200020, +#MEASURE 2/4 +1010, +#MEASURE 4/4 +300000000000000111200000, +1112121211121222, +1112121211211212, +1112111212211212, +1112111212103000, +1212111212121112, +1112121211211212, +1112111212221222, +1112111212121110, +3003003000303030, +#MEASURE 2/4 +, +#MEASURE 4/4 +1010102210101022, +1010102210201220, +1010102210101022, +1010102210112220, +1010102210101022, +1010102210202220, +1010102210101022, +1000000010212121, +20011020, +1000001110100010, +10011020, +1000001110001020, +1011202010102010, +1011201020101020, +1011201010112000, +1112111212121000, +3000000030000022, + +#GOGOSTART +1022102010100010, +1110102011201000, +1022102010102210, +1020101011103000, +3011201020112010, +1011201020112010, +1000112210001122, +1000111011102020, +1022102010100010, +1110102011201020, +1022102011102020, +1122102011221020, +1000102210201110, +1020102210201110, +3000202000002220, +3000202000002220, +5, +000000000000000000000000000000000008000000000000, + +#GOGOEND +1212111212121112, +1212112112121121, +2211221122112221, +1112111212121212, +1112121211121212, +1121121211211212, +1112111211121112, +1122112212121222, +1221221022121210, +3, + + +#END + + +STYLE:Single +BALLOON: +SCOREINIT:590 +SCOREDIFF:157 + + +#START + + +10000201, +10100220, +1000002220002010, +1000100000111020, +10000201, +10100220, +1000222000200020, +#MEASURE 2/4 +1010, +#MEASURE 4/4 +300000000000000111200000, +1112121211121222, +1112121211211212, +1112111212211212, +1112111212121000, +1112121211121222, +1112121211121212, +1112111212221222, +1112111212121110, +3003003000303030, +#MEASURE 2/4 +, +#MEASURE 4/4 +1010221010102210, +1010221020111020, +1010221010102210, +1010221010221120, +1010221010102210, +1010221020111020, +1010221010102211, +1000000010212121, +20011020, +1000001110200020, +10011020, +1000001110222020, +1020102210201011, +1020102210201011, +1020102210201011, +1022102121212111, +1000000030000022, + +#GOGOSTART +1022102010112010, +1110102011201020, +1022101020102210, +1020101011103000, +3011201020112010, +1011201020112010, +1000112210001122, +1020112011122020, +1022102010112010, +1110102011201020, +1022102011102020, +1122102011221020, +1020102210201110, +1020102210221110, +3000202000002220, +3000202000002220, +5, +000000000000000000000000000000000008000000000000, + +#GOGOEND + +1112121211121212, +1121121211211212, +1112111211121112, +1122112212121212, +1112121211121212, +1112112112121121, +2211221122112212, +1112111212121222, +1221221022121210, +3, + + +#END + + +COURSE:Hard +LEVEL:8 +BALLOON:8 +SCOREINIT:610 +SCOREDIFF:165 + +#START +30000201, +10100220, +10022021, +10100111, +10011201, +10100220, +10220202, +#MEASURE 2/4 +10, +#MEASURE 4/4 +3004, +1110111011011020, +1110111011101000, +1110111022202220, +1110111011103000, +1110111011011020, +1110111011101000, +1110111022202220, +1101101011101000, +3003003000303030, +#MEASURE 2/4 +, +#MEASURE 4/4 +1010201000111010, +1010201000111000, +1010201000111010, +1010201000222000, +1010201000111010, +1010201000111010, +11211121, +1000000011111000, +10011020, +1000001110000000, +10011020, +1000001110002000, +12121110, +12121010, +12101210, +500000000000000000000000000000000000000000000008, +03, + +#GOGOSTART +1022202010111000, +1110202011102000, +1022202010111000, +1000700000000800, +3011101000200020, +1011101000222000, +1110200011102000, +1110111011102000, +1022202010111010, +1110202011102000, +1022202011101000, +3333, +3022202011101000, +1110202011102000, +30200220, +30200220, +5, +000000000000000000000000000000000008000000000000, + +#GOGOEND +1110111011011020, +1110111011101000, +1110111022202220, +1110111011103000, +1110111011011020, +1110111011111000, +1110111022202220, +1101101101102000, +3003003000303030, +3, +, +, +, +, +, +, +#END + +COURSE:Normal +LEVEL:5 +BALLOON:8 +SCOREINIT:710 +SCOREDIFF:217 + +#START +11, +10100220, +11, +10100220, +11, +10100220, +11, +#MEASURE 2/4 +11, +#MEASURE 4/4 +3004, +11101110, +11101010, +11101110, +11111030, +11101110, +22202020, +11101110, +11111000, +3003003000303030, +#MEASURE 2/4 +, +#MEASURE 4/4 +11010110, +1011, +11010110, +12, +11010110, +1011, +11010110, +3, +10011000, +22, +10011000, +22, +10111010, +10111000, +10111010, +500000000000000000000000000000000000000000000008, +03, + +#GOGOSTART +10222020, +1222, +10222020, +7000000000000800, +10100220, +10100220, +11, +1111, +10222020, +1222, +10222020, +3333, +30100220, +10100220, +30000220, +30000220, +5, +000000000000000000000000000000000008000000000000, + +#GOGOEND +11101110, +11101010, +11101110, +11111030, +11101110, +22202020, +11101110, +11111030, +3003003000303030, +3, +, +, +, +, +, +, +#END + +COURSE:Easy +LEVEL:4 +BALLOON: +SCOREINIT:700 +SCOREDIFF:280 + +#START +11, +1110, +11, +1, +11, +1110, +11, +#MEASURE 2/4 +1, +#MEASURE 4/4 +30, +1110, +11, +1110, +11, +2220, +22, +2220, +22, +3033, +#MEASURE 2/4 +, +#MEASURE 4/4 +1101, +12, +1101, +12, +1101, +12, +1101, +1, +11, +22, +11, +22, +1011, +1011, +11, +500000000000000000000000000000000000000000000008, +03, + +#GOGOSTART +1202, +1202, +1202, +500000000000000000000008000000000000000000000000, +1120, +1120, +11, +1120, +1202, +1202, +1202, +3330, +1120, +1120, +34, +34, +5, +000000000000000000000000000000000008000000000000, + +#GOGOEND +1111, +11, +1111, +11, +2222, +22, +2222, +22, +3330, +3, +, +, +, +, +, +, +#END \ No newline at end of file diff --git a/testing/data/senpac.zip b/testing/data/senpac.zip new file mode 100644 index 0000000..8459bb5 Binary files /dev/null and b/testing/data/senpac.zip differ diff --git a/testing/test_conversion.py b/testing/test_conversion.py index dd65abb..22cd878 100644 --- a/testing/test_conversion.py +++ b/testing/test_conversion.py @@ -12,6 +12,7 @@ from tja2fumen.constants import COURSE_IDS, NORMALIZE_COURSE, simpleHeaders, byt @pytest.mark.parametrize('id_song', [ + pytest.param('senpac'), pytest.param('butou5'), pytest.param('hol6po'), pytest.param('mikdp'),