From ce633253ee1d4381771213ac7a91c6cc737881d7 Mon Sep 17 00:00:00 2001 From: Viv Date: Wed, 5 Jul 2023 16:03:41 -0400 Subject: [PATCH] Add support for multiplayer charts (`STYLE:{Single,Double}`, `# START {P1,P2}`) (#23) This PR adds support for multiplayer charts, and adds a new multiplayer TJA/fumen combo for testing. This PR is quite small, because the only work that needed to be done is parsing the course metadata. Once the TJA lines are split into courses, the actual course-by-course parsing logic is identical to the songs that came before. Fixes #6. --- src/tja2fumen/__init__.py | 17 +- src/tja2fumen/parsers.py | 24 +- testing/data/senpac.tja | 688 +++++++++++++++++++++++++++++++++++++ testing/data/senpac.zip | Bin 0 -> 17791 bytes testing/test_conversion.py | 1 + 5 files changed, 719 insertions(+), 11 deletions(-) create mode 100644 testing/data/senpac.tja create mode 100644 testing/data/senpac.zip 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 0000000000000000000000000000000000000000..8459bb5bd13b5fdeebe86449d80c784cb2212f1c GIT binary patch literal 17791 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 R!M|~TvawOV2k`T|{{o>^lxF|{ literal 0 HcmV?d00001 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'),