歌曲信息(songlist)格式:修订间差异

来自Arcaea中文维基
(撤销Sccrea讨论)的版本48338)
标签撤销
(未显示22个用户的84个中间版本)
第1行: 第1行:
*<s>等一下 们先让我 一下apk</s>
<!--如果你通过查看源代码发现了这里,那么恭喜 发现了查 内容的第二种方法。
-->{{技术型}}
__NOINDEX__


{{Usercheck}}
{{特殊页面导航}}
*'''本页保持孤立!'''
*'''本页保持孤立!'''


==在开始阅读之前==
==在开始阅读之前==
===总论===
===总论===
歌曲信息都包含在一个叫做songlist的文件里.位置为\assets\songs


  这个 文件是关于更改歌曲信息的,如果想更改 谱面本身, 请移步[[谱面格式]]
  文件是关于更改歌曲信息的
 
关于 谱面本身 的格式, 请移步[[谱面格式]]


  如果想更改 关于解歌条件的部分, 请移步[[解锁条件(unlocks)格式]]
 关于解歌条件的部分 请移步[[解锁条件(unlocks)格式]]


  如果想更改 曲包相关内容请移步[[曲包信息(packlist)格式]]
  关于 曲包相关内容 请移步[[曲包信息(packlist)格式]]


===阅读总论===
===阅读总论===
songlist 是按照<s>类似Java语言</s>编写的, 有大量花括号与中括号,中间 回车与制表符除了 整理版面 之外没有 任何 意义.''' 总之不该你 改的 东西你 要改 就行 '''.
 
本文件名为songlist,包含了除教程及愚人节外的全部歌曲相关信息。
 
本文件在安卓apk安装包里的位置为 /assets/songs/songlist ,在苹果ipa安装包内位置为 /Payload/Arc-mobile.app/songs/songlist
 
本文件为json文档, 有大量花括号与中括号 ,格式要求较为严格,最后一个字段后不能出现多余 逗号。本文件用两空格缩进 整理版面
 
''' 任何 对本文件的修改都会导致游戏程序崩溃,这是因为程序中对本文件有哈希校验。'''
 
'' 事实上,可通过修 特定 函数,使程序在哈希校验失败时 调用结束进程的函数,从而达到修改songlist等文件的目的。''
 
'''从这里开始 会涉及到危险操作了,请为自己的 为负责!'''
 
<!-- 事实上,游戏程序中所判断的校验值是将文件的MD5复制一份(即"MD5MD5")然后将该字符串再次求MD5校验值得到的。
例如,对于Arcaea 3.5.3c版本,songlist文件的MD5校验码是a9e8ddcaaf2daa73fc0ba91cfb371f70
则复制一份并拼到原始MD5后面,得到"a9e8ddcaaf2daa73fc0ba91cfb371f70a9e8ddcaaf2daa73fc0ba91cfb371f70"
对该字符串求MD5校验值,可得到"942951c9a95cc3a3694c8c8c27f5293a"
而942951c9a95cc3a3694c8c8c27f5293a正是游戏程序中所使用的校验值
因此直接修改游戏程序中为songlist文件修改后所得到的校验值也可以,但比较麻烦(每次修改songlist都需要改一次程序)
-->


==代码解析==
==代码解析==
===框架===
===框架===
歌曲信息在文件里总体排列成这样


{| class="wikitable"
本文件总体框架如下。每一首 歌曲 息互不干扰。
|-
| <nowiki>{"songs": [{ 歌曲信 息1},{歌曲信息2},……,{歌曲信息n}]}</nowiki>
|}


可见歌曲信息之间的互不干扰性, 而且它告诉我们'''加入自制谱(不是替换官谱)'''是可能的
<syntaxhighlight lang="json">
{
  "songs": [
   {
    // song 1
   },
   {
    // song 2
   } ...
  ]
}
</syntaxhighlight>


===细节解析===
===细节解析===


 以一 复杂 的为 ( )
*数据格式:
**string -- 字符串 例:<code>"brandnewworld"</code>
**int -- 整数 例:<code>54401</code>
**boolean -- 布尔值 例:<code>true</code>(是), <code>false</code>(否)
 
*localized字段可选属性:
**"en" -- 英文 '''如果其他语言的字段不存在,默认使用此字段'''
**"ja" -- 日文
**"ko" -- 韩文
**"zh-Hans" -- 简体中文
**"zh-Hant" -- 繁体中文
 
 以 下为歌曲信息最完整的格式。
''(歌曲信息中每 项的填写可以乱序,没有顺序要求)''
 
{
  "idx": int,
  "id": string (ASCII),
  "title_localized": {
   "en": string ...
  },
  "artist": string,
  "artist_localized": {
   "en": string ...
  },
  "bpm": string,
  "bpm_base": float,
  "set": string,
  "purchase": string,
  "audioPreview": int,
  "audioPreviewEnd": int,
  "side": int (0, 1, 2),
  "bg": string (ASCII),
  "bg_inverse": string (ASCII)
  "bg_daynight": {
    "day": string (ASCII),
    "night": string (ASCII)
  },
  "date": int (timestamp),
  "version": string,
  "world_unlock": boolean,
  "remote_dl": boolean,
  "byd_local_unlock": boolean,
  "songlist_hidden": boolean,
  "no_pp": boolean,
  "source_localized": {
   "en": string ...
  },
  "source_copyright": string,
   "no_stream": boolean,
  "jacket_localized": {
   "ja": boolean ...
  },
  "difficulties": [
   {
    "ratingClass": int (0, 1, 2, 3),
    "chartDesigner": string,
    "jacketDesigner": string,
    "rating": int,
    "ratingPlus": boolean,
    "plusFingers": boolean,
    "title_localized": {
     "en": string ...
    },
    "jacket_night": string (ASCII),
    "jacketOverride": boolean,
    "audioOverride": boolean,
    "hidden_until_unlocked": boolean,
    "bg": string (ASCII),
    "world_unlock": boolean,
    "date": int (timestamp),
    "version": string (ASCII)
   } ...
  ]
}
 
====歌曲信息====
 
注:以下'''必需字段'''指官方songlist文件中每首歌都有的字段,删除后是否会导致游戏崩溃并未经测试。
 
{
  "idx": int,
   // 游戏内"Link Play"功能用来判断各玩家歌曲解锁情况时用的唯一标识符 '''必需字段'''
 
  "id": string (ASCII),
   // 游戏程序识别歌曲的唯一ID '''只能使用ASCII字符''' '''必需字段'''
 
  "title_localized": {
   "en": string,
   "ja": string ...
  },// 游戏内显示的曲名,可分语言设定 '''必需字段'''
 
  "artist": string,
  "artist_localized": {
   "en": string ...
  },// 游戏内显示的作曲者,可分语言设定。可只填artist,默认为英语 '''必需字段'''
 
  "bpm": string,
   // 游戏内显示的BPM '''必需字段'''<!--一些额外的曲目信息可以放在此字符串内-->
 
  "bpm_base": float,
   // 基准BPM,实际游玩速度为设置的音符流速除以"bpm_base"再乘以谱面Timing bpm '''必需字段'''
 
  "set": string,
   // 本曲所属曲包id,参考[[曲包信息(packlist)格式]] '''必需字段'''
 
  "purchase": string,
   // 本曲购买方式,曲包曲填所属曲包名,单曲填本曲"id",无需购买则留空 '''必需字段'''
 
  "audioPreview": int,
  "audioPreviewEnd": int,
   // 本曲预览的开始与结束时间,单位为毫秒 '''必需字段'''
 
  "side": int (0, 1, 2),
   // 本曲属性,0为光芒侧,1为纷争侧,2为消色之侧 '''必需字段'''
 
  "bg": string (ASCII),
   // 本曲背景文件名,背景jpg储存在/assets/img/bg目录中,留空即为默认背景(base_light(光芒侧)或base_conflict(纷争侧)) '''只能使用ASCII字符''' '''必需字段'''
 
  "bg_inverse": string (ASCII),
   // 本曲反转背景文件名,性质同bg,是使用[[光 & 对立(Reunion)]]时更换的背景。可以删去(相对的会使其无法触发)。'''只能使用ASCII字符'''
 
  "bg_daynight": {
    "day": string (ASCII),
    "night": string (ASCII)
  },// 自定义白天及夜晚显示的不同背景,参考 [[群愿]] 的技能 '''只能使用ASCII字符'''
 
  "date": int (timestamp),
   // 本曲加入时刻的10位时间戳 '''必需字段'''
 
  "version": string,
   // 本曲加入时的游戏版本,用于歌曲分类 '''必需字段'''
 
  "world_unlock": boolean,
   // 本曲是否需要世界模式解锁,不填默认为false
 
  "remote_dl": boolean,
   // 本曲是否需要从服务器下载,不填默认为false
 
  "byd_local_unlock": boolean,
   // 本曲Beyond难度是否在本地解锁。应与"world_unlock"相反
 
  "songlist_hidden": boolean,
   // 本曲解锁前是否在歌曲界面中隐藏,不填默认为false
 
  "no_pp": boolean,
   // 标记lowiro是否拥有本曲的版权。本字段对游戏没有影响
 
  "source_localized": {
   "en": string ...
  },// 本曲出处,可分语言设定。歌曲界面中选择歌曲后,歌曲下方会显示 from 「"source_localized"」(其他语言)/来自 《》(中文)
 
  "source_copyright": string,
   // 本曲版权方,仅当"source_localized"不为空时显示在 from 「」之后(以"source_copyright"显示(注意版权标©也在source_copyright的值中))
 
  "no_stream": boolean,
   // 本曲是否能够在直播模式中游玩(目前出现此标识的值均为true)
 
  "jacket_localized": {
   "ja": boolean ...
  },// 自定义本曲封面,可分语言设定。封面文件名为base_ja.jpg,base_ja_256.jpg(即在base后加“_语言代码”)
}
 
====难度信息====
 
难度谱面信息框架如下:
 
  "difficulties": [
   {
    // difficulty PST
   } ...
  ]
 
各难度代码结构如下:
 
   {
    "ratingClass": int (0, 1, 2, 3),
     // 本段代码所定义难度。0 -- PST, 1 -- PRS, 2 -- FTR, 3 -- BYD '''必需字段'''
   
    "chartDesigner": string,
     // 本难度谱师名 '''必需字段'''
   
    "jacketDesigner": string,
     // 本难度封面绘师 '''必需字段'''
   
    "rating": int,
     // 本难度等级。3.0更新前1-9对应本身,10对应9+,11对应10;3.0更新后均对应本身。0均对应“?” '''必需字段'''
   
    "ratingPlus": boolean,
     // 本难度等级是否有“+”,不填默认为false ''3.0新增''
 
    "plusFingers": boolean,
     // 本难度是否有多指操作,实际并无作用<ref>官方songlist中 后含有本参数的谱面是[[Ether Strike]] FTR、[[Fracture Ray]] PRS&FTR、[[Grievous Lady]] PRS&FTR、[[DataErr0r]] FTR;[[World Vanquisher]]及以后一些谱面也出现了多押但没有使用本参数</ref>
       
    "title_localized": {
       "en": string,
       "ja": string ...
     },// 本难度显示的曲名,可分语言设定
 
    "artist": string,
     // 本难度显示的作曲者
 
    "bpm": string,
     // 本难度显示的BPM
 
    "bpm_base": float,
     // 本难度的基准BPM
 
    "jacket_night": string (ASCII),
     // 本难度夜晚时显示 封面文件名 '''只能使用ASCII字符'''
   
    "jacketOverride": boolean,
     // 本难度是否有根据难度替换的封面。封面文件名为0.jpg,0_256.jpg(即 "ratingClass"),不填默认为false
   
    "audioOverride": boolean,
     // 本难度是否有根据难度替换的音频文件。音频文件名为3.ogg(即为"ratingClass"),不填默认为false
   
    "hidden_until_unlocked": boolean,
     // 本难度解锁前是否歌曲界面中隐藏,不填默认为false
   
    "bg": string (ASCII),
     // 本难度的背景,对于安卓apk,背景jpg储存在/assets/img/bg目录中;对于苹果ipa,背景jpg储存在/Payload/Arc-mobile.app/img/bg中 '''只能使用ASCII字符'''
 
    "bg_inverse": string (ASCII),
     // 本难度使用的反转背景,性质同bg,是使用[[光 & 对立(Reunion)]]时更换的背景
   
    "world_unlock": boolean,
     // 本难度是否需要世界模式解锁,不填默认为false


{| class="wikitable"
    "date": int (timestamp),
|-
      // 本难度加入时刻的10位时间戳(即单位为秒的UNIX时间戳)
| {
 
    "id": "grievouslady",
    "version": string
    "title_localized": {
      // 本曲加入时的游戏版本,用于歌曲
      "en": "Grievous Lady"
   }
    },
{{reflist}}
    "artist": "Team Grimoire vs Laur",
{{Usercheck-end}}
    "bpm": "210",
    "bpm_base": 210,
    "set": "yugamu",
    "purchase": "yugamu",
    "audioPreview": 0,
    "audioPreviewEnd": 18285,
    "side": 1,
    "bg": "grievouslady",
    "date": 1509667208,
    "difficulties": [
      {
      "ratingClass": 0,
      "chartDesigner": "迷路第一層",
      "jacketDesigner": "シエラ",
      "rating": 6,
      "plusFingers": 0,
      "story": {
       "en": "Perhaps she should have worried, because her heart was suddenly in pain.\n\nShe drew back, covered her mouth, and her eyes went wide in confusion. She had been standing on the floor of a gigantic and bitter maze that doubled as a tower, but she now began to fall to her knees. Before she hit the ground, the structure began to break and fall first.\n\nThe memories of sorrowful days that she had gathered came around her like a cloak, the tower's memories turned from a falling slow rain into a downpour. She and the maze fell like stones, and although she should have been terrified to drop so far and so fast, all she could feel was confusion.\n\nShe splashed down into a sea of the fragmented happiness of other worlds. The waves she and the crashing labyrinth caused were immense. Glass pushed against glass in a way that could be described as both ugly and beautiful, and she knelt at the center of that storm.|She was confused because she was hurting. Everything hurt. Her heart was bursting. The cloak of memories that she'd collected turned into a grotesque sphere and surrounded her. The world of white disappeared from her vision, leaving only horrible things. Heaving, sweating, and trembling, she looked into the glass, into the Arcaea, deeply. And as she came to realize that her heart was breaking,\n\nThat her sanity was breaking,\n\nThe memory of the end of the world that she'd seen earlier slowly drifted into view.",
       "ja": "予測できたことだったのかもしれない。彼女の胸は突然痛みだした。\n\n彼女は後ずさりして、口を覆い、その目は混乱に大きく見開かれていた。\n彼女は重なり塔となった巨大な苦しみの迷路の中に立っていた。\nしかし彼女は今にも膝から崩れ落ちようとしていた。\n膝が地面へと着く前に、その構造物は壊れて崩れ始めた。\n\n彼女が集めてきた悲しい日々の記憶がマントのように彼女を覆い、\n塔の記憶はゆっくりと降る雨から豪雨へと変わった。\n彼女とその迷路は石のように落ちた。\nそれには恐ろしい高さと速さが伴っていたが、\nその時彼女が感じることのできたものは混乱だけだった。|彼女は何処かの幸せの欠片で溢れる海へと飛び込んだ。\n彼女と崩れ落ちた迷宮が引き起こした波は計り知れないものだった。\nガラスとガラスが醜いとも美しいとも形容できる様子でぶつかり合い、\n彼女はその嵐の中心にひざまずいていた。\n\n彼女は自らの痛みに混乱していた。全てが痛い。心臓が破裂しそうだった。\n彼女が集めた記憶のマントは、不気味な球体となって彼女を囲んだ。\n白の世界は彼女の視界から姿を消し、ここに残っているのは恐ろしいものだけだ。\n呼吸は荒くなり、汗が滲み、体は震えていた。\n彼女はガラスの中を、アーケアの中を、深く覗き込んだ。\nそして彼女は気が付いた。自 の心が壊れていたこと。\n\n自分の正気が失われていたこと。\n\nさっき見た世界の終わりの記憶が、ゆっくりと視界を漂った。\n"
      }
     },
     {
      "ratingClass": 1,
      "chartDesigner": "迷路第二層",
      "jacketDesigner": "シエラ",
      "rating": 9,
      "plusFingers": 1,
      "story": {
       "en": "The girl had felt many emotions since her waking into the white and ruined world. Mostly, she'd felt anger, but she'd been able to turn that anger into a strange sort of hope. True, she didn't have much of a plan. In fact, she was only walking forward because she believed at the end of her steps there would be something good. She had hope. She was certain that this chaos was leading into light. She was certain that the torments she was facing, that the horrors she was holding, could be completely shattered.\n\nYes, she was emotional. She felt so strongly that when faced with the idea that no, in fact, nothing had a purpose...she began to suffer.\n\nThe cruelest fate is to have hope and see it crushed before your eyes. And so the girl sat on her knees in a malformed circle of death, looking at a world coming to its end. This was the first time she had felt the emotion of sadness, and it was quickly turning into despair.The world of Arcaea was a pointless world. It was the manifestation of worlds gone. It had no substance, only the reflections of such. Even the glowing and joyful memories she had sometimes encountered on her way were still only memories of the past. Like night comes after day, they had to have led into the end she now saw spinning slowly in the air before her. Her eyes welled with tears.\n\nShe had felt so much since waking up.|She'd felt joy. Joy left her.\n\nShe'd felt felt fear. Fear left her.\n\nAnger left her.\n\nHope left her.\n\nEven sadness and despair now left her.\n\nHer eyes went dark and she could feel resonance with the glass. The shell of memories around her began to crack and split open. She emerged from it and stood in the blinding light, and couldn't feel anything at all.",
       "ja": "彼女はこの白い退廃した世界に足を踏み入れてからというもの、沢山の感情を覚えてきた。\n怒りを覚えても、彼女はその怒りを少し変わった希望のようなものに変えることができた。\n確かに、彼女にはあまり計画がなかった。\n実際、彼女はただ前へと歩き進んでいただけに過ぎなかった。\nきっとその終わりには何か良いものがあると信じていたのだ。\n彼女には希望があった。この混沌の先には光があると信じていた。\n遭遇した苦痛も、抱える恐怖も、きっと粉々にできる。\n\n確かに、彼女は感情的だった。そう、本当は、どれにも目的なんて無い・・・\nその考えが頭をよぎった時、彼女は強い苦しみを覚え始めた。\n\nもっとも残酷な運命とは、希望を持ち、それを目の前で潰されることだ。\nそして奇妙な形をした死の環の中でひざまずく少女は、世界が終わりを迎えるのを見ていた。\nこれは初めて彼女が悲しみという感情を覚えた瞬間だった。\nそしてそれは、一瞬にして絶望へと変わった。|アーケアの世界に、意味などなかったのだ。ここは、死んだ世界の姿だったのだ。\nここには物質はなく、あるのは回想のようなものだけ。\nここに来るまでに時々見かけた、光り輝く楽しい記憶も、過去の記憶に過ぎなかったのだ。\n昼の次に夜が来るように、そんな記憶も終わりへと向かう。\n彼女は今、目の前でそれが宙でゆっくりと回るのを見ていた。\n彼女の目は涙で溢れていた。\n\n目覚めてから、沢山のことを感じてきた。\n楽しさ。今はもうない。\n恐怖。今はもうない。\n怒りももうない。\n希望もない。\n悲しみや絶望でさえ何処かへ行ってしまった。\n\n目は暗くなり、彼女はガラスと心が共鳴するのを感じた。\n彼女を囲む記憶の殻にひびが入り割れ始めた。\n彼女はそこから抜け出し眩い光の中に立った。しかし何も感じられなかった。\n"
      }
     },
     {
      "ratingClass": 2,
      "chartDesigner": "迷路深層",
      "jacketDesigner": "シエラ",
      "rating": 11,
      "plusFingers": 1,
      "story": {
       "en": "Like an ocean stained with oil, the memories of a cursed labyrinth and the memories she had brought with her all fell and muddled into the soothing glass around her. Most of them churned into a gray mass, some would suddenly jut up from the ground like spikes. She went still, and slowly looked over every shard, just...counting them. Even when memories came shooting up sharply near her eyes, she continued to count.\n\nEventually she lifted a finger, beckoning some of the shards toward her. And, with a simple thought, the fragments came together in the shape of a fragile butterfly. She commanded it into the sky, to reflect the world of white, and when it came down again to tell her what it had seen, with a simple thought she slowly tore off each of its wings, and let it fall into nothing. Then, she walked forward from the corrupted sea, willing each pillar of lost time that entered her path to explode and shatter.|---\n\nTime passed. She changed.\n\nShe no longer sought to collect memories. She walked through the world mostly absently. She discovered things about it and about herself, but she had no ambitions.\n\nNow she walked beside an old and crumbling building, twirling a parasol she had found in the ruins some day. Silently, a creature formed of glass reflecting bitter days glided down toward her from the sky. It resembled a glistening and jagged crow, and it was something she considered no more than a tool. After that day at the now-fallen tower, she'd become more in-tune with the chaotic Arcaea and was able call upon things like this. In its own way, it whispered to her of places beyond her reach in the blinding white world. Glaring at it, she had it burst and fall apart, and she moved on.|These crows of hers sickened her with news. The world was empty, that's all they said. That she knew. She'd never find anyone else here.\n\nShe wanted to. She needed to. But, it was not because she hoped to have someone to share her fate with.\n\nShe needed to let this frustration out on something alive. She needed someone to hurt.",
       "ja": "\n油に汚れた海のように、呪われた迷宮の記憶と彼女が連れてきた記憶は、\n地に落ち溶け合い、穏やかなガラスとなって辺りに散らばっていた。\nほとんどは灰色の塊となり、突然地面から針のように突き出るものもあった。\n彼女はただ静かに、ゆっくりとその欠片達を見渡した。ただ…数えていた。\n記憶が彼女の目の近くまで針を突き刺してきても、数えることをやめなかった。\n\nしばらくすると彼女は手を少し上げ、破片をいくつか彼女のもとへと招き寄せた。\nすると、単純な考え一つでその破片達は一つになり、もろい蝶の形となった。\n彼女はそれに空へと向かい、白の世界を映すようにと命じた。\nそしてそれが見てきたものを伝えるため彼女のもとへ戻ってくると、\n彼女の考え一つでそれはゆっくりと羽を落とし、無へと崩れ落ちた。\nそうして彼女は崩壊した海へ向かって歩き出した。\n失われた時間の柱が道を阻もうものなら、爆破して粉々にするつもりでいた。|---|時は流れた。彼女は変わった。\n\n彼女はもう記憶を集めてはいなかった。ほとんど空虚な心で、世界を歩いていた。\n物事や自分についても分かったことがあった。しかし彼女には意思がなかったのだ。\n\n彼女は古くて崩れかかった建物の傍を歩き、ある日廃墟で見つけた傘を回している。\n静かに、苦しい日々を映すガラスで形作られた生き物が空から彼女に向かって滑り落ちてきた。\nそれはキラキラとした、歪な形のカラスのようだった。彼女にとっては、道具以上の何でもなかったが。\nあの崩れ行く塔での一日以来、彼女はこの混沌のアーケアとうまく調和できるようになっていた。\nだからこういったものも呼び寄せることができるのだ。\nそうしてそれは独自の方法で、眩く白い世界の、彼女の手の届かない場所について告げた。\n彼女が睨むと、それは爆発してバラバラになった。彼女は歩き続けた。|カラスの知らせにうんざりしていた。この世界は空だ。\n皆そう言うのだ。彼女も知っていた。ここで他の誰かを見つけたことがなかった。\n\n見つけたかった。見つける必要があった。運命を共有する誰かが必要なのではない。\n\nこの葛藤を生きている何かにぶつける必要があったのだ。彼女には、傷つける相手が必要だった。\n"
      }
     }
    ]
   }
|}

2023年12月31日 (日) 11:43的版本


在您查看以下内容之前,我们需要您回答我们提供的问题。
ABA型的三字符songid是?
已确认。

  • 本页保持孤立!

在开始阅读之前

总论

本文件是关于更改歌曲信息的。

关于谱面本身的格式,请移步谱面格式

关于解歌条件的部分,请移步解锁条件(unlocks)格式

关于曲包相关内容,请移步曲包信息(packlist)格式

阅读总论

本文件名为songlist,包含了除教程及愚人节外的全部歌曲相关信息。

本文件在安卓apk安装包里的位置为 /assets/songs/songlist,在苹果ipa安装包内位置为 /Payload/Arc-mobile.app/songs/songlist

本文件为json文档,有大量花括号与中括号,格式要求较为严格,最后一个字段后不能出现多余的逗号。本文件用两空格缩进整理版面。

任何对本文件的修改都会导致游戏程序崩溃,这是因为程序中对本文件有哈希校验。

事实上,可通过修改特定的函数,使程序在哈希校验失败时不调用结束进程的函数,从而达到修改songlist等文件的目的。

从这里开始就会涉及到危险操作了,请为自己的行为负责!


代码解析

框架

本文件总体框架如下。每一首歌曲的信息互不干扰。

{
   "songs": [
     {
       // song 1
     },
     {
       // song 2
     } ...
   ]
}

细节解析

  • 数据格式:
    • string -- 字符串 例:"brandnewworld"
    • int -- 整数 例:54401
    • boolean -- 布尔值 例:true(是), false(否)
  • localized字段可选属性:
    • "en" -- 英文 如果其他语言的字段不存在,默认使用此字段
    • "ja" -- 日文
    • "ko" -- 韩文
    • "zh-Hans" -- 简体中文
    • "zh-Hant" -- 繁体中文

以下为歌曲信息最完整的格式。 (歌曲信息中每一项的填写可以乱序,没有顺序要求)

{
  "idx": int,
  "id": string (ASCII),
  "title_localized": {
    "en": string ...
  },
  "artist": string,
  "artist_localized": {
    "en": string ...
  },
  "bpm": string,
  "bpm_base": float,
  "set": string,
  "purchase": string,
  "audioPreview": int,
  "audioPreviewEnd": int,
  "side": int (0, 1, 2),
  "bg": string (ASCII),
  "bg_inverse": string (ASCII)
  "bg_daynight": {
      "day": string (ASCII),
      "night": string (ASCII)
  },
  "date": int (timestamp),
  "version": string,
  "world_unlock": boolean,
  "remote_dl": boolean,
  "byd_local_unlock": boolean,
  "songlist_hidden": boolean,
  "no_pp": boolean,
  "source_localized": {
    "en": string ...
  },
  "source_copyright": string,
   "no_stream": boolean,
  "jacket_localized": {
    "ja": boolean ...
  },
  "difficulties": [
    {
      "ratingClass": int (0, 1, 2, 3),
      "chartDesigner": string,
      "jacketDesigner": string,
      "rating": int,
      "ratingPlus": boolean,
      "plusFingers": boolean,
      "title_localized": {
        "en": string ...
      },
      "jacket_night": string (ASCII),
      "jacketOverride": boolean,
      "audioOverride": boolean,
      "hidden_until_unlocked": boolean,
      "bg": string (ASCII),
      "world_unlock": boolean,
      "date": int (timestamp),
      "version": string (ASCII)
    } ...
  ]
}

歌曲信息

注:以下必需字段指官方songlist文件中每首歌都有的字段,删除后是否会导致游戏崩溃并未经测试。

{
  "idx": int,
    // 游戏内"Link Play"功能用来判断各玩家歌曲解锁情况时用的唯一标识符 必需字段
  
  "id": string (ASCII),
    // 游戏程序识别歌曲的唯一ID 只能使用ASCII字符 必需字段
  
  "title_localized": {
    "en": string,
    "ja": string ...
  },// 游戏内显示的曲名,可分语言设定 必需字段
  
  "artist": string,
  "artist_localized": {
    "en": string ...
  },// 游戏内显示的作曲者,可分语言设定。可只填artist,默认为英语 必需字段
  
  "bpm": string,
    // 游戏内显示的BPM 必需字段
  
  "bpm_base": float,
    // 基准BPM,实际游玩速度为设置的音符流速除以"bpm_base"再乘以谱面Timing bpm 必需字段
  
  "set": string,
    // 本曲所属曲包id,参考曲包信息(packlist)格式 必需字段
  
  "purchase": string,
    // 本曲购买方式,曲包曲填所属曲包名,单曲填本曲"id",无需购买则留空 必需字段
  
  "audioPreview": int,
  "audioPreviewEnd": int,
    // 本曲预览的开始与结束时间,单位为毫秒 必需字段
  
  "side": int (0, 1, 2),
    // 本曲属性,0为光芒侧,1为纷争侧,2为消色之侧 必需字段
  
  "bg": string (ASCII),
    // 本曲背景文件名,背景jpg储存在/assets/img/bg目录中,留空即为默认背景(base_light(光芒侧)或base_conflict(纷争侧)) 只能使用ASCII字符 必需字段
  "bg_inverse": string (ASCII),
    // 本曲反转背景文件名,性质同bg,是使用光 & 对立(Reunion)时更换的背景。可以删去(相对的会使其无法触发)。只能使用ASCII字符
  
  "bg_daynight": {
      "day": string (ASCII),
      "night": string (ASCII)
  },// 自定义白天及夜晚显示的不同背景,参考 群愿 的技能 只能使用ASCII字符
  
  "date": int (timestamp),
    // 本曲加入时刻的10位时间戳 必需字段
  
  "version": string,
    // 本曲加入时的游戏版本,用于歌曲分类 必需字段
  
  "world_unlock": boolean,
    // 本曲是否需要世界模式解锁,不填默认为false
  
  "remote_dl": boolean,
    // 本曲是否需要从服务器下载,不填默认为false
  
  "byd_local_unlock": boolean,
    // 本曲Beyond难度是否在本地解锁。应与"world_unlock"相反
  
  "songlist_hidden": boolean,
    // 本曲解锁前是否在歌曲界面中隐藏,不填默认为false
  
  "no_pp": boolean,
    // 标记lowiro是否拥有本曲的版权。本字段对游戏没有影响
  
  "source_localized": {
    "en": string ...
  },// 本曲出处,可分语言设定。歌曲界面中选择歌曲后,歌曲下方会显示 from 「"source_localized"」(其他语言)/来自 《》(中文)
  
  "source_copyright": string,
    // 本曲版权方,仅当"source_localized"不为空时显示在 from 「」之后(以"source_copyright"显示(注意版权标©也在source_copyright的值中))
  
  "no_stream": boolean,
    // 本曲是否能够在直播模式中游玩(目前出现此标识的值均为true)
  
  "jacket_localized": {
    "ja": boolean ...
  },// 自定义本曲封面,可分语言设定。封面文件名为base_ja.jpg,base_ja_256.jpg(即在base后加“_语言代码”)
}

难度信息

难度谱面信息框架如下:

  "difficulties": [
    {
      // difficulty PST
    } ...
  ]

各难度代码结构如下:

    {
      "ratingClass": int (0, 1, 2, 3),
        // 本段代码所定义难度。0 -- PST, 1 -- PRS, 2 -- FTR, 3 -- BYD 必需字段
      
      "chartDesigner": string,
        // 本难度谱师名 必需字段
      
      "jacketDesigner": string, 
        // 本难度封面绘师 必需字段
      
      "rating": int,
        // 本难度等级。3.0更新前1-9对应本身,10对应9+,11对应10;3.0更新后均对应本身。0均对应“?” 必需字段
      
      "ratingPlus": boolean,
        // 本难度等级是否有“+”,不填默认为false 3.0新增
      "plusFingers": boolean,
        // 本难度是否有多指操作,实际并无作用[1]
             
      "title_localized": {
           "en": string,
           "ja": string ...
       },// 本难度显示的曲名,可分语言设定
      "artist": string,
        // 本难度显示的作曲者
  
      "bpm": string,
        // 本难度显示的BPM
  
      "bpm_base": float,
        // 本难度的基准BPM
      "jacket_night": string (ASCII),
        // 本难度夜晚时显示的封面文件名 只能使用ASCII字符
      
      "jacketOverride": boolean,
        // 本难度是否有根据难度替换的封面。封面文件名为0.jpg,0_256.jpg(即为"ratingClass"),不填默认为false
      
      "audioOverride": boolean,
        // 本难度是否有根据难度替换的音频文件。音频文件名为3.ogg(即为"ratingClass"),不填默认为false
      
      "hidden_until_unlocked": boolean,
        // 本难度解锁前是否歌曲界面中隐藏,不填默认为false
      
      "bg": string (ASCII),
        // 本难度的背景,对于安卓apk,背景jpg储存在/assets/img/bg目录中;对于苹果ipa,背景jpg储存在/Payload/Arc-mobile.app/img/bg中 只能使用ASCII字符
      "bg_inverse": string (ASCII),
        // 本难度使用的反转背景,性质同bg,是使用光 & 对立(Reunion)时更换的背景
      
      "world_unlock": boolean,
        // 本难度是否需要世界模式解锁,不填默认为false
      "date": int (timestamp),
       // 本难度加入时刻的10位时间戳(即单位为秒的UNIX时间戳)
  
      "version": string
       // 本曲加入时的游戏版本,用于歌曲分类
    }
  1. 官方songlist中最后含有本参数的谱面是Ether Strike FTR、Fracture Ray PRS&FTR、Grievous Lady PRS&FTR、DataErr0r FTR;World Vanquisher及以后一些谱面也出现了多押但没有使用本参数