Clean up code a little
- Move duck blocks down, they were too high - Change timing on jump notes, 1/8th to allow user to jump over - Change timing on duck blocks, 1/16h to allow user to duck under on beat - Move jump note blocks down into the ground, so they're easy to jump over - Shorten song duration by 10 seconds, so you don't wait at the end for 10 seconds - Add more metadata to the files
This commit is contained in:
@@ -1,11 +1,8 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
from copy import deepcopy
|
||||
from dataclasses import asdict
|
||||
|
||||
from drsxml2json import ALL_TRACK_PATHS
|
||||
from drsxml2json import get_songdata_from_track_id
|
||||
@@ -22,138 +19,112 @@ from model.dancedash import DDRoadBlockNode
|
||||
from model.dancedash import DDSphereNode
|
||||
from model.dancedash import DRS_TO_DDS_LINE_NOTE_TYPE
|
||||
from model.dancedash import DRS_TO_DDS_NOTE_TYPE
|
||||
from model.dancedash import ORDER_COUNT_PER_BEAT
|
||||
from model.dancedash import X_Y
|
||||
from model.dancedash import X_Y_Z
|
||||
from model.dancerush import DRS_DOWN
|
||||
from model.dancerush import DRS_JUMP
|
||||
from model.dancerush import DRSSongData
|
||||
from model.dancerush import DRSSongDifficulty
|
||||
from model.dancerush import DRSTrackPoint
|
||||
from model.dancerush import DRSTrackStep
|
||||
from util import create_valid_filename
|
||||
from util import get_ogg_and_duration
|
||||
from util import get_song_cover_path
|
||||
from util import ORDER_COUNT_PER_BEAT
|
||||
from util import yyyymmdd_to_ticks
|
||||
|
||||
|
||||
def map_sphere_nodes(
|
||||
difficulty: DRSSongDifficulty,
|
||||
total_time_seconds: float,
|
||||
bpm: int,
|
||||
bps: float,
|
||||
ticks_per_second: float,
|
||||
) -> list[DDSphereNode]:
|
||||
spheres = []
|
||||
for track_step in difficulty.track.sequence_data:
|
||||
track_step: DRSTrackStep = track_step
|
||||
# Long note get mapped elsewhere
|
||||
if track_step.long_point or track_step.kind in (DRS_DOWN, DRS_JUMP):
|
||||
if track_step.long_point or track_step.is_down_or_up:
|
||||
continue
|
||||
bps = bpm / 60
|
||||
|
||||
if track_step.tick_info.start_tick:
|
||||
end_time_seconds = difficulty.track.clip.end_time / 1000
|
||||
ticks_per_second = difficulty.track.info.end_tick / end_time_seconds
|
||||
seconds = track_step.tick_info.end_tick / ticks_per_second
|
||||
else:
|
||||
seconds = track_step.tick_info.stime_ms / 1000
|
||||
|
||||
time = seconds / total_time_seconds
|
||||
sphere = DDSphereNode(
|
||||
noteOrder=round(bps * seconds * ORDER_COUNT_PER_BEAT),
|
||||
time=time,
|
||||
position=X_Y(x=track_step.position_info.to_dance_dash_x, y=0),
|
||||
position2D=X_Y(x=0, y=0),
|
||||
size=X_Y_Z(x=1, y=1, z=1),
|
||||
noteType=DRS_TO_DDS_NOTE_TYPE[track_step.kind],
|
||||
postionOffset=None,
|
||||
isPlayAudio=False,
|
||||
spheres.append(
|
||||
DDSphereNode(
|
||||
noteOrder=round(bps * seconds * ORDER_COUNT_PER_BEAT),
|
||||
time=seconds / total_time_seconds,
|
||||
position=X_Y(x=track_step.position_info.to_dance_dash_x, y=0),
|
||||
noteType=DRS_TO_DDS_NOTE_TYPE[track_step.kind],
|
||||
),
|
||||
)
|
||||
spheres.append(sphere)
|
||||
|
||||
return spheres
|
||||
|
||||
|
||||
def map_line_nodes(
|
||||
difficulty: DRSSongDifficulty,
|
||||
total_time_seconds: float,
|
||||
bpm: int,
|
||||
bps: float,
|
||||
ticks_per_second: float,
|
||||
) -> list[DDLineNode]:
|
||||
lines = []
|
||||
for line_group_id, track_step in enumerate(difficulty.track.sequence_data, start=1):
|
||||
track_step: DRSTrackStep = track_step
|
||||
if not track_step.long_point or track_step.kind in (DRS_DOWN, DRS_JUMP):
|
||||
if not track_step.long_point or track_step.is_down_or_up:
|
||||
continue
|
||||
|
||||
bps = bpm / 60
|
||||
|
||||
# DANCERUSH defines the first line step as a point, with the first point being the start of the line.
|
||||
# So we need to add a point at the start of the line for Dance Dash.
|
||||
initial_track_point = DRSTrackPoint(
|
||||
tick=track_step.tick_info.start_tick,
|
||||
left_pos=track_step.position_info.left_pos,
|
||||
right_pos=track_step.position_info.right_pos,
|
||||
point_time=track_step.tick_info.stime_ms,
|
||||
track_step.long_point.insert(
|
||||
0, DRSTrackPoint(
|
||||
tick=track_step.tick_info.start_tick,
|
||||
left_pos=track_step.position_info.left_pos,
|
||||
right_pos=track_step.position_info.right_pos,
|
||||
point_time=track_step.tick_info.stime_ms,
|
||||
),
|
||||
)
|
||||
track_step.long_point.insert(0, initial_track_point)
|
||||
|
||||
index_in_line = 0
|
||||
last_was_shuffle_end = False
|
||||
index_in_line = 0
|
||||
for drs_track_point in track_step.long_point:
|
||||
last_was_shuffle_end = False
|
||||
index_in_line += 1
|
||||
drs_track_point: DRSTrackPoint = drs_track_point
|
||||
|
||||
if drs_track_point.tick is not None:
|
||||
end_time_seconds = difficulty.track.clip.end_time / 1000
|
||||
ticks_per_second = difficulty.track.info.end_tick / end_time_seconds
|
||||
if drs_track_point.tick:
|
||||
seconds = drs_track_point.tick / ticks_per_second
|
||||
else:
|
||||
seconds = drs_track_point.point_time / 1000
|
||||
|
||||
line = DDLineNode(
|
||||
lineGroupId=line_group_id,
|
||||
indexInLine=index_in_line,
|
||||
isSliding=False,
|
||||
noteOrder=round(bps * seconds * ORDER_COUNT_PER_BEAT),
|
||||
time=seconds / total_time_seconds,
|
||||
position=X_Y(x=drs_track_point.to_dance_dash_x, y=0),
|
||||
position2D=X_Y(x=0, y=0),
|
||||
size=X_Y_Z(x=1, y=1, z=1),
|
||||
noteType=DRS_TO_DDS_LINE_NOTE_TYPE[track_step.kind],
|
||||
postionOffset=None,
|
||||
isPlayAudio=False,
|
||||
lines.append(
|
||||
DDLineNode(
|
||||
lineGroupId=line_group_id,
|
||||
indexInLine=index_in_line,
|
||||
noteOrder=round(bps * seconds * ORDER_COUNT_PER_BEAT),
|
||||
time=seconds / total_time_seconds,
|
||||
position=X_Y(x=drs_track_point.to_dance_dash_x, y=0),
|
||||
noteType=DRS_TO_DDS_LINE_NOTE_TYPE[track_step.kind],
|
||||
),
|
||||
)
|
||||
lines.append(line)
|
||||
|
||||
if drs_track_point.left_end_pos and drs_track_point.right_end_pos:
|
||||
index_in_line += 1
|
||||
end_line = deepcopy(line)
|
||||
end_line.position.x = drs_track_point.to_dance_dash_end_x
|
||||
end_line.indexInLine = index_in_line
|
||||
lines.append(end_line)
|
||||
lines.append(
|
||||
lines[-1].line_end(drs_track_point, index_in_line),
|
||||
)
|
||||
last_was_shuffle_end = True
|
||||
|
||||
if last_was_shuffle_end:
|
||||
last_line = lines[-1]
|
||||
tail_line = deepcopy(last_line)
|
||||
tail_line.noteOrder += ORDER_COUNT_PER_BEAT / 4
|
||||
tail_line.indexInLine += 1
|
||||
lines.append(tail_line)
|
||||
|
||||
lines.append(lines[-1].tail)
|
||||
return lines
|
||||
|
||||
|
||||
def map_down_and_jump_notes(
|
||||
difficulty: DRSSongDifficulty,
|
||||
total_time_seconds: float,
|
||||
bpm: int,
|
||||
bps: float,
|
||||
ticks_per_second: float,
|
||||
) -> list[DDRoadBlockNode]:
|
||||
road_blocks = []
|
||||
for track_step in difficulty.track.sequence_data:
|
||||
if track_step.kind not in (DRS_DOWN, DRS_JUMP):
|
||||
if not track_step.is_down_or_up:
|
||||
continue
|
||||
|
||||
bps = bpm / 60
|
||||
if track_step.tick_info.start_tick:
|
||||
end_time_seconds = difficulty.track.clip.end_time / 1000
|
||||
ticks_per_second = difficulty.track.info.end_tick / end_time_seconds
|
||||
seconds = track_step.tick_info.end_tick / ticks_per_second
|
||||
else:
|
||||
seconds = track_step.tick_info.stime_ms / 1000
|
||||
@@ -161,133 +132,112 @@ def map_down_and_jump_notes(
|
||||
note_order = round(bps * seconds * ORDER_COUNT_PER_BEAT)
|
||||
if track_step.kind == DRS_JUMP:
|
||||
# user jumps OVER in DD, not ON like in DRS
|
||||
note_order += ORDER_COUNT_PER_BEAT / 4
|
||||
note_order += ORDER_COUNT_PER_BEAT / 8
|
||||
elif track_step.kind == DRS_DOWN:
|
||||
# user needs to duck UNDER in DD, not go down ON like in DRS
|
||||
note_order += ORDER_COUNT_PER_BEAT / 16
|
||||
|
||||
road_block = DDRoadBlockNode(
|
||||
noteOrder=note_order,
|
||||
time=seconds / total_time_seconds,
|
||||
position=DDJumpPos if track_step.kind == DRS_JUMP else DDDownPos,
|
||||
position2D=DDJumpPos2D if track_step.kind == DRS_JUMP else DDDownPos2D,
|
||||
road_blocks.append(
|
||||
DDRoadBlockNode(
|
||||
noteOrder=note_order,
|
||||
time=seconds / total_time_seconds,
|
||||
position=DDJumpPos if track_step.kind == DRS_JUMP else DDDownPos,
|
||||
position2D=DDJumpPos2D if track_step.kind == DRS_JUMP else DDDownPos2D,
|
||||
),
|
||||
)
|
||||
road_blocks.append(road_block)
|
||||
|
||||
return road_blocks
|
||||
|
||||
|
||||
def create_dd_tracks_from_DRSSongData(
|
||||
drs_song_data: DRSSongData, target_dir: str,
|
||||
) -> bool:
|
||||
def create_dd_tracks_from_DRSSongData(drs_song_data: DRSSongData, target_dir: str = None) -> bool:
|
||||
if not target_dir:
|
||||
target_dir = f'tracks/{create_valid_filename(song_data.info.title_name)}/'
|
||||
|
||||
dd_bmp = int(drs_song_data.info.bpm_max / 100)
|
||||
dd_bps = dd_bmp / 60
|
||||
|
||||
folder_path = TRACK_ID_TO_PATH.get(drs_song_data.song_id)
|
||||
song_path, song_length = get_ogg_and_duration(folder_path)
|
||||
|
||||
if not song_path or not song_length:
|
||||
print(
|
||||
f'Could not find song path or song length for {drs_song_data.info.title_name}',
|
||||
f'No song found for {drs_song_data.info.title_name} ({drs_song_data.song_id})',
|
||||
)
|
||||
return False
|
||||
|
||||
if not os.path.exists(target_dir):
|
||||
os.makedirs(target_dir)
|
||||
print(f'Created directory: {target_dir}')
|
||||
|
||||
if song_path and song_length:
|
||||
shutil.copy(song_path, target_dir)
|
||||
|
||||
new_song_path = os.path.join(target_dir, drs_song_data.ogg)
|
||||
shutil.copy(song_path, new_song_path)
|
||||
song_path = new_song_path
|
||||
if song_cover_path := get_song_cover_path(folder_path):
|
||||
shutil.copy(song_cover_path, target_dir)
|
||||
new_song_cover_path = os.path.join(target_dir, drs_song_data.png)
|
||||
shutil.copy(song_cover_path, new_song_cover_path)
|
||||
song_cover_path = new_song_cover_path
|
||||
|
||||
song_paths = []
|
||||
for attr, difficulty in drs_song_data.difficulties.with_attrs_as_str.items():
|
||||
|
||||
if attr in ('difficulty_2a', 'difficulty_2b'): # 2 player difficulties
|
||||
continue
|
||||
|
||||
ticks_per_second = None
|
||||
if difficulty.track.clip and difficulty.track.clip.end_time:
|
||||
end_time_seconds = difficulty.track.clip.end_time / 1000
|
||||
ticks_per_second = difficulty.track.info.end_tick / end_time_seconds
|
||||
|
||||
song_length_f = float(song_length)
|
||||
sphere_notes = map_sphere_nodes(
|
||||
difficulty,
|
||||
float(song_length),
|
||||
dd_bmp,
|
||||
difficulty, song_length_f, dd_bps, ticks_per_second,
|
||||
)
|
||||
line_notes = map_line_nodes(
|
||||
difficulty,
|
||||
float(song_length),
|
||||
dd_bmp,
|
||||
difficulty, song_length_f, dd_bps, ticks_per_second,
|
||||
)
|
||||
road_block_notes = map_down_and_jump_notes(
|
||||
difficulty,
|
||||
float(song_length),
|
||||
dd_bmp,
|
||||
difficulty, song_length_f, dd_bps, ticks_per_second,
|
||||
)
|
||||
total_note_count = len(sphere_notes) + \
|
||||
len(line_notes) + len(road_block_notes)
|
||||
|
||||
total_note_count = len(sphere_notes + line_notes + road_block_notes) # noqa
|
||||
drs_beat_map = DDBeatMap(
|
||||
data=DDBeatMapData(
|
||||
name=f'{drs_song_data.info.title_name} {attr}',
|
||||
intervalPerSecond=0.0,
|
||||
gridSize=X_Y(x=0, y=0),
|
||||
planeSize=X_Y(x=0, y=0),
|
||||
orderCountPerBeat=ORDER_COUNT_PER_BEAT,
|
||||
sphereNodes=sphere_notes,
|
||||
lineNodes=line_notes,
|
||||
effectNodes=[],
|
||||
roadBlockNodes=road_block_notes,
|
||||
trapNodes=[],
|
||||
),
|
||||
beatSubs=1,
|
||||
BPM=dd_bmp,
|
||||
songStartOffset=0.0,
|
||||
NPS=str(round(total_note_count / float(song_length), 2)),
|
||||
developerMode=False,
|
||||
noteSpeed=1.0,
|
||||
noteJumpOffset=0.0,
|
||||
interval=1.0,
|
||||
info='',
|
||||
NPS=str(round(total_note_count / song_length_f, 2)),
|
||||
)
|
||||
target_difficulty_path = os.path.join(
|
||||
target_dir, f'{drs_song_data.song_id}_{attr}.json',
|
||||
)
|
||||
song_paths.append(target_difficulty_path)
|
||||
with open(target_difficulty_path, 'w') as f:
|
||||
json.dump(asdict(drs_beat_map), f, indent=4)
|
||||
print(f'Created file: {target_difficulty_path}')
|
||||
|
||||
drs_beat_map_no_blocks = deepcopy(drs_beat_map)
|
||||
drs_beat_map_no_blocks.data.roadBlockNodes = []
|
||||
target_difficulty_path_no_blocks = os.path.join(
|
||||
target_dir, f'{drs_song_data.song_id}_{attr}_no_blocks.json',
|
||||
song_paths.append(
|
||||
drs_beat_map.save_to_file(
|
||||
target_dir, f'{attr}.json',
|
||||
),
|
||||
)
|
||||
song_paths.append(
|
||||
drs_beat_map.block_less.save_to_file(
|
||||
target_dir, f'{attr}_blockless.json',
|
||||
),
|
||||
)
|
||||
song_paths.append(target_difficulty_path_no_blocks)
|
||||
with open(target_difficulty_path_no_blocks, 'w') as f:
|
||||
json.dump(asdict(drs_beat_map_no_blocks), f, indent=4)
|
||||
print(f'Created file: {target_difficulty_path_no_blocks}')
|
||||
|
||||
normal, normal_no_blocks, easy, easy_no_blocks = song_paths
|
||||
create_ticks = yyyymmdd_to_ticks(str(drs_song_data.info.distribution_date))
|
||||
drs_song_info_json = DDBeatMapInfoFile(
|
||||
EditorVersion='1.3.2',
|
||||
CreateTicks=create_ticks,
|
||||
CreateTime=str(create_ticks),
|
||||
BeatMapId=drs_song_data.song_id,
|
||||
OstId=0,
|
||||
CreateTicks=0,
|
||||
CreateTime='',
|
||||
SongName=drs_song_data.info.title_name,
|
||||
SongLength=song_length,
|
||||
SongAuthorName=drs_song_data.info.artist_name,
|
||||
LevelAuthorName='https://github.com/thomasasfk/drs2dd',
|
||||
SongPreviewSection=0,
|
||||
Bpm=str(dd_bmp),
|
||||
SongPath=os.path.basename(song_path or '') or None,
|
||||
OstName=None,
|
||||
SongPath=os.path.basename(song_path),
|
||||
CoverPath=os.path.basename(song_cover_path or '') or None,
|
||||
DRS_Easy=os.path.basename(easy_no_blocks),
|
||||
DRS_Normal=os.path.basename(normal_no_blocks),
|
||||
DRS_Hard=os.path.basename(easy),
|
||||
DRS_Expert=os.path.basename(normal),
|
||||
)
|
||||
drs_song_info_json.save_to_file(target_dir)
|
||||
|
||||
info_file_path = os.path.join(target_dir, 'info.json')
|
||||
with open(info_file_path, 'w') as f:
|
||||
json.dump(asdict(drs_song_info_json), f, indent=4)
|
||||
print(f'Created file: {info_file_path}')
|
||||
|
||||
print(f'Created {drs_song_data.info.title_name} ({drs_song_data.song_id})')
|
||||
return True
|
||||
|
||||
|
||||
@@ -296,32 +246,30 @@ if __name__ == '__main__':
|
||||
description='Create DD tracks from DRS Song Data',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--song-id', type=int,
|
||||
'--song-id',
|
||||
type=int,
|
||||
help='ID of the song to process (number of folder)',
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.song_id:
|
||||
song_data = get_songdata_from_track_id(args.song_id)
|
||||
if not song_data:
|
||||
print(f'No song data found for song id {args.song_id}')
|
||||
raise SystemExit(1)
|
||||
|
||||
target_directory = create_valid_filename(song_data.info.title_name)
|
||||
created = create_dd_tracks_from_DRSSongData(
|
||||
song_data, song_data.info.title_name,
|
||||
song_data, target_directory,
|
||||
)
|
||||
|
||||
print(f'Song {args.song_id} created?: {created}')
|
||||
raise SystemExit(0)
|
||||
|
||||
for song_id in ALL_TRACK_PATHS:
|
||||
if song_data := get_songdata_from_track_id(int(song_id)):
|
||||
try:
|
||||
created = create_dd_tracks_from_DRSSongData(
|
||||
song_data, f'tracks/{song_data.info.title_name}',
|
||||
)
|
||||
create_dd_tracks_from_DRSSongData(song_data)
|
||||
except Exception as e:
|
||||
print(f'Error creating song {song_id}: {e}')
|
||||
created = False
|
||||
print(f'Song {song_id} created?: {created}')
|
||||
|
||||
raise SystemExit(0)
|
||||
|
||||
+73
-34
@@ -1,10 +1,15 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import os
|
||||
from copy import deepcopy
|
||||
from dataclasses import asdict
|
||||
from dataclasses import dataclass
|
||||
from dataclasses import field
|
||||
|
||||
from model.dancerush import DRS_LEFT
|
||||
from model.dancerush import DRS_RIGHT
|
||||
from model.dancerush import DRSTrackPoint
|
||||
|
||||
DD_LEFT = 8
|
||||
DD_RIGHT = 9
|
||||
@@ -14,6 +19,8 @@ DD_LINE_RIGHT = 13
|
||||
|
||||
DD_ROAD_BLOCK = 14
|
||||
|
||||
ORDER_COUNT_PER_BEAT = 24
|
||||
|
||||
DRS_TO_DDS_NOTE_TYPE = {
|
||||
DRS_LEFT: DD_LEFT,
|
||||
DRS_RIGHT: DD_RIGHT,
|
||||
@@ -40,15 +47,28 @@ class X_Y_Z(X_Y):
|
||||
class DDLineNode:
|
||||
lineGroupId: int
|
||||
indexInLine: int
|
||||
isSliding: bool
|
||||
noteOrder: int
|
||||
time: float
|
||||
position: X_Y
|
||||
position2D: X_Y
|
||||
size: X_Y_Z
|
||||
noteType: int
|
||||
postionOffset: X_Y_Z | None # Yes, postionOffset - not positionOffset.
|
||||
isPlayAudio: bool
|
||||
position2D: X_Y = X_Y(x=0, y=0)
|
||||
size: X_Y_Z = X_Y_Z(x=1, y=1, z=1)
|
||||
isPlayAudio: bool = False
|
||||
postionOffset: X_Y_Z | None = None
|
||||
isSliding: bool = False
|
||||
|
||||
def line_end(self, track_point: DRSTrackPoint, index: int):
|
||||
line = deepcopy(self)
|
||||
line.position.x = track_point.to_dance_dash_end_x
|
||||
line.indexInLine = index
|
||||
return line
|
||||
|
||||
@property
|
||||
def tail(self):
|
||||
line = deepcopy(self)
|
||||
line.noteOrder += ORDER_COUNT_PER_BEAT / 4
|
||||
line.indexInLine += 1
|
||||
return line
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -56,18 +76,18 @@ class DDSphereNode:
|
||||
noteOrder: int
|
||||
time: float
|
||||
position: X_Y
|
||||
position2D: X_Y
|
||||
size: X_Y_Z
|
||||
noteType: DD_LEFT | DD_RIGHT
|
||||
postionOffset: dict | None
|
||||
isPlayAudio: bool
|
||||
position2D: X_Y = X_Y(x=0, y=0)
|
||||
size: X_Y_Z = X_Y_Z(x=1, y=1, z=1)
|
||||
postionOffset: dict | None = None
|
||||
isPlayAudio: bool = False
|
||||
|
||||
|
||||
DDJumpPos2D = X_Y(x=1.49, y=4.33)
|
||||
DDDownPos2D = X_Y(x=1.49, y=-3.932)
|
||||
DDJumpPos2D = X_Y(x=0.0, y=0.0)
|
||||
DDDownPos2D = X_Y(x=0.0, y=0.0)
|
||||
|
||||
DDJumpPos = X_Y(x=5, y=0)
|
||||
DDDownPos = X_Y(x=5, y=12)
|
||||
DDJumpPos = X_Y(x=5, y=-1)
|
||||
DDDownPos = X_Y(x=5, y=10)
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -77,9 +97,9 @@ class DDRoadBlockNode:
|
||||
position: X_Y
|
||||
position2D: X_Y
|
||||
length: int = 1
|
||||
noteType: DD_ROAD_BLOCK = DD_ROAD_BLOCK
|
||||
postionOffset: X_Y_Z = X_Y_Z(x=0, y=0, z=0)
|
||||
size: X_Y_Z = X_Y_Z(x=1, y=1, z=1)
|
||||
noteType: DD_ROAD_BLOCK = DD_ROAD_BLOCK
|
||||
isPlayAudio: bool = False
|
||||
startPosSelctOrder: int = -1
|
||||
endPosSelctOrder: int = -1
|
||||
@@ -89,45 +109,58 @@ class DDRoadBlockNode:
|
||||
@dataclass
|
||||
class DDBeatMapData:
|
||||
name: str
|
||||
intervalPerSecond: float
|
||||
gridSize: X_Y
|
||||
planeSize: X_Y
|
||||
orderCountPerBeat: int
|
||||
sphereNodes: list[DDSphereNode] = field(default_factory=list)
|
||||
lineNodes: list[DDLineNode] = field(default_factory=list)
|
||||
sphereNodes: list[DDSphereNode]
|
||||
lineNodes: list[DDLineNode]
|
||||
roadBlockNodes: list[DDRoadBlockNode]
|
||||
intervalPerSecond: float = 0.0
|
||||
gridSize: X_Y = X_Y(x=0, y=0)
|
||||
planeSize: X_Y = X_Y(x=0, y=0)
|
||||
orderCountPerBeat: int = ORDER_COUNT_PER_BEAT
|
||||
effectNodes: list = field(default_factory=list)
|
||||
roadBlockNodes: list = field(default_factory=list)
|
||||
trapNodes: list = field(default_factory=list)
|
||||
|
||||
|
||||
@dataclass
|
||||
class DDBeatMap:
|
||||
data: DDBeatMapData
|
||||
beatSubs: int
|
||||
BPM: int
|
||||
songStartOffset: float
|
||||
NPS: str
|
||||
developerMode: bool
|
||||
noteSpeed: float
|
||||
noteJumpOffset: float
|
||||
interval: float
|
||||
info: str
|
||||
beatSubs: int = 1
|
||||
songStartOffset: float = 0.0
|
||||
developerMode: bool = False
|
||||
noteSpeed: float = 1.0
|
||||
noteJumpOffset: float = 0.0
|
||||
interval: float = 1.0
|
||||
info: str = ''
|
||||
|
||||
def save_to_file(self, target_dir: str, filename: str) -> str:
|
||||
target_difficulty_path = os.path.join(target_dir, filename)
|
||||
with open(target_difficulty_path, 'w') as f:
|
||||
json.dump(asdict(self), f, indent=4)
|
||||
return target_difficulty_path
|
||||
|
||||
@property
|
||||
def block_less(self):
|
||||
beat_map = deepcopy(self)
|
||||
beat_map.data.name = f'{beat_map.data.name} (Blockless)'
|
||||
beat_map.data.roadBlockNodes = []
|
||||
return beat_map
|
||||
|
||||
|
||||
@dataclass
|
||||
class DDBeatMapInfoFile:
|
||||
EditorVersion: str
|
||||
BeatMapId: int
|
||||
OstId: int
|
||||
CreateTicks: int
|
||||
CreateTime: str
|
||||
SongName: str
|
||||
SongLength: str
|
||||
SongAuthorName: str
|
||||
LevelAuthorName: str
|
||||
SongPreviewSection: int
|
||||
Bpm: str
|
||||
SongPath: str
|
||||
CreateTicks: int
|
||||
CreateTime: str
|
||||
EditorVersion: str = '1.3.2'
|
||||
OstId: int = 0
|
||||
LevelAuthorName: str = 'https://github.com/thomasasfk/drs2dd'
|
||||
SongPreviewSection: int = 0
|
||||
OstName: str | None = None
|
||||
CoverPath: str | None = None
|
||||
DDVR_Easy: str | None = None
|
||||
@@ -141,3 +174,9 @@ class DDBeatMapInfoFile:
|
||||
DRS_ACE: str | None = None
|
||||
DDVR_Env: str | None = None
|
||||
DRS_Env: str | None = None
|
||||
|
||||
def save_to_file(self, target_dir: str) -> str:
|
||||
info_file_path = os.path.join(target_dir, 'info.json')
|
||||
with open(info_file_path, 'w') as f:
|
||||
json.dump(asdict(self), f, indent=4)
|
||||
return info_file_path
|
||||
|
||||
@@ -58,6 +58,14 @@ class DRSSongData:
|
||||
difficulties: DRSSongDifficulties | None = None
|
||||
info: DRSSongInfo | None = None
|
||||
|
||||
@property
|
||||
def ogg(self) -> str:
|
||||
return f'{str(self.song_id)}.ogg'
|
||||
|
||||
@property
|
||||
def png(self) -> str:
|
||||
return f'{str(self.song_id)}.png'
|
||||
|
||||
@classmethod
|
||||
def from_xml_dict(cls, data: dict, difficulties: DRSSongDifficulties) -> DRSSongData:
|
||||
return cls(
|
||||
@@ -337,6 +345,10 @@ class DRSTrackStep:
|
||||
player_info: DRSTrackStepPlayerInfo
|
||||
long_point: list[DRSTrackPoint] = field(default_factory=list)
|
||||
|
||||
@property
|
||||
def is_down_or_up(self):
|
||||
return self.kind in (DRS_DOWN, DRS_JUMP)
|
||||
|
||||
@classmethod
|
||||
def from_xml_dict(cls, data: dict):
|
||||
|
||||
|
||||
@@ -35,10 +35,5 @@ find . -type f -name "*.m4a" -exec sh -c 'ffmpeg -y -i "$1" "${1%.m4a}.ogg"' sh
|
||||
|
||||
```bash
|
||||
# remove 10 seconds from all ogg files
|
||||
find . -type f -name "*.ogg" -exec sh -c 'DURATION=$(ffprobe -i "$0" -show_entries format=duration -v quiet -of csv="p=0"); TRIM_TIME=$(awk "BEGIN {print $DURATION - 10}"); ffmpeg -ss 0 -t $TRIM_TIME -i "$0" "${0%.mp3}-fixed.ogg"' {} \;
|
||||
```
|
||||
|
||||
```bash
|
||||
# move the fixed ogg files to the original file name
|
||||
find . -type f -name '*-fixed.ogg' -exec sh -c 'mv "$0" "${0%-fixed.mp3}.ogg"' {} \;
|
||||
find . -type f -name "*.m4a" -exec sh -c 'DURATION=$(ffprobe -i "$0" -show_entries format=duration -v quiet -of csv="p=0"); TRIM_TIME=$(awk "BEGIN {print $DURATION - 10}"); ffmpeg -ss 0 -t $TRIM_TIME -i "$0" "${0%.m4a}.ogg"' {} \;
|
||||
```
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"EditorVersion": "1.3.2",
|
||||
"BeatMapId": 287,
|
||||
"OstId": 0,
|
||||
"CreateTicks": 0,
|
||||
"CreateTime": "",
|
||||
"SongName": "1-2-3 Jump!",
|
||||
"SongLength": "124.017778",
|
||||
"SongAuthorName": "\u307e\u308d\u3093 (IOSYS) ft. Renko",
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"Bpm": "110",
|
||||
"SongPath": "00287clip1.ogg",
|
||||
"OstName": null,
|
||||
"CoverPath": "jk_00287_b.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "287_difficulty_1b_no_blocks.json",
|
||||
"DRS_Normal": "287_difficulty_1a_no_blocks.json",
|
||||
"DRS_Hard": "287_difficulty_1b.json",
|
||||
"DRS_Expert": "287_difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
"DRS_Env": null
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"BeatMapId": 287,
|
||||
"SongName": "1-2-3 Jump!",
|
||||
"SongLength": "114.003469",
|
||||
"SongAuthorName": "\u307e\u308d\u3093 (IOSYS) ft. Renko",
|
||||
"Bpm": "110",
|
||||
"SongPath": "287.ogg",
|
||||
"CreateTicks": 637822944000000000,
|
||||
"CreateTime": "637822944000000000",
|
||||
"EditorVersion": "1.3.2",
|
||||
"OstId": 0,
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"OstName": null,
|
||||
"CoverPath": "287.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "difficulty_1b_blockless.json",
|
||||
"DRS_Normal": "difficulty_1a_blockless.json",
|
||||
"DRS_Hard": "difficulty_1b.json",
|
||||
"DRS_Expert": "difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
"DRS_Env": null
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+12
-12
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"EditorVersion": "1.3.2",
|
||||
"BeatMapId": 121,
|
||||
"OstId": 0,
|
||||
"CreateTicks": 0,
|
||||
"CreateTime": "",
|
||||
"SongName": "41 Days",
|
||||
"SongLength": "101.889161",
|
||||
"SongLength": "91.878458",
|
||||
"SongAuthorName": "Merk & Kremont",
|
||||
"Bpm": "128",
|
||||
"SongPath": "121.ogg",
|
||||
"CreateTicks": 637140384000000000,
|
||||
"CreateTime": "637140384000000000",
|
||||
"EditorVersion": "1.3.2",
|
||||
"OstId": 0,
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"Bpm": "128",
|
||||
"SongPath": "00121clip1.ogg",
|
||||
"OstName": null,
|
||||
"CoverPath": "jk_00121_b.png",
|
||||
"CoverPath": "121.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "121_difficulty_1b_no_blocks.json",
|
||||
"DRS_Normal": "121_difficulty_1a_no_blocks.json",
|
||||
"DRS_Hard": "121_difficulty_1b.json",
|
||||
"DRS_Expert": "121_difficulty_1a.json",
|
||||
"DRS_Easy": "difficulty_1b_blockless.json",
|
||||
"DRS_Normal": "difficulty_1a_blockless.json",
|
||||
"DRS_Hard": "difficulty_1b.json",
|
||||
"DRS_Expert": "difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"EditorVersion": "1.3.2",
|
||||
"BeatMapId": 132,
|
||||
"OstId": 0,
|
||||
"CreateTicks": 0,
|
||||
"CreateTime": "",
|
||||
"SongName": "50th Memorial Songs -Beginning Story-",
|
||||
"SongLength": "138.019410",
|
||||
"SongLength": "128.003469",
|
||||
"SongAuthorName": "BEMANI Sound Team",
|
||||
"Bpm": "135",
|
||||
"SongPath": "132.ogg",
|
||||
"CreateTicks": 636887232000000000,
|
||||
"CreateTime": "636887232000000000",
|
||||
"EditorVersion": "1.3.2",
|
||||
"OstId": 0,
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"Bpm": "135",
|
||||
"SongPath": "00132clip1.ogg",
|
||||
"OstName": null,
|
||||
"CoverPath": "jk_00132_b.png",
|
||||
"CoverPath": "132.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "132_difficulty_1b_no_blocks.json",
|
||||
"DRS_Normal": "132_difficulty_1a_no_blocks.json",
|
||||
"DRS_Hard": "132_difficulty_1b.json",
|
||||
"DRS_Expert": "132_difficulty_1a.json",
|
||||
"DRS_Easy": "difficulty_1b_blockless.json",
|
||||
"DRS_Normal": "difficulty_1a_blockless.json",
|
||||
"DRS_Hard": "difficulty_1b.json",
|
||||
"DRS_Expert": "difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"EditorVersion": "1.3.2",
|
||||
"BeatMapId": 133,
|
||||
"OstId": 0,
|
||||
"CreateTicks": 0,
|
||||
"CreateTime": "",
|
||||
"SongName": "50th Memorial Songs -Flagship medley-",
|
||||
"SongLength": "122.345941",
|
||||
"SongLength": "112.335465",
|
||||
"SongAuthorName": "BEMANI Sound Team",
|
||||
"Bpm": "135",
|
||||
"SongPath": "133.ogg",
|
||||
"CreateTicks": 636917472000000000,
|
||||
"CreateTime": "636917472000000000",
|
||||
"EditorVersion": "1.3.2",
|
||||
"OstId": 0,
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"Bpm": "135",
|
||||
"SongPath": "00133clip1.ogg",
|
||||
"OstName": null,
|
||||
"CoverPath": "jk_00133_b.png",
|
||||
"CoverPath": "133.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "133_difficulty_1b_no_blocks.json",
|
||||
"DRS_Normal": "133_difficulty_1a_no_blocks.json",
|
||||
"DRS_Hard": "133_difficulty_1b.json",
|
||||
"DRS_Expert": "133_difficulty_1a.json",
|
||||
"DRS_Easy": "difficulty_1b_blockless.json",
|
||||
"DRS_Normal": "difficulty_1a_blockless.json",
|
||||
"DRS_Hard": "difficulty_1b.json",
|
||||
"DRS_Expert": "difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"EditorVersion": "1.3.2",
|
||||
"BeatMapId": 131,
|
||||
"OstId": 0,
|
||||
"CreateTicks": 0,
|
||||
"CreateTime": "",
|
||||
"SongName": "50th Memorial Songs -The BEMANI History-",
|
||||
"SongLength": "130.008526",
|
||||
"SongLength": "120.003469",
|
||||
"SongAuthorName": "BEMANI Sound Team",
|
||||
"Bpm": "136",
|
||||
"SongPath": "131.ogg",
|
||||
"CreateTicks": 636917472000000000,
|
||||
"CreateTime": "636917472000000000",
|
||||
"EditorVersion": "1.3.2",
|
||||
"OstId": 0,
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"Bpm": "136",
|
||||
"SongPath": "00131clip1.ogg",
|
||||
"OstName": null,
|
||||
"CoverPath": "jk_00131_b.png",
|
||||
"CoverPath": "131.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "131_difficulty_1b_no_blocks.json",
|
||||
"DRS_Normal": "131_difficulty_1a_no_blocks.json",
|
||||
"DRS_Hard": "131_difficulty_1b.json",
|
||||
"DRS_Expert": "131_difficulty_1a.json",
|
||||
"DRS_Easy": "difficulty_1b_blockless.json",
|
||||
"DRS_Normal": "difficulty_1a_blockless.json",
|
||||
"DRS_Hard": "difficulty_1b.json",
|
||||
"DRS_Expert": "difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+7200
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+3743
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"BeatMapId": 134,
|
||||
"SongName": "50th Memorial Songs -\u4e8c\u4eba\u306e\u6642 \uff5eunder the cherry blossoms\uff5e-",
|
||||
"SongLength": "124.503469",
|
||||
"SongAuthorName": "BEMANI Sound Team",
|
||||
"Bpm": "160",
|
||||
"SongPath": "134.ogg",
|
||||
"CreateTicks": 636917472000000000,
|
||||
"CreateTime": "636917472000000000",
|
||||
"EditorVersion": "1.3.2",
|
||||
"OstId": 0,
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"OstName": null,
|
||||
"CoverPath": "134.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "difficulty_1b_blockless.json",
|
||||
"DRS_Normal": "difficulty_1a_blockless.json",
|
||||
"DRS_Hard": "difficulty_1b.json",
|
||||
"DRS_Expert": "difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
"DRS_Env": null
|
||||
}
|
||||
-8321
File diff suppressed because it is too large
Load Diff
-7200
File diff suppressed because it is too large
Load Diff
-4668
File diff suppressed because it is too large
Load Diff
-3743
File diff suppressed because it is too large
Load Diff
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"EditorVersion": "1.3.2",
|
||||
"BeatMapId": 134,
|
||||
"OstId": 0,
|
||||
"CreateTicks": 0,
|
||||
"CreateTime": "",
|
||||
"SongName": "50th Memorial Songs -\u4e8c\u4eba\u306e\u6642 \uff5eunder the cherry blossoms\uff5e-",
|
||||
"SongLength": "134.513197",
|
||||
"SongAuthorName": "BEMANI Sound Team",
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"Bpm": "160",
|
||||
"SongPath": "00134clip1.ogg",
|
||||
"OstName": null,
|
||||
"CoverPath": "jk_00134_b.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "134_difficulty_1b_no_blocks.json",
|
||||
"DRS_Normal": "134_difficulty_1a_no_blocks.json",
|
||||
"DRS_Hard": "134_difficulty_1b.json",
|
||||
"DRS_Expert": "134_difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
"DRS_Env": null
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+12
-12
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"EditorVersion": "1.3.2",
|
||||
"BeatMapId": 272,
|
||||
"OstId": 0,
|
||||
"CreateTicks": 0,
|
||||
"CreateTime": "",
|
||||
"SongName": "7 to Smoke",
|
||||
"SongLength": "120.627664",
|
||||
"SongLength": "110.628458",
|
||||
"SongAuthorName": "lapix",
|
||||
"Bpm": "120",
|
||||
"SongPath": "272.ogg",
|
||||
"CreateTicks": 637631136000000000,
|
||||
"CreateTime": "637631136000000000",
|
||||
"EditorVersion": "1.3.2",
|
||||
"OstId": 0,
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"Bpm": "120",
|
||||
"SongPath": "00272clip1.ogg",
|
||||
"OstName": null,
|
||||
"CoverPath": "jk_00272_b.png",
|
||||
"CoverPath": "272.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "272_difficulty_1b_no_blocks.json",
|
||||
"DRS_Normal": "272_difficulty_1a_no_blocks.json",
|
||||
"DRS_Hard": "272_difficulty_1b.json",
|
||||
"DRS_Expert": "272_difficulty_1a.json",
|
||||
"DRS_Easy": "difficulty_1b_blockless.json",
|
||||
"DRS_Normal": "difficulty_1a_blockless.json",
|
||||
"DRS_Hard": "difficulty_1b.json",
|
||||
"DRS_Expert": "difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+12
-12
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"EditorVersion": "1.3.2",
|
||||
"BeatMapId": 278,
|
||||
"OstId": 0,
|
||||
"CreateTicks": 0,
|
||||
"CreateTime": "",
|
||||
"SongName": "8347",
|
||||
"SongLength": "114.311837",
|
||||
"SongLength": "104.311474",
|
||||
"SongAuthorName": "Zekk",
|
||||
"Bpm": "130",
|
||||
"SongPath": "278.ogg",
|
||||
"CreateTicks": 637636320000000000,
|
||||
"CreateTime": "637636320000000000",
|
||||
"EditorVersion": "1.3.2",
|
||||
"OstId": 0,
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"Bpm": "130",
|
||||
"SongPath": "00278clip1.ogg",
|
||||
"OstName": null,
|
||||
"CoverPath": "jk_00278_b.png",
|
||||
"CoverPath": "278.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "278_difficulty_1b_no_blocks.json",
|
||||
"DRS_Normal": "278_difficulty_1a_no_blocks.json",
|
||||
"DRS_Hard": "278_difficulty_1b.json",
|
||||
"DRS_Expert": "278_difficulty_1a.json",
|
||||
"DRS_Easy": "difficulty_1b_blockless.json",
|
||||
"DRS_Normal": "difficulty_1a_blockless.json",
|
||||
"DRS_Hard": "difficulty_1b.json",
|
||||
"DRS_Expert": "difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"EditorVersion": "1.3.2",
|
||||
"BeatMapId": 236,
|
||||
"OstId": 0,
|
||||
"CreateTicks": 0,
|
||||
"CreateTime": "",
|
||||
"SongName": "A Legend Is Born",
|
||||
"SongLength": "126.804172",
|
||||
"SongLength": "116.803469",
|
||||
"SongAuthorName": "RoughSketch",
|
||||
"Bpm": "150",
|
||||
"SongPath": "236.ogg",
|
||||
"CreateTicks": 637394400000000000,
|
||||
"CreateTime": "637394400000000000",
|
||||
"EditorVersion": "1.3.2",
|
||||
"OstId": 0,
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"Bpm": "150",
|
||||
"SongPath": "00236clip1.ogg",
|
||||
"OstName": null,
|
||||
"CoverPath": "jk_00236_b.png",
|
||||
"CoverPath": "236.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "236_difficulty_1b_no_blocks.json",
|
||||
"DRS_Normal": "236_difficulty_1a_no_blocks.json",
|
||||
"DRS_Hard": "236_difficulty_1b.json",
|
||||
"DRS_Expert": "236_difficulty_1a.json",
|
||||
"DRS_Easy": "difficulty_1b_blockless.json",
|
||||
"DRS_Normal": "difficulty_1a_blockless.json",
|
||||
"DRS_Hard": "difficulty_1b.json",
|
||||
"DRS_Expert": "difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"EditorVersion": "1.3.2",
|
||||
"BeatMapId": 316,
|
||||
"OstId": 0,
|
||||
"CreateTicks": 0,
|
||||
"CreateTime": "",
|
||||
"SongName": "A Vague Idea",
|
||||
"SongLength": "124.644717",
|
||||
"SongLength": "114.630454",
|
||||
"SongAuthorName": "BEMANI Sound Team \"PHQUASE\"",
|
||||
"Bpm": "134",
|
||||
"SongPath": "316.ogg",
|
||||
"CreateTicks": 637848000000000000,
|
||||
"CreateTime": "637848000000000000",
|
||||
"EditorVersion": "1.3.2",
|
||||
"OstId": 0,
|
||||
"LevelAuthorName": "https://github.com/thomasasfk/drs2dd",
|
||||
"SongPreviewSection": 0,
|
||||
"Bpm": "134",
|
||||
"SongPath": "00316clip1.ogg",
|
||||
"OstName": null,
|
||||
"CoverPath": "jk_00316_b.png",
|
||||
"CoverPath": "316.png",
|
||||
"DDVR_Easy": null,
|
||||
"DDVR_Normal": null,
|
||||
"DDVR_Hard": null,
|
||||
"DRS_Easy": "316_difficulty_1b_no_blocks.json",
|
||||
"DRS_Normal": "316_difficulty_1a_no_blocks.json",
|
||||
"DRS_Hard": "316_difficulty_1b.json",
|
||||
"DRS_Expert": "316_difficulty_1a.json",
|
||||
"DRS_Easy": "difficulty_1b_blockless.json",
|
||||
"DRS_Normal": "difficulty_1a_blockless.json",
|
||||
"DRS_Hard": "difficulty_1b.json",
|
||||
"DRS_Expert": "difficulty_1a.json",
|
||||
"DRS_Master": null,
|
||||
"DRS_ACE": null,
|
||||
"DDVR_Env": null,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user