add charts from SDVX Konaste

This commit is contained in:
Christopher Cooper
2022-02-06 00:47:53 -08:00
parent f0d0f77fb5
commit 2e2021e45f
6 changed files with 4016 additions and 104 deletions
File diff suppressed because it is too large Load Diff
+559
View File
@@ -18749,6 +18749,19 @@
],
"title": "AXION"
},
{
"altTitles": [],
"artist": "ビートまりお(COOL&CREATE)",
"data": {
"displayVersion": "exceed"
},
"id": 1477,
"searchTerms": [
"destined_beatmario",
"ディスティンド マリオネット"
],
"title": "Destined Marionette"
},
{
"altTitles": [],
"artist": "paraoka",
@@ -19087,6 +19100,19 @@
],
"title": "Blue Forest (Prog Keys Remix)"
},
{
"altTitles": [],
"artist": "#EmoCosine",
"data": {
"displayVersion": "exceed"
},
"id": 1515,
"searchTerms": [
"clochermx_emocosine",
"エモクロッシュ"
],
"title": "#EmoCloche"
},
{
"altTitles": [],
"artist": "coTatsu",
@@ -19139,6 +19165,19 @@
],
"title": "Re:Elemental Creation"
},
{
"altTitles": [],
"artist": "Yuta Imai",
"data": {
"displayVersion": "exceed"
},
"id": 1522,
"searchTerms": [
"emeraldasrmx_yutaimai",
"エメラルダスユウタイマイミックス"
],
"title": "EMERALDAS (Yuta Imai Remix)"
},
{
"altTitles": [],
"artist": "bansou",
@@ -19178,6 +19217,32 @@
],
"title": "POSSESSION(Gowrock Remix)"
},
{
"altTitles": [],
"artist": "Aoi",
"data": {
"displayVersion": "exceed"
},
"id": 1530,
"searchTerms": [
"posessionrmx_aoi",
"ポゼッションアオイキューイーディーリミックス"
],
"title": "POSSESSION (Aoi Q.E.D. RMX)"
},
{
"altTitles": [],
"artist": "ろひ",
"data": {
"displayVersion": "exceed"
},
"id": 1531,
"searchTerms": [
"scarsoffaunarmx_rohi",
"スカーズオブファウナロヒリミックス"
],
"title": "Scars of FAUNA(ろひ Remix)"
},
{
"altTitles": [],
"artist": "HOUJIROU feat. 駄々子",
@@ -19217,6 +19282,32 @@
],
"title": "Valanga(polysha Remix)"
},
{
"altTitles": [],
"artist": "Hyuji feat. LIQU@。& TadashiYamamoto",
"data": {
"displayVersion": "exceed"
},
"id": 1537,
"searchTerms": [
"nascarmx_hyuji",
"ナスカノオカハイエナジーリミックス"
],
"title": "ナスカの丘 (Hi-NRG Remix)"
},
{
"altTitles": [],
"artist": "naka3",
"data": {
"displayVersion": "exceed"
},
"id": 1538,
"searchTerms": [
"nanahoshirmx_nakasan",
"ナナホシラブリーバブリーパーティーミックス"
],
"title": "ナナホシ(lovely bubbly party mix!)"
},
{
"altTitles": [],
"artist": "モリモリあつし",
@@ -19336,6 +19427,19 @@
],
"title": "トマヨイ"
},
{
"altTitles": [],
"artist": "かめりあ",
"data": {
"displayVersion": "vivid"
},
"id": 1551,
"searchTerms": [
"psychoheroes_kameria",
"サイコヒーローズ"
],
"title": "PSYCHO+HEROES"
},
{
"altTitles": [],
"artist": "MYUKKE.",
@@ -19453,6 +19557,19 @@
],
"title": "月々紅花"
},
{
"altTitles": [],
"artist": "fZy",
"data": {
"displayVersion": "vivid"
},
"id": 1561,
"searchTerms": [
"yoursoulismine_fzy",
"ユアソウルイズマイン"
],
"title": "Your SOUL Is Mine"
},
{
"altTitles": [
"龕omet popcorn"
@@ -19494,6 +19611,19 @@
],
"title": "Sparkling Laser Beam"
},
{
"altTitles": [],
"artist": "CielArc",
"data": {
"displayVersion": "vivid"
},
"id": 1565,
"searchTerms": [
"screaming_cielarc",
"スクリーミング"
],
"title": "Screaming!!"
},
{
"altTitles": [],
"artist": "立秋 feat.ちょこ",
@@ -19546,6 +19676,19 @@
],
"title": "Dooooope"
},
{
"altTitles": [],
"artist": "BlackY feat. Risa Yuzuki",
"data": {
"displayVersion": "vivid"
},
"id": 1570,
"searchTerms": [
"gimmedreamin_blacky",
"ギミードリーミン"
],
"title": "Gimme dreamin'"
},
{
"altTitles": [],
"artist": "MisomyL",
@@ -19559,6 +19702,19 @@
],
"title": "Ring!Run!Nyan!!"
},
{
"altTitles": [],
"artist": "めと(Metomate)",
"data": {
"displayVersion": "vivid"
},
"id": 1572,
"searchTerms": [
"kogetsumurakumo_metomate",
"コゲツムラクモニシズム"
],
"title": "孤月群雲に沈む"
},
{
"altTitles": [],
"artist": "あるふぁ feat. とおる",
@@ -20410,6 +20566,84 @@
],
"title": "METATRON"
},
{
"altTitles": [],
"artist": "削除 feat. Nikki Simmons",
"data": {
"displayVersion": "exceed"
},
"id": 1647,
"searchTerms": [
"destr0yer_sakujo",
"デストロイヤー"
],
"title": "Destr0yer"
},
{
"altTitles": [],
"artist": "xi",
"data": {
"displayVersion": "exceed"
},
"id": 1648,
"searchTerms": [
"badelixir_xi",
"バッドエリクサー"
],
"title": "Bad Elixir"
},
{
"altTitles": [],
"artist": "森羅万象",
"data": {
"displayVersion": "exceed"
},
"id": 1649,
"searchTerms": [
"kiramekiinokori_sinrabansyou",
"キラメキイノコリダイセンソウ"
],
"title": "キラメキ居残り大戦争"
},
{
"altTitles": [],
"artist": "ビートまりお(COOL&CREATE)",
"data": {
"displayVersion": "exceed"
},
"id": 1650,
"searchTerms": [
"monmonsimasyo_beatmario",
"モンモンシマショ"
],
"title": "門門しましょ"
},
{
"altTitles": [],
"artist": "暁Records",
"data": {
"displayVersion": "exceed"
},
"id": 1652,
"searchTerms": [
"warning_akatsuki_records",
"ワーニングワーニングワーニング"
],
"title": "WARNING×WARNING×WARNING"
},
{
"altTitles": [],
"artist": "暁Records",
"data": {
"displayVersion": "exceed"
},
"id": 1653,
"searchTerms": [
"trancedance_akatsuki_records",
"トランスダンスアナーキー"
],
"title": "トランスダンスアナーキー"
},
{
"altTitles": [],
"artist": "RoughSketch x CANVAS feat. Quimär",
@@ -20552,5 +20786,330 @@
"シンフォニックティアー"
],
"title": "Symphonic Tear"
},
{
"altTitles": [],
"artist": "nonomori feat. 亜沙美",
"data": {
"displayVersion": "exceed"
},
"id": 1675,
"searchTerms": [
"fuduki_nonomori",
"フヅキ"
],
"title": "文月"
},
{
"altTitles": [],
"artist": "Yu_Asahina",
"data": {
"displayVersion": "exceed"
},
"id": 1681,
"searchTerms": [
"theclownof24_yuasahina",
"ザクラウンオブトゥエンティーフォーステイヤーズ"
],
"title": "The Clown of 24stairs"
},
{
"altTitles": [],
"artist": "Yooh",
"data": {
"displayVersion": "exceed"
},
"id": 1686,
"searchTerms": [
"enterthefire_yooh",
"エンターザファイヤー"
],
"title": "Enter The Fire"
},
{
"altTitles": [],
"artist": "kuro",
"data": {
"displayVersion": "exceed"
},
"id": 1712,
"searchTerms": [
"innocentazure_kuro",
"イノセントアジュール"
],
"title": "Innocent Azure"
},
{
"altTitles": [],
"artist": "しーけー",
"data": {
"displayVersion": "exceed"
},
"id": 1713,
"searchTerms": [
"souhaitbleu_siikee",
"スウェブルー"
],
"title": "Souhait bleu"
},
{
"altTitles": [],
"artist": "Ponchi♪ feat.はぁち",
"data": {
"displayVersion": "exceed"
},
"id": 1718,
"searchTerms": [
"lovechance_ponchi",
"ラヴチャンス"
],
"title": "ラヴ齶チャンス!!"
},
{
"altTitles": [],
"artist": "Aoi feat. Kuroa*",
"data": {
"displayVersion": "exceed"
},
"id": 1720,
"searchTerms": [
"gekkanomaitosai_aoi",
"ゲッカノブトウサイ"
],
"title": "月下の舞兎祭"
},
{
"altTitles": [],
"artist": "つきみぐー、×如月結愛",
"data": {
"displayVersion": "exceed"
},
"id": 1721,
"searchTerms": [
"nowloading_tsukimiguu",
"ナウローディング"
],
"title": "Now loading…"
},
{
"altTitles": [],
"artist": "pan+テヅカ feat.桃雛なの",
"data": {
"displayVersion": "exceed"
},
"id": 1723,
"searchTerms": [
"whipdrip_panteduka",
"ホイップドリップ"
],
"title": "Whip☆Drip"
},
{
"altTitles": [],
"artist": "MALVA.",
"data": {
"displayVersion": "exceed"
},
"id": 1724,
"searchTerms": [
"verstarkt_malva",
"フェルシュテルクトキラー"
],
"title": "Verstärkt Killer"
},
{
"altTitles": [],
"artist": "Enterskip",
"data": {
"displayVersion": "exceed"
},
"id": 1729,
"searchTerms": [
"funwalk_enterskip",
"ファンウォーク"
],
"title": "Fun walk!!"
},
{
"altTitles": [],
"artist": "RoughSketch (Notebook Records)",
"data": {
"displayVersion": "exceed"
},
"id": 1734,
"searchTerms": [
"777_roughsketch",
"セブンセブンセブン"
],
"title": 777
},
{
"altTitles": [],
"artist": "立秋 feat.ちょこ",
"data": {
"displayVersion": "exceed"
},
"id": 1735,
"searchTerms": [
"punaitaiso_risshu",
"プナイプナイタイソウ"
],
"title": "プナイプナイたいそう"
},
{
"altTitles": [],
"artist": "COOL&CREATE × 宝鐘マリン with ホロイズムファンタジー",
"data": {
"displayVersion": "exceed"
},
"id": 1753,
"searchTerms": [
"hoyhoygensou_marines",
"ホイホイゲンソウホロイズム"
],
"title": "ホイホイ☆幻想ホロイズム"
},
{
"altTitles": [],
"artist": "COOL&CREATE × 宝鐘マリン",
"data": {
"displayVersion": "exceed"
},
"id": 1754,
"searchTerms": [
"captainmarine_marine",
"キャプテンマリンノケツアンカー"
],
"title": "キャプテン・マリンのケツアンカー"
},
{
"altTitles": [],
"artist": "COOL&CREATE × 兎田ぺこら、さくらみこ、宝鐘マリン",
"data": {
"displayVersion": "exceed"
},
"id": 1755,
"searchTerms": [
"shiawaseusagi_pekomikomarine",
"シアワセウサギペコミコマリン"
],
"title": "シアワセうさぎ・ぺこみこマリン"
},
{
"altTitles": [],
"artist": "COOL&CREATE × 宝鐘マリン",
"data": {
"displayVersion": "exceed"
},
"id": 1756,
"searchTerms": [
"earphoneromance_marine",
"イヤホンロマンス"
],
"title": "イヤホンロマンス"
},
{
"altTitles": [],
"artist": "COOL&CREATE × 宝鐘マリン feat.不知火フレア",
"data": {
"displayVersion": "exceed"
},
"id": 1757,
"searchTerms": [
"overtheborder_marineflare",
"オーバーザボーダー"
],
"title": "Over the Border"
},
{
"altTitles": [],
"artist": "COOL&CREATE × 宝鐘マリンと愉快な仲間たち",
"data": {
"displayVersion": "exceed"
},
"id": 1758,
"searchTerms": [
"helpme_erin_remix_marines",
"ヘルプミーエーリンゲンソウキョウホロイズムバージョン"
],
"title": "Help me, ERINNNNNN!! #幻想郷ホロイズムver."
},
{
"altTitles": [],
"artist": "cosMo@暴走P",
"data": {
"displayVersion": "exceed"
},
"id": 1762,
"searchTerms": [
"dosancoodyssey_cosmo",
"ドゥサンコオデッセイ"
],
"title": "ドゥサンコオデッセイ!!"
},
{
"altTitles": [],
"artist": "BlackY",
"data": {
"displayVersion": "exceed"
},
"id": 1763,
"searchTerms": [
"azalea_blacky",
"アザレア"
],
"title": "αzalea"
},
{
"altTitles": [],
"artist": "かめりあ as \"Revenge of Riot\"",
"data": {
"displayVersion": "exceed"
},
"id": 1764,
"searchTerms": [
"bayonex_kameria",
"ベヨネックス"
],
"title": "BAYONEX"
},
{
"altTitles": [],
"artist": "ぺのれり",
"data": {
"displayVersion": "exceed"
},
"id": 1765,
"searchTerms": [
"reverencedflower_penoreri",
"レヴァレンスドフラワー"
],
"title": "Reverenced Flower"
},
{
"altTitles": [],
"artist": "かねこちはる",
"data": {
"displayVersion": "exceed"
},
"id": 1811,
"searchTerms": [
"reminiscence_kanekochiharu",
"レミニセンス"
],
"title": "《Re:miniscence》"
},
{
"altTitles": [],
"artist": "立秋 feat.ちょこ",
"data": {
"displayVersion": "exceed"
},
"id": 1812,
"searchTerms": [
"take_risshu",
"タケ"
],
"title": "竹"
}
]
+2
View File
@@ -26,7 +26,9 @@
"commander": "^8.2.0",
"csv-parse": "^5.0.3",
"deepmerge": "^4.2.2",
"encoding-japanese": "^1.0.30",
"fast-json-stable-hash": "^1.0.3",
"fast-xml-parser": "^4.0.2",
"glob": "^7.2.0",
"html-entities": "^2.3.2",
"mei-logger": "^1.0.1",
+19
View File
@@ -4,7 +4,9 @@ specifiers:
commander: ^8.2.0
csv-parse: ^5.0.3
deepmerge: ^4.2.2
encoding-japanese: ^1.0.30
fast-json-stable-hash: ^1.0.3
fast-xml-parser: ^4.0.2
glob: ^7.2.0
html-entities: ^2.3.2
mei-logger: ^1.0.1
@@ -17,7 +19,9 @@ dependencies:
commander: 8.2.0
csv-parse: 5.0.3
deepmerge: 4.2.2
encoding-japanese: 1.0.30
fast-json-stable-hash: 1.0.3
fast-xml-parser: 4.0.2
glob: 7.2.0
html-entities: 2.3.2
mei-logger: 1.0.1
@@ -818,6 +822,10 @@ packages:
resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==}
dev: false
/encoding-japanese/1.0.30:
resolution: {integrity: sha512-bd/DFLAoJetvv7ar/KIpE3CNO8wEuyrt9Xuw6nSMiZ+Vrz/Q21BPsMHvARL2Wz6IKHKXgb+DWZqtRg1vql9cBg==}
dev: false
/es6-error/4.1.1:
resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
dev: false
@@ -868,6 +876,13 @@ packages:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
dev: false
/fast-xml-parser/4.0.2:
resolution: {integrity: sha512-3GOSbMTZxxrPPQ+aURM7Wia10bi71HBbiG/3mOEEkRSAkRtg4m7UhMSnB2rzOhBeRHyJUWsllOfyNnjTT1b85w==}
hasBin: true
dependencies:
strnum: 1.0.5
dev: false
/fecha/4.2.1:
resolution: {integrity: sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==}
dev: false
@@ -1995,6 +2010,10 @@ packages:
engines: {node: '>=8'}
dev: false
/strnum/1.0.5:
resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
dev: false
/supports-color/5.5.0:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
engines: {node: '>=4'}
@@ -0,0 +1,131 @@
const { Command } = require("commander");
const { XMLParser } = require("fast-xml-parser");
const Encoding = require("encoding-japanese");
const fs = require("fs");
const { CreateChartID, ReadCollection, WriteCollection } = require("../util");
const VERSIONS = {
1: "booth",
2: "inf",
3: "gw",
4: "heaven",
5: "vivid",
6: "exceed",
};
const VERSION_DIFFICULTIES = {
2: "INF",
3: "GRV",
4: "HVN",
5: "VVD",
};
const DIFFICULTIES = {
"novice": "NOV",
"advanced": "ADV",
"exhaust": "EXH",
"maximum": "MXM",
};
const SHITTY_SJIS_OVERRIDE_TITLES = {
1724: "Verstärkt Killer",
}
function getDifficulty(diffKey, version) {
if (diffKey === "infinite") {
return VERSION_DIFFICULTIES[version];
}
return DIFFICULTIES[diffKey];
}
function getTitle(id, title) {
return SHITTY_SJIS_OVERRIDE_TITLES[id] || title;
}
const program = new Command();
program.option("-f, --file <XML File>")
program.parse(process.argv);
const options = program.opts();
const parser = new XMLParser({ ignoreAttributes: false });
const fileString = Encoding.convert(fs.readFileSync(options.file), {
to: "UNICODE",
from: "SJIS",
type: "string"
});
const xmlData = parser.parse(fileString);
const songs = ReadCollection("songs-sdvx.json");
const charts = ReadCollection("charts-sdvx.json");
let versionAddedCount = 0;
let newChartCount = 0;
for (const music of xmlData.mdb.music) {
const id = Number(music["@_id"]);
const newSong = !songs.find(song => song.id === id);
if (newSong) {
songs.push({
id,
title: getTitle(id, music.info.title_name),
artist: music.info.artist_name,
data: {
displayVersion: VERSIONS[music.info.version["#text"]],
},
altTitles: [],
searchTerms: [
music.info.ascii,
music.info.title_yomigana,
],
});
}
for (const diffKey in music.difficulty) {
const diffData = music.difficulty[diffKey];
const levelNum = Number(diffData.difnum["#text"]);
if (levelNum === 0) {
continue;
}
const difficulty = getDifficulty(diffKey, music.info.inf_ver["#text"]);
const chartIndex = charts.findIndex(chart =>
chart.songID === id && chart.difficulty === difficulty);
if (chartIndex === -1) {
charts.push({
chartID: CreateChartID(),
difficulty,
songID: id,
playtype: "Single",
levelNum,
level: levelNum.toString(),
data: {
inGameID: id,
arcChartID: null,
},
isPrimary: true,
versions: ["konaste"],
tierlistInfo: {},
rgcID: null,
});
if (!newSong) {
console.log(`New ${difficulty} ${levelNum} for song id ${id}`);
}
newChartCount++;
} else if (!charts[chartIndex].versions.includes("konaste")) {
charts[chartIndex].versions.push("konaste");
versionAddedCount++;
}
}
}
console.log(`Added "konaste" version to ${versionAddedCount} charts.`);
console.log(`Added ${newChartCount} brand new charts.`);
WriteCollection("songs-sdvx.json", songs);
WriteCollection("charts-sdvx.json", charts);
+9 -4
View File
@@ -27,13 +27,17 @@ function ReadCollection(name) {
return JSON.parse(fs.readFileSync(p));
}
function WriteCollection(name, data) {
fs.writeFileSync(path.join(COLLECTIONS_DIR, name), JSON.stringify(data, null, "\t"));
DeterministicCollectionSort();
}
function MutateCollection(name, cb) {
const data = cb(ReadCollection(name));
fs.writeFileSync(path.join(COLLECTIONS_DIR, name), JSON.stringify(data, null, "\t"));
DeterministicCollectionSort();
WriteCollection(name, data);
}
function CreateChartID() {
@@ -114,6 +118,7 @@ module.exports = {
CreateChartID,
CreateFolderID,
ReadCollection,
WriteCollection,
EfficientInPlaceDeepmerge,
AddSupportForBMSTable
}
}