fix: backport all features from v2 that came in after merge

This commit is contained in:
zk
2026-05-17 12:53:26 +00:00
parent 426bb250d9
commit fe76dad32d
34 changed files with 602 additions and 5219 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+132
View File
@@ -117,6 +117,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01002luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8162,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2340
},
@@ -199,6 +200,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01003luna.htm",
"displayVersion": "オンゲキ R.E.D. PLUS",
"inGameID": 8058,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3014
},
@@ -281,6 +283,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01004luna.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 8022,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2396
},
@@ -1224,6 +1227,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01016luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8166,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3510
},
@@ -1247,6 +1251,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01016mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 118,
"isBonusTrack": false,
"maxPlatScore": 2556
},
"difficulty": "MASTER",
@@ -1489,6 +1494,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01019luna.htm",
"displayVersion": "オンゲキ bright",
"inGameID": 8065,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2698
},
@@ -1512,6 +1518,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01019mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 47,
"isBonusTrack": false,
"maxPlatScore": 2100
},
"difficulty": "MASTER",
@@ -1600,6 +1607,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01020luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.3",
"inGameID": 8179,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3006
},
@@ -1955,6 +1963,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01070luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8113,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1568
},
@@ -2056,6 +2065,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01061luna.htm",
"displayVersion": "オンゲキ",
"inGameID": 8021,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 4000
},
@@ -2233,6 +2243,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01064luna.htm",
"displayVersion": "オンゲキ R.E.D. PLUS",
"inGameID": 8062,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 4036
},
@@ -2256,6 +2267,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01064mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 151,
"isBonusTrack": false,
"maxPlatScore": 2590
},
"difficulty": "MASTER",
@@ -2480,6 +2492,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01082luna.htm",
"displayVersion": "オンゲキ bright",
"inGameID": 8067,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2234
},
@@ -2669,6 +2682,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01066luna.htm",
"displayVersion": "オンゲキ",
"inGameID": 8002,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1052
},
@@ -3404,6 +3418,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01083luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8165,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3048
},
@@ -3427,6 +3442,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01083mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 140,
"isBonusTrack": false,
"maxPlatScore": 2482
},
"difficulty": "MASTER",
@@ -3871,6 +3887,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01027luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8163,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 4152
},
@@ -3894,6 +3911,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01027mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 45,
"isBonusTrack": false,
"maxPlatScore": 3016
},
"difficulty": "MASTER",
@@ -4517,6 +4535,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01032luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8009,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1672
},
@@ -4898,6 +4917,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01036luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8115,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3020
},
@@ -4921,6 +4941,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01036mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 35,
"isBonusTrack": false,
"maxPlatScore": 2498
},
"difficulty": "MASTER",
@@ -5009,6 +5030,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01037luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8015,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2452
},
@@ -5924,6 +5946,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01038luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8091,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3692
},
@@ -5946,6 +5969,7 @@
"data": {
"displayVersion": "オンゲキ",
"inGameID": 36,
"isBonusTrack": false,
"maxPlatScore": 1836
},
"difficulty": "MASTER",
@@ -6034,6 +6058,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01039luna.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 8029,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2464
},
@@ -6057,6 +6082,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01039mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 63,
"isBonusTrack": false,
"maxPlatScore": 1638
},
"difficulty": "MASTER",
@@ -6145,6 +6171,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01040luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8030,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2676
},
@@ -6168,6 +6195,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01040mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 64,
"isBonusTrack": false,
"maxPlatScore": 1942
},
"difficulty": "MASTER",
@@ -6256,6 +6284,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01041luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8031,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3144
},
@@ -6279,6 +6308,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01041mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 65,
"isBonusTrack": false,
"maxPlatScore": 1762
},
"difficulty": "MASTER",
@@ -6367,6 +6397,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01042luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8094,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2834
},
@@ -6390,6 +6421,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01042mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 67,
"isBonusTrack": false,
"maxPlatScore": 2624
},
"difficulty": "MASTER",
@@ -6478,6 +6510,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01043luna.htm",
"displayVersion": "オンゲキ Re:Fresh",
"inGameID": 8186,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3222
},
@@ -6584,6 +6617,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01044luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8095,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3118
},
@@ -6607,6 +6641,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01044mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 68,
"isBonusTrack": false,
"maxPlatScore": 2184
},
"difficulty": "MASTER",
@@ -6695,6 +6730,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01045luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8033,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2922
},
@@ -6718,6 +6754,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01045mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 69,
"isBonusTrack": false,
"maxPlatScore": 1672
},
"difficulty": "MASTER",
@@ -7092,6 +7129,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01052luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8097,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3094
},
@@ -7115,6 +7153,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01052mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 76,
"isBonusTrack": false,
"maxPlatScore": 2444
},
"difficulty": "MASTER",
@@ -7203,6 +7242,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01053luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8098,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2714
},
@@ -7226,6 +7266,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01053mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 79,
"isBonusTrack": false,
"maxPlatScore": 1808
},
"difficulty": "MASTER",
@@ -7582,6 +7623,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01069luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8099,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2482
},
@@ -7605,6 +7647,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01069mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 93,
"isBonusTrack": false,
"maxPlatScore": 2408
},
"difficulty": "MASTER",
@@ -7693,6 +7736,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01074luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8100,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3170
},
@@ -7716,6 +7760,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01074mst.htm",
"displayVersion": "オンゲキ",
"inGameID": 94,
"isBonusTrack": false,
"maxPlatScore": 2280
},
"difficulty": "MASTER",
@@ -7918,6 +7963,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01063luna.htm",
"displayVersion": "オンゲキ",
"inGameID": 8001,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1738
},
@@ -9482,6 +9528,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01109luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8158,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 4434
},
@@ -10155,6 +10202,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01118luna.htm",
"displayVersion": "オンゲキ R.E.D.",
"inGameID": 8056,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 628
},
@@ -10338,6 +10386,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01120luna.htm",
"displayVersion": "オンゲキ R.E.D. PLUS",
"inGameID": 8063,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3690
},
@@ -10763,6 +10812,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01126luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8164,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3766
},
@@ -10786,6 +10836,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01126mst.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 163,
"isBonusTrack": false,
"maxPlatScore": 2614
},
"difficulty": "MASTER",
@@ -10874,6 +10925,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01127luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8173,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3040
},
@@ -10897,6 +10949,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01127mst.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 164,
"isBonusTrack": false,
"maxPlatScore": 2484
},
"difficulty": "MASTER",
@@ -11075,6 +11128,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01129luna.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 8024,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1994
},
@@ -11852,6 +11906,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01138luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8085,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3048
},
@@ -11875,6 +11930,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01138mst.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 167,
"isBonusTrack": false,
"maxPlatScore": 2546
},
"difficulty": "MASTER",
@@ -12451,6 +12507,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01145luna.htm",
"displayVersion": "オンゲキ SUMMER",
"inGameID": 8041,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2008
},
@@ -12854,6 +12911,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01150luna.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 8023,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1622
},
@@ -12966,6 +13024,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01152luna.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 8025,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1998
},
@@ -13504,6 +13563,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01161luna.htm",
"displayVersion": "オンゲキ R.E.D.",
"inGameID": 8050,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3026
},
@@ -13527,6 +13587,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01161mst.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 190,
"isBonusTrack": false,
"maxPlatScore": 2474
},
"difficulty": "MASTER",
@@ -13745,6 +13806,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01167luna.htm",
"displayVersion": "オンゲキ R.E.D.",
"inGameID": 8052,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 3120
},
@@ -15103,6 +15165,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01177luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8101,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2586
},
@@ -15126,6 +15189,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01177mst.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 205,
"isBonusTrack": false,
"maxPlatScore": 2124
},
"difficulty": "MASTER",
@@ -15214,6 +15278,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01180luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8102,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2806
},
@@ -15237,6 +15302,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01180mst.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 206,
"isBonusTrack": false,
"maxPlatScore": 2568
},
"difficulty": "MASTER",
@@ -15325,6 +15391,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01179luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8103,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3326
},
@@ -15348,6 +15415,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01179mst.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 207,
"isBonusTrack": false,
"maxPlatScore": 2690
},
"difficulty": "MASTER",
@@ -16142,6 +16210,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01188luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8088,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3088
},
@@ -16165,6 +16234,7 @@
"chartViewURL": "https://sdvx.in/ongeki/01/01188mst.htm",
"displayVersion": "オンゲキ PLUS",
"inGameID": 215,
"isBonusTrack": false,
"maxPlatScore": 2618
},
"difficulty": "MASTER",
@@ -18179,6 +18249,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02017luna.htm",
"displayVersion": "オンゲキ SUMMER PLUS",
"inGameID": 8048,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3410
},
@@ -18202,6 +18273,7 @@
"chartViewURL": "https://sdvx.in/ongeki/02/02017mst.htm",
"displayVersion": "オンゲキ SUMMER",
"inGameID": 231,
"isBonusTrack": false,
"maxPlatScore": 2572
},
"difficulty": "MASTER",
@@ -18290,6 +18362,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02018luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8104,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3230
},
@@ -18313,6 +18386,7 @@
"chartViewURL": "https://sdvx.in/ongeki/02/02018mst.htm",
"displayVersion": "オンゲキ SUMMER",
"inGameID": 232,
"isBonusTrack": false,
"maxPlatScore": 3028
},
"difficulty": "MASTER",
@@ -18581,6 +18655,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02022luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8105,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3388
},
@@ -18604,6 +18679,7 @@
"chartViewURL": "https://sdvx.in/ongeki/02/02022mst.htm",
"displayVersion": "オンゲキ SUMMER",
"inGameID": 243,
"isBonusTrack": false,
"maxPlatScore": 2052
},
"difficulty": "MASTER",
@@ -18782,6 +18858,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02021luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8106,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2190
},
@@ -18805,6 +18882,7 @@
"chartViewURL": "https://sdvx.in/ongeki/02/02021mst.htm",
"displayVersion": "オンゲキ SUMMER",
"inGameID": 238,
"isBonusTrack": false,
"maxPlatScore": 1508
},
"difficulty": "MASTER",
@@ -18917,6 +18995,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02025luna.htm",
"displayVersion": "オンゲキ SUMMER",
"inGameID": 8042,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2214
},
@@ -18982,6 +19061,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02026luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8083,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3558
},
@@ -19343,6 +19423,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02031luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8086,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 634
},
@@ -22452,6 +22533,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02068luna.htm",
"displayVersion": "オンゲキ SUMMER",
"inGameID": 8043,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2450
},
@@ -24571,6 +24653,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02099luna.htm",
"displayVersion": "オンゲキ Re:Fresh",
"inGameID": 8188,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 3782
},
@@ -25671,6 +25754,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02097luna.htm",
"displayVersion": "オンゲキ SUMMER PLUS",
"inGameID": 8044,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1776
},
@@ -27088,6 +27172,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02125luna.htm",
"displayVersion": "オンゲキ SUMMER PLUS",
"inGameID": 8045,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1476
},
@@ -27446,6 +27531,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02129luna.htm",
"displayVersion": "オンゲキ R.E.D.",
"inGameID": 8054,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2748
},
@@ -27469,6 +27555,7 @@
"chartViewURL": "https://sdvx.in/ongeki/02/02129mst.htm",
"displayVersion": "オンゲキ SUMMER PLUS",
"inGameID": 374,
"isBonusTrack": false,
"maxPlatScore": 2544
},
"difficulty": "MASTER",
@@ -29758,6 +29845,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02157luna.htm",
"displayVersion": "オンゲキ SUMMER PLUS",
"inGameID": 8046,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2968
},
@@ -29781,6 +29869,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02158luna.htm",
"displayVersion": "オンゲキ SUMMER PLUS",
"inGameID": 8047,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 5200
},
@@ -30358,6 +30447,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/02165luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8160,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 4572
},
@@ -31903,6 +31993,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03001luna.htm",
"displayVersion": "オンゲキ R.E.D. PLUS",
"inGameID": 8061,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3006
},
@@ -31926,6 +32017,7 @@
"chartViewURL": "https://sdvx.in/ongeki/03/03001mst.htm",
"displayVersion": "オンゲキ R.E.D.",
"inGameID": 413,
"isBonusTrack": false,
"maxPlatScore": 2418
},
"difficulty": "MASTER",
@@ -32843,6 +32935,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03010luna.htm",
"displayVersion": "オンゲキ R.E.D.",
"inGameID": 8049,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 4708
},
@@ -35818,6 +35911,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03052luna.htm",
"displayVersion": "オンゲキ R.E.D.",
"inGameID": 8051,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2586
},
@@ -36891,6 +36985,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03067luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8172,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2758
},
@@ -39798,6 +39893,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03100luna.htm",
"displayVersion": "オンゲキ R.E.D. PLUS",
"inGameID": 8064,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 1616
},
@@ -39821,6 +39917,7 @@
"chartViewURL": "https://sdvx.in/ongeki/03/03100mst.htm",
"displayVersion": "オンゲキ R.E.D. PLUS",
"inGameID": 509,
"isBonusTrack": false,
"maxPlatScore": 2610
},
"difficulty": "MASTER",
@@ -40000,6 +40097,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03102luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.3",
"inGameID": 8178,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 3118
},
@@ -40577,6 +40675,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03106luna.htm",
"displayVersion": "オンゲキ R.E.D. PLUS",
"inGameID": 8057,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 4422
},
@@ -40689,6 +40788,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03109luna.htm",
"displayVersion": "オンゲキ R.E.D. PLUS",
"inGameID": 8059,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 3172
},
@@ -45301,6 +45401,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03158luna.htm",
"displayVersion": "オンゲキ R.E.D. PLUS",
"inGameID": 8060,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 5740
},
@@ -47526,6 +47627,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03176luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.3",
"inGameID": 8180,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3902
},
@@ -47812,6 +47914,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03179luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8107,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 4180
},
@@ -47835,6 +47938,7 @@
"chartViewURL": "https://sdvx.in/ongeki/03/03179mst.htm",
"displayVersion": "オンゲキ R.E.D. PLUS",
"inGameID": 589,
"isBonusTrack": false,
"maxPlatScore": 4730
},
"difficulty": "MASTER",
@@ -47924,6 +48028,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03180luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.3",
"inGameID": 8139,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 5006
},
@@ -48209,6 +48314,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03183luna.htm",
"displayVersion": "オンゲキ bright",
"inGameID": 8081,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 3184
},
@@ -48679,6 +48785,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03188luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8087,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 3712
},
@@ -48792,6 +48899,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/03189luna.htm",
"displayVersion": "オンゲキ Re:Fresh",
"inGameID": 8185,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1754
},
@@ -49123,6 +49231,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04002luna.htm",
"displayVersion": "オンゲキ bright",
"inGameID": 8079,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2886
},
@@ -50288,6 +50397,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04016luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8072,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2690
},
@@ -50311,6 +50421,7 @@
"chartViewURL": "https://sdvx.in/ongeki/04/04016mst.htm",
"displayVersion": "オンゲキ bright",
"inGameID": 615,
"isBonusTrack": false,
"maxPlatScore": 2798
},
"difficulty": "MASTER",
@@ -51316,6 +51427,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04023luna.htm",
"displayVersion": "オンゲキ bright",
"inGameID": 8080,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2240
},
@@ -56157,6 +56269,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04070luna.htm",
"displayVersion": "オンゲキ bright",
"inGameID": 8069,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2114
},
@@ -57182,6 +57295,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04078luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8168,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2438
},
@@ -57205,6 +57319,7 @@
"chartViewURL": "https://sdvx.in/ongeki/04/04078mst.htm",
"displayVersion": "オンゲキ bright",
"inGameID": 676,
"isBonusTrack": false,
"maxPlatScore": 2026
},
"difficulty": "MASTER",
@@ -57852,6 +57967,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04086luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8084,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 5000
},
@@ -59719,6 +59835,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04102luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8082,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 3060
},
@@ -59765,6 +59882,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04103luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8071,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2126
},
@@ -61678,6 +61796,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04126luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8070,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1194
},
@@ -61749,6 +61868,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04127luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8170,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3502
},
@@ -67711,6 +67831,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04184luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8089,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 3776
},
@@ -67802,6 +67923,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04180luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.3",
"inGameID": 8145,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 5798
},
@@ -67931,6 +68053,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04185luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.1",
"inGameID": 8090,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 5400
},
@@ -68760,6 +68883,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/01038luna2.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8003,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2146
},
@@ -72692,6 +72816,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04215luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 8167,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2322
},
@@ -72715,6 +72840,7 @@
"chartViewURL": "https://sdvx.in/ongeki/04/04215mst.htm",
"displayVersion": "オンゲキ bright MEMORY Act.2",
"inGameID": 908,
"isBonusTrack": false,
"maxPlatScore": 1944
},
"difficulty": "MASTER",
@@ -73699,6 +73825,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04223luna.htm",
"displayVersion": "オンゲキ Re:Fresh",
"inGameID": 8177,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 4042
},
@@ -81221,6 +81348,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04285luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.3",
"inGameID": 8175,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 2884
},
@@ -81435,6 +81563,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04288luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.3",
"inGameID": 8169,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 2206
},
@@ -87428,6 +87557,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04359luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.3",
"inGameID": 8181,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 4266
},
@@ -87511,6 +87641,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/04360luna.htm",
"displayVersion": "オンゲキ bright MEMORY Act.3",
"inGameID": 8182,
"isBonusTrack": false,
"isReMaster": false,
"maxPlatScore": 1946
},
@@ -88312,6 +88443,7 @@
"chartViewURL": "https://sdvx.in/ongeki/luna/05017luna.htm",
"displayVersion": "オンゲキ Re:Fresh",
"inGameID": 8187,
"isBonusTrack": false,
"isReMaster": true,
"maxPlatScore": 3066
},
+24 -2
View File
@@ -38377,7 +38377,7 @@
"slug": "refreshomni-lunatic",
"title": "LUNATIC (Re:Fresh Omnimix)",
"versionFilter": ["refreshOmni"],
"where": "chart.data->>'isReMaster' = 'false' AND chart.difficulty = 'LUNATIC'"
"where": "chart.data->>'isBonusTrack' = 'false' AND chart.data->>'isReMaster' = 'false' AND chart.difficulty = 'LUNATIC'"
},
{
"game": "ongeki",
@@ -38399,6 +38399,17 @@
"slug": "refresh-lunatic",
"title": "LUNATIC (Re:Fresh)",
"versionFilter": ["refresh"],
"where": "chart.data->>'isBonusTrack' = 'false' AND chart.data->>'isReMaster' = 'false' AND chart.difficulty = 'LUNATIC'"
},
{
"game": "ongeki",
"id": "F19d35f0cf2aa17a39b1",
"inactive": true,
"legacyFolderID": "F2de5fd8f784e94c6e2c60c5960b1306aadb76c54ce9b502421813cfa66532a36",
"searchTerms": [],
"slug": "refresh-lunatic-old",
"title": "LUNATIC (Re:Fresh) (Old)",
"versionFilter": ["refresh"],
"where": "chart.data->>'isReMaster' = 'false' AND chart.difficulty = 'LUNATIC'"
},
{
@@ -38519,7 +38530,7 @@
"slug": "refreshomni-lunatic-remaster",
"title": "Re:MASTER (Re:Fresh Omnimix)",
"versionFilter": ["refreshOmni"],
"where": "chart.data->>'isReMaster' = 'true' AND chart.difficulty = 'LUNATIC'"
"where": "chart.data->>'isBonusTrack' = 'false' AND chart.data->>'isReMaster' = 'true' AND chart.difficulty = 'LUNATIC'"
},
{
"game": "ongeki",
@@ -38541,6 +38552,17 @@
"slug": "refresh-lunatic-remaster",
"title": "Re:MASTER (Re:Fresh)",
"versionFilter": ["refresh"],
"where": "chart.data->>'isBonusTrack' = 'false' AND chart.data->>'isReMaster' = 'true' AND chart.difficulty = 'LUNATIC'"
},
{
"game": "ongeki",
"id": "F19d35f0cf2a28977612",
"inactive": true,
"legacyFolderID": "F591906452a12c984f9a5e436543802e493d15782b678b518dbeba3705720c77c",
"searchTerms": [],
"slug": "refresh-lunatic-remaster-old",
"title": "Re:MASTER (Re:Fresh) (Old)",
"versionFilter": ["refresh"],
"where": "chart.data->>'isReMaster' = 'true' AND chart.difficulty = 'LUNATIC'"
},
{
+1 -1
View File
@@ -9932,7 +9932,7 @@
},
"id": "S19d35e101d442f45394",
"legacySongID": 817,
"searchTerms": [],
"searchTerms": ["Loctest"],
"title": "Perfect Shining!!"
},
{
@@ -103,6 +103,9 @@ The following judgements are defined:
| `xverse` | X-VERSE |
| `xverse-intl` | X-VERSE International |
| `xverse-omni` | X-VERSE Omnimix |
| `xversex` | X-VERSE-X |
| `xversex-intl` | X-VERSE-X International |
| `xversex-omni` | X-VERSE-X Omnimix |
## Supported Match Types
@@ -95,6 +95,7 @@ The default rating algorithm is `jubility`.
| `festo` | festo |
| `festo-omni` | festo Omnimix |
| `ave` | Ave. |
| `beyond` | beyond the Ave. |
## Supported Match Types
+13 -4
View File
@@ -91,7 +91,7 @@ The default rating algorithm is `naiveRating`.
| Name | Type | Values |
| :: | :: | :: |
| `colour` | DERIVED | BLUE, GREEN, ORANGE, RED, PURPLE, COPPER, SILVER, GOLD, PLATINUM, RAINBOW, RAINBOW_SHINY, RAINBOW_EX
| `colour` | DERIVED | BLUE, GREEN, ORANGE, RED, PURPLE, COPPER, SILVER, GOLD, PLATINUM, RAINBOW, RAINBOW_SHINY, RAINBOW_EX, RAINBOW_EX_TRUE
## Versions
@@ -110,7 +110,16 @@ The default rating algorithm is `naiveRating`.
- `inGameID`
### Song Title Matching
There are numerous songs with non-unique names (e.g. Singularity, Singularity and Singularity), but this can be resolved by providing the `artist` field. The only exception is Perfect Shining, which uniquely has two LUNATIC charts and has to be matched by `inGameID`:
There are several songs with non-unique names:
- LUNATIC 0 (Loctest chart) `inGameID: 8003`
- LUNATIC 13+ (Re:Master) `inGameID: 8091`
- Singularity (technoplanet) `inGameID: 391`
- Singularity (ETIA.「Arcaea」) `inGameID: 454`
- Singularity (SEGA SOUND STAFF「セガNET麻雀 MJ」) `inGameID: 516`
- Hand in Hand (livetune) `inGameID: 380`
- Hand in Hand (ユーフィリア(CV:高橋 李依)「アンジュ・ヴィエルジュ」) `inGameID: 212`
- Perfect_Shining!! LUNATIC 0 (Loctest chart) `inGameID: 8003`
- Perfect_Shining!! LUNATIC 13+ (Re:Master) `inGameID: 8091`
Most of these conflicts can be resolved by providing the `artist` field; the only exception is Perfect Shining, which uniquely has two LUNATIC charts and has to be matched by `inGameID`.
+1 -2
View File
@@ -137,13 +137,12 @@
<div class="footer">
<div class="credit">
<span
>created by <a href="https://github.com/zkldik</a>, homepage
>created by <a href="https://github.com/zkldi">zkldi</a>, homepage
by
<a href="https://pfy.ch">pfych</a>
</span>
</div>
<div class="links">
<a href="https://ko-fi.com/zkldiarget="_blank">Donate</a>
<a href="https://github.com/zkldi/Tachi" target="_blank">GitHub</a>
<a href="https://docs.tachi.ac/">Documentation</a>
<a href="https://boku.tachi.ac/credits">Credits</a>
@@ -325,6 +325,13 @@ function ImportInfoDisplayer({ game }: { game: GameGroup }) {
);
} else if (game === "maimaidx") {
Content.unshift(
<ImportInfoCard
desc="Automatically import scores, whenever you get them."
href="rizu"
key="Rizu"
moreInfo="This is the recommended way to import maimai DX scores; data is submitted at the end of each play."
name="Rizu"
/>,
<ImportInfoCard
desc="Use your data from maimai DX NET."
href="kt-maimaidx-site-importer"
@@ -0,0 +1,47 @@
import useSetSubheader from "#components/layout/header/useSetSubheader";
import Divider from "#components/util/Divider";
import ExternalLink from "#components/util/ExternalLink";
import { TachiConfig } from "#lib/config";
import React from "react";
import Alert from "react-bootstrap/Alert";
export default function RizuPage() {
useSetSubheader(["Import Scores", "Rizu"]);
return (
<div>
<h1 className="text-center mb-4">What is Rizu?</h1>
<div>
Rizu automatically sends maimai DX scores to a server. {TachiConfig.NAME} is
compatible with what Rizu sends, so you can use it to submit scores!
</div>
<Divider />
<h1 className="text-center my-4">Setup Instructions</h1>
<ol className="instructions-list">
<li>
Download the latest version of <code>Rizu-MelonLoader-vVERSION.zip</code>{" "}
<ExternalLink href="https://gitea.tendokyu.moe/beerpsi/Rizu/releases/latest">
here
</ExternalLink>
.
</li>
<li>
Download your <code>Rizu.cfg</code> config file{" "}
<ExternalLink href="/client-file-flow/CXRizu">here</ExternalLink>
. <br />
<Alert className="mt-2" variant="warning">
This file contains an API Key, which is meant to be kept secret!
</Alert>
</li>
<li>
Follow the installation instructions on{" "}
<ExternalLink href="https://gitea.tendokyu.moe/beerpsi/Rizu#melonloader">
Tendokyu
</ExternalLink>
.
</li>
<li>Your scores are now automatically uploaded to {TachiConfig.NAME}!</li>
</ol>
</div>
);
}
@@ -0,0 +1,205 @@
import useSetSubheader from "#components/layout/header/useSetSubheader";
import Divider from "#components/util/Divider";
import { UserContext } from "#context/UserContext";
import { TachiConfig } from "#lib/config";
import { Contributors } from "#util/constants/contributors";
import { RFA } from "#util/misc";
import React, { useContext, useState } from "react";
import { Link } from "react-router-dom";
export default function CreditsPage() {
useSetSubheader("Credits");
const [alt, setAlt] = useState(false);
const [whatTheHell, setWhatTheHell] = useState(0);
const { user } = useContext(UserContext);
function a(normal: string | JSX.Element, ...altStr: (string | JSX.Element)[]) {
if (!alt) {
return normal;
} else if (whatTheHell < 0) {
return normal;
}
return RFA(altStr);
}
return (
<div style={{ fontSize: "1.15rem" }}>
<p>
{a(
<>
{TachiConfig.NAME} has been the work of many people, and many more
contributors. None of this would be possible without these people.
</>,
"Funding for this program was made possible by by by by by-",
`${TachiConfig.NAME} actually just appeared here one day, and we're not sure how.`,
`Actually, we just ran npm install ${TachiConfig.NAME}.`,
"To be honest, we had a surplus of monkeys and typewriters.",
)}
</p>
<Divider />
<p>
If you want to support {TachiConfig.NAME} development, see{" "}
<Link to="/support">Support</Link>.
</p>
<Divider />
<div className="mt-4">
<h1 className="user-select-none">
De
<span
className="credits-easter-egg"
onClick={() => {
if (alt) {
// Force a different RFA
// by incrementing a random
// variable
setWhatTheHell(whatTheHell + 1);
} else {
setAlt(true);
}
}}
>
v
</span>{" "}
Team
</h1>
<ul>
<li>
{a(
"Lead Dev",
"Rules Of Hooks Violator",
"ABBA Enthusiast",
"Nutcase",
"IIDX 'player'",
)}
: <strong>zk</strong>
</li>
<li>
{a(
"Infrastructure & Dev/Ops",
"Professional YAML Editor",
"Professional nginx.conf Editor",
"'What do you mean you rm -rf'd that folder?'",
"WintOr",
"Frog Lover",
)}
: <strong>winter</strong>
<br />
<small>Also the reason I even started learning how to program.</small>
</li>
</ul>
</div>
<div className="mt-6">
<h1>Significant Contributors</h1>
<p>
These people have contributed a significant amount of their time to{" "}
{TachiConfig.NAME}.
</p>
<ul>
<li>
{a(
"Tachi Discord Bot Work + Homepage",
"oooOoooo you want to use redux oooo",
"Java Skirt Boy",
"Urbit Enjoyer",
)}
: <strong>pfych</strong>
</li>
<li>
{a("Mikado", "SDVX Pocky")}: <strong>adamaq01</strong>
</li>
<li>
{a("Fervidex", "IIDX Black Magic")}: <strong>aixxe</strong>
</li>
<li>
{a("Barbatos", "SDVX Black Magic")}: <strong>Arm1stice</strong>
</li>
<li>
{a(
"Graphic Design",
"Adobe Suite Purchaser",
"Squiggly Line Drawer",
"Straight Line Drawer",
"Ratboy Genius",
"Large Headded Individual",
"The Ace Of Craigs",
)}
: <strong>Craig</strong>
</li>
<li>
{a(
"Database Management, Various features, generally just a hell of a lot of work",
"This guy put emojis in my codebase",
"Emacs Evangelist",
)}
: <strong>cg505</strong>
</li>
<li>
{a("KsHook", "Konaste Black Magic")}: <strong>Emma</strong>
</li>
<li>
{a("APIs, Databasing", "All Black Magic")}: <strong>Felix</strong>
</li>
<li>
{a("APIs, Massive Dev Support", "Have you tried Elixir?")}:{" "}
<strong>haste</strong>
</li>
<li>
{a("Chunitachi", "CHUNITHM Black Magic")}: <strong>tomatosoup</strong>
</li>
<li>
{a(
"Dev, Maths Consultation",
"Functional Programming Evangelist",
"Born On The Cob",
"Crunchy Nut Enjoyer",
"Has An Afro",
)}
: <strong>Percyqaz</strong>
</li>
<li>
{a("Server", "Ethereum Mining Solutions")}: <strong>viddy</strong>
<br />
<small>Yes, the entire server, networking costs, everything.</small>
</li>
</ul>
</div>
<div className="mt-6">
<h1>Contributors</h1>
<p>These people have contributed to {TachiConfig.NAME}.</p>
<ul>
{Contributors.slice(0)
.sort((a, b) => a.localeCompare(b))
.map((e) => (
<li key={e}>{e}</li>
))}
</ul>
</div>
<div className="mt-6">
<h1>And...</h1>
<p>
Everyone who was part of the beta.
{user?.badges.some((x) => x === "beta" || x === "alpha")
? " (That's you!)"
: ""}
</p>
<p>
Everyone in the <code>#dev</code> chat for the constant advice and comedy gold.
</p>
</div>
<span className="text-body-secondary" style={{ fontSize: "0.2rem" }}>
Click the V in Dev Team.
</span>
</div>
);
}
@@ -1,18 +1,8 @@
import { TachiConfig } from "#lib/config";
import React, { useEffect, useState } from "react";
import React from "react";
import { type UserDocument } from "tachi-common";
export default function SupportBanner({ user }: { user: UserDocument }) {
// const { data, error } = useApiQuery<{ scores: integer; sessions: integer }>(
// `/users/${user.id}/stats`,
// );
const [show, _setShow] = useState(localStorage.getItem("SHOW_SUPPORT_TACHI") === "true");
useEffect(() => {
localStorage.setItem("SHOW_SUPPORT_TACHI", `${show}`);
}, [show]);
// thank you
if (user.isSupporter) {
return (
@@ -23,69 +13,4 @@ export default function SupportBanner({ user }: { user: UserDocument }) {
}
return <></>;
// if (!data) {
// return <></>;
// }
// if (error) {
// return <></>;
// }
// if (data.scores < 1_000) {
// return <></>;
// }
// // too soon to bother
// if (Date.now() - user.joinDate < ONE_DAY * 7) {
// return <></>;
// }
// if (!show) {
// return (
// <div
// className="d-flex w-100 justify-content-center flex-column align-items-center"
// onClick={() => setShow(true)}
// >
// <div>Support us? ❤️</div>
// <div>
// <Icon type="chevron-down" />
// </div>
// </div>
// );
// }
// return (
// <Card
// className="mb-8"
// footer={
// <div className="d-flex w-100 justify-content-center" onClick={() => setShow(false)}>
// <Icon type="chevron-up" />
// </div>
// }
// header={
// <span style={{ fontSize: "1.55rem" }}>
// You've set {data.scores} scores and had {data.sessions} sessions, wew!
// </span>
// }
// >
// <span style={{ fontSize: "1.15rem" }}>
// {TachiConfig.NAME} is a passion project, and is primarily developed by one person.
// <br />
// Since you're enjoying the site so much, maybe you'd want to support me? :3
// <br />
// <br />
// If you want to support development, you can donate to my{" "}
// <ExternalLink href="https://ko-fi.com/zkrising">Ko-Fi</ExternalLink>, if you
// indicate your account name in the donation, you'll get a shiny name on the site!
// <br />
// I'm working on some new projects in secret. Maybe I'll post some updates on there :P
// <br />
// <br />
// Alternatively, you can star or contribute to the fully-open-source{" "}
// <ExternalLink href="https://github.com/zkldi/Tachi">GitHub Repo</ExternalLink>. This
// makes me look cool to employers!
// </span>
// </Card>
// );
}
@@ -5,7 +5,7 @@ import React from "react";
import { Link } from "react-router-dom";
export default function SupportMePage() {
useSetSubheader("Support / Ko-fi");
useSetSubheader("Support");
return (
<div style={{ fontSize: "1.15rem" }}>
@@ -14,11 +14,7 @@ export default function SupportMePage() {
<Link to="/credits">people like you</Link>.
</p>
<p>
If you want to support {TachiConfig.NAME} development, you can donate to my{" "}
<ExternalLink href="https://ko-fi.com/zkrising">Ko-fi</ExternalLink>.
</p>
<p>
Alternatively, you can star the{" "}
You can star the{" "}
<ExternalLink href="https://github.com/zkldi/Tachi">GitHub Repo</ExternalLink>. This
makes me look cool to employers!
</p>
@@ -1,3 +1,4 @@
import CreditsPage from "#app/pages/dashboard/misc/CreditsPage";
import MyProposalsPage from "#app/pages/dashboard/proposals/MyProposalsPage";
import ProposalsPage from "#app/pages/dashboard/proposals/ProposalsPage";
import SearchPage from "#app/pages/dashboard/search/SearchPage";
@@ -95,6 +96,10 @@ export default function DashboardRoutes() {
<PrivacyPolicyPage />
</Route>
<Route exact path="/credits">
<CreditsPage />
</Route>
{/* <Route exact path="/support">
<SupportMePage />
</Route> */}
@@ -19,6 +19,7 @@ import MikadoPage from "#app/pages/dashboard/import/MikadoPage";
import OngekiArtemisExportPage from "#app/pages/dashboard/import/OngekiArtemisExportPage";
import OngekiInoharaPage from "#app/pages/dashboard/import/OngekiInoharaPage";
import OngekiSiteImportPage from "#app/pages/dashboard/import/OngekiSiteImportPage";
import RizuPage from "#app/pages/dashboard/import/RizuPage";
import SaekawaPage from "#app/pages/dashboard/import/SaekawaPage";
import SDVXEamCSVPage from "#app/pages/dashboard/import/SDVXEamCSVPage";
import SilentHookPage from "#app/pages/dashboard/import/SilentHookPage";
@@ -255,6 +256,10 @@ export default function ImportRoutes() {
<WACCAMyPageScraperPage />
</Route>
<Route exact path="/import/rizu">
<RizuPage />
</Route>
<Route exact path="/import/kt-maimaidx-site-importer">
<MaimaiDXSiteImportPage />
</Route>
@@ -45,8 +45,10 @@ export default function ClassBadge<GPT extends V3Game = V3Game>({
</Badge>
);
} else {
const styleWithMaybeShine = classStyle as { shine?: boolean } & React.CSSProperties;
const { shine, ...badgeStyle } = styleWithMaybeShine;
badgeComponent = (
<Badge bg={""} className="mx-2" style={classStyle}>
<Badge bg={""} className={`mx-2${shine ? " shine" : ""}`} style={badgeStyle}>
{data.display}
</Badge>
);
@@ -185,7 +185,9 @@ function ChartInfoMiddle({
const diff = FormatDifficultySearch(chart);
const gameName =
game === "ongeki" ? "オンゲキ" : game === "maimaidx" ? "maimai" : gameGroupConfig.name;
const formattedTitle = song.title.replace(/-/gu, " ");
const formattedTitle = song.title
.replace(/([!?,]){4,}/gu, (m) => m[0].repeat(3))
.replace(/-/gu, " ");
let search = `${gameName} ${formattedTitle}`;
@@ -16,9 +16,14 @@ export default function IIDXStyleSongChartInfoFormat({
game: V3Game;
song: SongDocument<"bms" | "chunithm" | "iidx" | "maimaidx" | "ongeki" | "pms" | "popn">;
}) {
const genre =
game === "ongeki"
? ((song as SongDocument<"ongeki">).data.flavorGenre ?? song.data.genre)
: song.data.genre;
return (
<>
<h4>{song.data.genre}</h4>
<h4>{genre}</h4>
<h4 style={{ fontSize: "2.5rem", fontWeight: "bold" }}>{song.title}</h4>
<h4>{song.artist}</h4>
{chart && <h5>({LevelText(chart)})</h5>}
@@ -63,6 +63,14 @@ export function Footer() {
>
GDPR
</Nav.Link>
<Nav.Link
as={Link}
className={linkClassNames}
onClick={() => window.scrollTo(0, 0)}
to="/credits"
>
Credits
</Nav.Link>
{import.meta.env.VITE_DISCORD && (
<Nav.Link
as={ExternalLink}
@@ -149,7 +149,7 @@ function GraphComponent({
},
]}
difficulty={chart.difficulty}
duration={song.data.duration}
duration={song.data.duration ?? 240}
game="ongeki"
height="360px"
maximumAbsoluteValue={
@@ -25,7 +25,7 @@ import { NumericSOV } from "#util/sorts";
import React from "react";
import { COLOUR_SET, type PBScoreDocument, type ScoreDocument, type V3Game } from "tachi-common";
import { bgc, RAINBOW_EX_GRADIENT, RAINBOW_GRADIENT, RAINBOW_SHINY_GRADIENT } from "./games/_util";
import { bgc, RAINBOW_EX_GRADIENT, RAINBOW_GRADIENT } from "./games/_util";
import { ARCAEA_TOUCH_IMPL } from "./games/arcaea";
import { BMS_7K_IMPL, BMS_14K_IMPL, PMS_IMPL } from "./games/bms-pms";
import { DDR_DP_IMPL, DDR_SP_IMPL } from "./games/ddr";
@@ -785,9 +785,22 @@ export const GPT_CLIENT_IMPLEMENTATIONS: GPTClientImplementations = {
SILVER: bgc("gray", "var(--bs-light)"),
GOLD: bgc("var(--bs-warning)", "var(--bs-dark)"),
PLATINUM: bgc("silver", "var(--bs-dark)"),
RAINBOW: RAINBOW_GRADIENT,
RAINBOW_SHINY: RAINBOW_SHINY_GRADIENT,
RAINBOW_EX: RAINBOW_EX_GRADIENT,
RAINBOW: {
background: "linear-gradient(-45deg, #ff73d6 20%, #00ffff 50%, #ebfb2a 80%)",
color: "var(--bs-dark)",
},
RAINBOW_SHINY: {
background: "linear-gradient(-45deg, #ff73d6 20%, #00ffff 50%, #ebfb2a 80%)",
color: "var(--bs-dark)",
shine: true,
},
RAINBOW_EX: {
background:
"linear-gradient(-45deg, #df7e85 20%, #efef51 40%, #4bee83 60%, #70bdd7 80%)",
color: "var(--bs-dark)",
shine: true,
},
RAINBOW_EX_TRUE: { ...RAINBOW_EX_GRADIENT, shine: true },
},
},
enumColours: {
@@ -845,7 +858,14 @@ export const GPT_CLIENT_IMPLEMENTATIONS: GPTClientImplementations = {
[
"Platinum Score",
"P-Score",
NumericSOV((x) => x.scoreData.platinumStars * 100000 + x.scoreData.platinumScore),
// __related is attached when rendering table rows with chart context
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- NumericSOV row shape
NumericSOV((x: any) => {
if (x.__related?.chart?.data !== undefined) {
return x.scoreData.platinumScore / x.__related.chart.data.maxPlatScore;
}
return x.scoreData.platinumStars * 100000 + x.scoreData.platinumScore;
}),
],
["Judgements", "Notes", NumericSOV((x) => x.scoreData.judgements.cbreak ?? 0)],
[
-6
View File
@@ -36,12 +36,6 @@ export const RAINBOW_GRADIENT = {
color: "var(--bs-dark)",
} as const;
export const RAINBOW_SHINY_GRADIENT = {
background:
"linear-gradient(-45deg, #ff8697, #ff9dbf, #9e81d0, #87caff, #7dae80, #ffffa7, #ffd88a, #ffab8d, #ff8697)",
color: "var(--bs-dark)",
} as const;
export const RAINBOW_EX_GRADIENT = {
background: "linear-gradient(-45deg, #0fa091, #0f98d5, #67087f, #d9007e, #f56e06)",
color: "var(--bs-light)",
+1 -1
View File
@@ -65,13 +65,13 @@ export type GPTClassColours<GPT extends V3Game> = {
// css properties => css
// null -> no styling
[V in ClassConfigs[GPT][C]["values"][number]["id"]]:
| ({ shine?: boolean } & CSSProperties)
| "danger"
| "info"
| "primary"
| "secondary"
| "success"
| "warning"
| CSSProperties
| null;
};
};
@@ -6,3 +6,35 @@
opacity: 1;
}
}
@keyframes shine {
0% {
top: -150%;
left: -150%;
}
100% {
top: 150%;
left: 150%;
}
}
.shine {
position: relative;
overflow: hidden;
}
.shine::before {
background: linear-gradient(
transparent,
rgba(255, 255, 255, 0.5) 50%,
transparent
);
content: "";
display: block;
width: 150%;
height: 2rem;
position: absolute;
transform: rotate(-45deg);
animation: shine 4s infinite ease-in-out;
z-index: 100;
}
@@ -23,7 +23,8 @@ export const GAME_GROUP_ONGEKI_CONF = {
"LUNATIC",
"ボーナストラック",
]),
duration: z.number(),
duration: z.number().nullable(),
flavorGenre: z.string().optional(),
}),
} as const satisfies INTERNAL_GAME_GROUP_CONFIG;
@@ -39,7 +40,8 @@ export const OngekiColours = [
ClassValue("PLATINUM", "鉑", "Platinum: 18.000~18.999 Rating"),
ClassValue("RAINBOW", "虹", "Rainbow: 19.000~19.999 Rating"),
ClassValue("RAINBOW_SHINY", "虹(光)", "Rainbow Shiny: 20.000~20.999 Rating"),
ClassValue("RAINBOW_EX", "虹(極)", "Rainbow Extreme: 21.000~ Rating"),
ClassValue("RAINBOW_EX", "虹(極)", "Rainbow Extreme: 21.000~21.999 Rating"),
ClassValue("RAINBOW_EX_TRUE", "虹(極)・真", "Rainbow Extreme (True): 22.000~ Rating"),
];
export const GAME_ONGEKI_CONF = {
@@ -228,11 +230,11 @@ export const GAME_ONGEKI_CONF = {
"オンゲキ bright MEMORY Act.3",
"オンゲキ Re:Fresh",
]),
isBonusTrack: z.boolean(),
isReMaster: z.boolean().optional(),
maxPlatScore: z.number().int(),
inGameID: z.number().int(),
maxPlatScore: z.number().int().nonnegative(),
inGameID: z.number().int().nonnegative().nullable(),
chartViewURL: z.string().optional(),
isBonusTrack: z.boolean().optional(),
}),
preferences: z.strictObject({}),
+1
View File
@@ -612,6 +612,7 @@ export enum ONGEKI_COLOURS {
PURPLE = 4,
RAINBOW = 9,
RAINBOW_EX = 11,
RAINBOW_EX_TRUE = 12,
RAINBOW_SHINY = 10,
RED = 3,
SILVER = 6,
@@ -106,7 +106,7 @@ export async function GetBestJubilityOnSongs(
return Promise.all(rows.rows.map((row) => ToPbScoreDocument(row)));
}
const CURRENT_JUBEAT_HOT_VERSION: Versions["jubeat"] = "ave";
const CURRENT_JUBEAT_HOT_VERSION: Versions["jubeat"] = "beyond";
export async function GetPBsForJubility(userID: integer) {
const hotSongRows = await DB.selectFrom("song")
@@ -293,6 +293,8 @@ describe("ONGEKI_IMPL", () => {
c(19, "RAINBOW");
c(20, "RAINBOW_SHINY");
c(21, "RAINBOW_EX");
c(22, "RAINBOW_EX_TRUE");
c(23, "RAINBOW_EX_TRUE");
});
});
@@ -16,8 +16,13 @@ import {
import { GoalFmtScore, GoalOutOfFmtScore, GradeGoalFormatter } from "./_common";
const isUnranked = (chart: ChartDocument<"ongeki">) =>
(chart.data.inGameID >= 7000 && chart.data.inGameID < 8000) || chart.levelNum === 0.0;
const isUnranked = (chart: ChartDocument<"ongeki">) => {
const ig = chart.data.inGameID;
return (
(ig !== null && ig >= 7000 && ig < 8000) ||
chart.levelNum === 0.0
);
};
const starCount = (platinumScore: number, maxPlatinumScore: number) => {
const pct = Math.floor((platinumScore / maxPlatinumScore) * 100);
@@ -113,7 +118,9 @@ export const ONGEKI_IMPL: GameImplementation<"ongeki"> = {
return { colour: null };
}
if (rating >= 21) {
if (rating >= 22) {
return { colour: "RAINBOW_EX_TRUE" };
} else if (rating >= 21) {
return { colour: "RAINBOW_EX" };
} else if (rating >= 20) {
return { colour: "RAINBOW_SHINY" };
@@ -230,9 +237,11 @@ export const ONGEKI_IMPL: GameImplementation<"ongeki"> = {
}
}
if (s.scoreData.bellLamp === "FULL BELL" && s.scoreData.noteLamp === "LOSS") {
return "Cannot have a LOSS with a FULL BELL.";
}
// LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO
// if (s.scoreData.bellLamp === "FULL BELL" && s.scoreData.noteLamp === "LOSS") {
// return "Cannot have a LOSS with a FULL BELL.";
// }
// LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO
if (s.scoreData.platinumScore > chart.data.maxPlatScore) {
return `Cannot have ${s.scoreData.platinumScore}/${chart.data.maxPlatScore} Platinum Score.`;
@@ -240,6 +240,47 @@ EnableGraphs = true
#
# If present, an * matches everyone else`,
},
{
clientID: "CXRizu",
requestedPermissions: ["submit_score"],
name: "Rizu",
redirectUri: null,
webhookUri: null,
apiKeyFilename: "Rizu.cfg",
apiKeyTemplate: `[General]
## Whether to enable score submissions
# Setting type: Boolean
# Default value: true
Enable = true
## Timeout for score submission in seconds
# Setting type: Int32
# Default value: 30
NetworkTimeout = 30
## Folder for storing imports that failed due to network errors.
## Leave empty to disable
# Setting type: String
# Default value: UserData/Rizu/FailedImports
FailedImportsFolder = UserData/Rizu/FailedImports
[Keys]
## Kamaitachi API keys to use for score submissions, in the format
## of \`<access-code> = <api-key>\`. The \`default\` key is used as fallback
## if an access code does not have an API key set, and can be removed.
# Setting type: String
# Default value:
default = %%TACHI_KEY%%
[Tachi]
## Tachi instance base URL
# Setting type: String
# Default value: https://kamai.tachi.ac
BaseUrl = ${ServerConfig.OUR_URL}`,
},
];
const BokuDefaultClients: DefaultClients = [
@@ -119,6 +119,8 @@ function ConvertVersion(ver: number): Versions["jubeat"] {
return "festo";
case 11:
return "ave";
case 12:
return "beyond";
}
throw new InvalidScoreFailure(`Unknown Game Version ${ver}.`);
@@ -9,6 +9,7 @@ import {
type SEEDS_QuestlineDocument,
type SEEDS_SongDocument,
type SEEDS_TableDocument,
type V3Game,
} from "tachi-common";
/* eslint-disable no-await-in-loop */
import type {
@@ -719,8 +719,9 @@ export const CHUNITHMBBKKSong: SongDocument<"chunithm"> = {
altTitles: [],
artist: "nora2r",
data: {
duration: 128.541,
genre: "VARIETY",
duration: 128.541,
displayVersion: "CHUNITHM",
},
id: "S19d35e0b935765ded25",
searchTerms: [],
@@ -736,7 +737,6 @@ export const CHUNITHMBBKKChart: ChartDocument<"chunithm"> = {
level: "3",
data: {
inGameID: 3,
displayVersion: "CHUNITHM",
},
isPrimary: true,
versions: ["paradiselost"],
@@ -1485,6 +1485,7 @@ export const TestingOngekiChart: ChartDocument<"ongeki"> = {
displayVersion: "オンゲキ bright MEMORY Act.3",
inGameID: 2137,
maxPlatScore: 1000,
isBonusTrack: false,
},
difficulty: "MASTER",
isPrimary: true,
@@ -1537,6 +1538,7 @@ export const TestingOngekiChartConverter: ChartDocument<"ongeki"> = {
displayVersion: "オンゲキ bright",
inGameID: 678,
maxPlatScore: 2768,
isBonusTrack: false,
},
difficulty: "MASTER",
isPrimary: true,
@@ -1552,6 +1554,7 @@ export const TestingChunithmSongConverter: SongDocument<"chunithm"> = {
data: {
genre: "POPS & ANIME",
duration: 120,
displayVersion: "CHUNITHM CRYSTAL PLUS",
},
id: "s956",
searchTerms: [],
@@ -1562,7 +1565,6 @@ export const TestingChunithmChartConverter: ChartDocument<"chunithm"> = {
game: "chunithm",
chartID: "fbba26a6a223b1dd0bf8ef139cfee83114b91086",
data: {
displayVersion: "CHUNITHM CRYSTAL PLUS",
inGameID: 956,
},
difficulty: "MASTER",
@@ -1579,6 +1581,7 @@ export const TestingChunithmWESongConverter: SongDocument<"chunithm"> = {
data: {
duration: 135.275,
genre: "VARIETY",
displayVersion: "CHUNITHM NEW PLUS",
},
id: "S19d35e0c127c7e441ce",
searchTerms: ["xl techno more dance"],
@@ -1588,7 +1591,6 @@ export const TestingChunithmWESongConverter: SongDocument<"chunithm"> = {
export const TestingChunithmWEChartConverter: ChartDocument<"chunithm"> = {
game: "chunithm",
data: {
displayVersion: "CHUNITHM NEW PLUS",
inGameID: 8235,
},
difficulty: "割☆4",