fix: 解歌 11820 的查表结论与道具回读容错

排查「解锁 11820 机台不显示」的结果:

- 11820 = Xaleid◆scopiX(xi),lockType=4(MusicLockType.KaleidScope)、
  longMusic=1,eventName 与 subEventName 都是 26100124。
  NotesListManager.cs:251 的分支确认:KaleidScope 曲落到 IsUnlockBase →
  MusicUnlockList,也就是 itemKind 5 的行对它确实有效,包没发错。
  真正卡点是前一道门:曲池准入要 IsOpenEvent(26100124)(NotesListManager.cs:70),
  机台 mai2.ini 的 AllOpen=0,所以完全依赖服务器 GetGameEventApi 给的窗口;
  而 G:\Package 的 StreamingAssets 只装了 A000/A005/A011/A015,没有 A031,
  GetMusic(11820) 直接是 null —— 这是数据没装,不是协议问题。
- 重生成映射表时改用 D:/A031OptDump/Root 作数据根(上一版读错了根):
  现在 music 含 11820、gate 为 1~10(7=棱镜塔、9=希望之门)、
  title 3001→3031、chara 983→987。
- 解锁/收藏品路径里 GetUserItemApi 的回读改成失败可降级:私服不实现它时
  退回一律 '1'(加这段之前的行为),不要让回读把整个解锁功能拖挂。
- 按你的要求删掉 README 的「ID 映射表」一节。
This commit is contained in:
Cookiues committed 2026-10-02 01:51:11 +08:00
1 parent 2c7f9c1de7
commit a5fb2c97cd
8 files changed
+668 -388

No files matched your search

-53
View File
@@ -161,59 +161,6 @@ data/id_mapping/ # 由 tools/gen_id_mapping.dart 从机台数据包抽
`MapTreasure.xml` 里(`DataManager.LoadMaps` / `LoadMapTresures` 从本地数据目录读,
不经 title server),App 没有这份表,页面里也明写了这个限制。
## ID 映射表
风险页要填的全是裸 ID,而「填了机台表里没有的 ID」是这一类功能最常见的失败方式:
服务器照样回 `returnCode: 1`,客户端却在建曲池/建角色池时静默跳过,看起来就是
「上传成功但没生效」。为此把机台数据包里的表抽成可查的映射:
```bash
# 整合包(自动找 <pkg>/Sinmai_Data/StreamingAssets/A0xx/)
dart run tools/gen_id_mapping.dart --package G:/Package
# 再叠一层单独导出的数据包,后面的覆盖前面的同 ID 行
dart run tools/gen_id_mapping.dart --package G:/Package --data-root D:/A031OptDump/Root
```
产物落在 `data/id_mapping/`:
| 文件 | 内容 |
| --- | --- |
| `music.json` | musicId → 曲名 / 艺术家 / 流派 / `AddVersion` / `disable` / `lockType` / `subLockType` / `eventName` |
| `items.json` | 按 `ItemKind` 分组(1 姓名框 2 称号 3 头像 9 角色 10 搭档 11 背景板 12 功能票)的 id → 名称 |
| `maps.json` | mapId → 区域名 / `IslandId` / `OpenEventId` / `ColorId` / `BonusMusicId` / `IsInfinity` / `IsCollabo` |
| `gates.json` | 万花筒三张表:`gateList`(gateId → 门名 / `gateType` / `eventName`)、`courseList`(courseId ↔ gateId ↔ keyId)、`keyList` |
| `events.json` | eventId → 活动名 / `alwaysOpen` / `infoType` / `disableArea` |
要点:
- 真正的 ID 在 XML 的 `<name><id>` 里,**目录名只是 `dataName`,两者不相等**
(`icon/icon550201/Icon.xml` 的 `name.id` 实际是 1;`music/music111537` 的
`name.id` 是 111537,属宴曲段)。
- 数据包按 `Sinmai_Data/StreamingAssets/A0xx/` 分基础包与增补包,抽取时按目录名
升序合并、同 ID 后者覆盖前者,与客户端 `DataManager.LoadData` 的语义一致。
- **本地 event 表没有日期窗口**:开关状态是服务器 `GetGameEventApi` 的
`GameEvent{startDate,endDate}` 决定的。`events.json` 只能告诉你某个
`eventName.id` 是哪个活动、是否 `alwaysOpen`,判断「现在开没开」得问服务器。
- 放在 `data/` 而不是 `assets/`:目前还没有代码在运行时读它,进 `assets/` 会被
原样打进每个安装包(约 1.2MB)。真要接进 App 时再连同 `pubspec.yaml` 一起挪。
顺手用这份表核出来的几个事实,都能解释此前的「不显示」:
- **musicId 11820 在任何一层数据包里都不存在**(11819、11821 也不在;11814 之后
直接跳到 11822,G:\Package 与 D:/A031OptDump 两层都查过)。它不是万花筒锁——
`lockType = 4 (KaleidScope)` 的歌整张表只有 6 首(11740 / 11745 / 11749 /
11753 / 11809 / 11814)。11820 属于「机台没这首歌」,任何 `UpsertUserAll`
都变不出来。
- `lockType` 的分布是 `Unlock=1347 / Lock=18 / Challenge=5 / Transmission=2 /
KaleidScope=6`(合并两层数据包后共 1378 首),所以绝大多数歌根本不查
`itemKind 5`(`lockType == Unlock` 时 `IsPlayable` 直接为 true)——这也解释了
为什么有些「解歌」包发下去看不出效果:那首歌本来就可玩。
- **角色(旅行伙伴)1001 不存在**,合法 ID 从 101 起,整表 983 条、上界到 605905。
以前页面里「例如 1001」的提示正是这个坑。
- **万花筒只有 gate 1~6**(蓝/白/紫/黑/黄/红,course 与 key 同为 1~6 一一对应)。
客户端 `ForceAddMasterKey` 写死的 `gateId = 7`(万能钥匙门)在这份数据里没有对应行。
## 构建环境注意事项
以下问题在本仓库已确认,改动依赖或升级 Flutter 时请留意:
+119 -119
View File
@@ -5627,6 +5627,125 @@
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100111,
"name": "261001_01_1:7sRefちほー4 紹介",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100112,
"name": "261001_01_2:連動楽曲紹介《サウンドプレイヤー》",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100113,
"name": "261001_01_3:伝導楽曲の条件緩和(2回目)紹介",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100121,
"name": "261001_02_1:7sRefちほー4 4曲(Lock)追加",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100122,
"name": "261001_02_2:楽曲解禁(イベント1)",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100123,
"name": "261001_02_3:楽曲解禁(希望)",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100124,
"name": "261001_02_4:楽曲解禁(イベント2)",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100125,
"name": "261001_02_5:楽曲解禁(エクストラ)",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100126,
"name": "261001_02_6:チュウニズム&オンゲキ1曲紹介《サウンドプレイヤー》",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100127,
"name": "261001_02_7:NEEDY GIRL OVERDOSEちほー2(1曲)一般開放《きゅびびびびずむ》",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100131,
"name": "261001_03_1:7sRefちほー4 解禁",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100132,
"name": "261001_03_2:虹のカレイドスコープ解禁",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100133,
"name": "261001_03_3:カレイドスコープ解禁(イベント1)",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100134,
"name": "261001_03_4:希望の扉解禁",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100135,
"name": "261001_03_5:カレイドスコープ解禁(イベント2)",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100151,
"name": "261001_05_1:7sRefちほー4 パーフェクトチャレンジ",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 26100191,
"name": "261001_09_1:伝導楽曲の条件緩和(2回目)",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 240904110,
"name": "240904_01_10:WEC2024告知",
@@ -5647,124 +5766,5 @@
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261002011,
"name": "261002_01_1:ヒメヒナちほー2 紹介",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261002012,
"name": "261002_01_2:ヒメヒナちほー 紹介",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261002013,
"name": "261002_01_3:宴譜面紹介4",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261002014,
"name": "261002_01_4:伝導楽曲紹介",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261002021,
"name": "261002_02_1:ヒメヒナちほー2 3曲追加《キスキツネ、WWW、うたかたよいかないで》",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261002022,
"name": "261002_02_2:宴譜面追加4",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261002023,
"name": "261002_02_3:オンゲキちほー9一般開放《ICEBURN、Daredevil Glaive》",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261002024,
"name": "261002_02_4:伝導楽曲 1曲(Lock)",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261002041,
"name": "261002_04_1:ヒメヒナちほー2 解禁",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261002042,
"name": "261002_04_2:ヒメヒナちほー 復刻",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261016011,
"name": "261016_01_1:niconico2曲、バラエティ1曲紹介《Intergalactic Bound、LEMON MELON COOKIE、3rd Avenue》",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261016012,
"name": "261016_01_2:バラエティ1曲紹介《Cryogenic》",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261016013,
"name": "261016_01_3:《Cryogenic》アドバタイズムービー1",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261016014,
"name": "261016_01_4:宴譜面紹介3",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261016021,
"name": "261016_02_1:niconico2曲、バラエティ1曲追加《Intergalactic Bound、LEMON MELON COOKIE、3rd Avenue》",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261016022,
"name": "261016_02_2:バラエティ1曲追加《Cryogenic》",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
},
{
"id": 261016023,
"name": "261016_02_3:宴譜面追加3",
"infoType": 0,
"alwaysOpen": false,
"disableArea": "---"
}
]
+88
View File
@@ -47,6 +47,38 @@
"eventNameName": "260805_03_2:赤のカレイドスコープ解禁",
"gateType": "Normal",
"positionId": 4
},
{
"id": 7,
"name": "棱镜塔",
"eventName": 26100132,
"eventNameName": "261001_03_2:虹のカレイドスコープ解禁",
"gateType": "CenterTower",
"positionId": 7
},
{
"id": 8,
"name": "KALEIDXSCOPE",
"eventName": 26100133,
"eventNameName": "261001_03_3:カレイドスコープ解禁(イベント1)",
"gateType": "Boss",
"positionId": 7
},
{
"id": 9,
"name": "希望之门",
"eventName": 26100134,
"eventNameName": "261001_03_4:希望の扉解禁",
"gateType": "Hope",
"positionId": 0
},
{
"id": 10,
"name": "KALEIDXSCOPE",
"eventName": 26100135,
"eventNameName": "261001_03_5:カレイドスコープ解禁(イベント2)",
"gateType": "LastBoss",
"positionId": 0
}
],
"courseList": [
@@ -97,6 +129,38 @@
"gateNameName": "红色之门",
"keyName": 6,
"keyNameName": "红色钥匙"
},
{
"id": 7,
"name": "虹のカレイドスコープ",
"gateName": 7,
"gateNameName": "棱镜塔",
"keyName": 7,
"keyNameName": "万能钥匙"
},
{
"id": 8,
"name": "KALEIDXSCOPE",
"gateName": 8,
"gateNameName": "KALEIDXSCOPE",
"keyName": 8,
"keyNameName": "なし"
},
{
"id": 9,
"name": "希望の扉",
"gateName": 9,
"gateNameName": "希望之门",
"keyName": 9,
"keyNameName": "希望钥匙"
},
{
"id": 10,
"name": "KALEIDXSCOPE",
"gateName": 10,
"gateNameName": "KALEIDXSCOPE",
"keyName": 10,
"keyNameName": "KALEIDXSCOPEの鍵"
}
],
"keyList": [
@@ -135,6 +199,30 @@
"name": "红色钥匙",
"gateName": 6,
"gateNameName": "红色之门"
},
{
"id": 7,
"name": "万能钥匙",
"gateName": 7,
"gateNameName": "棱镜塔"
},
{
"id": 8,
"name": "なし",
"gateName": 8,
"gateNameName": "KALEIDXSCOPE"
},
{
"id": 9,
"name": "希望钥匙",
"gateName": 9,
"gateNameName": "希望之门"
},
{
"id": 10,
"name": "KALEIDXSCOPEの鍵",
"gateName": 10,
"gateNameName": "KALEIDXSCOPE"
}
]
}
+240 -4
View File
@@ -1444,6 +1444,10 @@
"id": 550201,
"name": "ドラゴンちほー4"
},
{
"id": 550301,
"name": "7sRefちほー4"
},
{
"id": 550401,
"name": "プリズムちほー2"
@@ -1564,6 +1568,10 @@
"id": 558032,
"name": "♡みるく(ぷりずむ)♡"
},
{
"id": 558034,
"name": "♡リズ♡"
},
{
"id": 559101,
"name": "鏡極"
@@ -12718,6 +12726,22 @@
"id": 550299,
"name": "過誤の歴史の信奉者"
},
{
"id": 550301,
"name": "W?K?Y? すき"
},
{
"id": 550302,
"name": "ロートスカラ 推し"
},
{
"id": 550303,
"name": "アシッド ガチ勢"
},
{
"id": 550399,
"name": "有限で永遠のリフレインを"
},
{
"id": 555101,
"name": "超てんちゃん(てんしのたからばこ) 推し"
@@ -13014,6 +13038,30 @@
"id": 558114,
"name": "FLΛME/FRΦST"
},
{
"id": 558115,
"name": "IMBRUED:FLUX"
},
{
"id": 558116,
"name": "砂の函"
},
{
"id": 558117,
"name": "Amereistr"
},
{
"id": 558118,
"name": "World's end BLACKBOX"
},
{
"id": 558119,
"name": "Xaleid◆scopiX"
},
{
"id": 558120,
"name": "Ref:rain (for 7th Heaven)"
},
{
"id": 558121,
"name": "Supersonic Generation"
@@ -13238,10 +13286,18 @@
"id": 558176,
"name": "Pixel Galaxy"
},
{
"id": 558177,
"name": "Believe the Rainbow"
},
{
"id": 558178,
"name": "MYTH Re:LEASE"
},
{
"id": 558179,
"name": "AFTER PANDORA"
},
{
"id": 558501,
"name": "老人がとなりでじっと見てたよ"
@@ -13498,6 +13554,14 @@
"id": 558565,
"name": "地獄絵図"
},
{
"id": 558566,
"name": "FiNEM MUNDi"
},
{
"id": 558567,
"name": "WIREPULLER"
},
{
"id": 558568,
"name": "crazy Crazy 狂razy"
@@ -13526,14 +13590,82 @@
"id": 559132,
"name": "みるく(ぷりずむ)のパートナー"
},
{
"id": 559134,
"name": "リズのパートナー"
},
{
"id": 559232,
"name": "みるく(ぷりずむ)の相棒"
},
{
"id": 559234,
"name": "リズの相棒"
},
{
"id": 559332,
"name": "キラめくおしゃまな魔法使い"
},
{
"id": 559334,
"name": "世界の摂理を静観する者"
},
{
"id": 559501,
"name": "【差出人不明のデータ1】"
},
{
"id": 559502,
"name": "【差出人不明のデータ2】"
},
{
"id": 559503,
"name": "【差出人不明のデータ3】"
},
{
"id": 559504,
"name": "【差出人不明のデータ4】"
},
{
"id": 559505,
"name": "【差出人不明のデータ5】"
},
{
"id": 559506,
"name": "【差出人不明のデータ6】"
},
{
"id": 559507,
"name": "【差出人不明のデータ7】"
},
{
"id": 559508,
"name": "【差出人不明のデータ8】"
},
{
"id": 559509,
"name": "【差出人不明のデータ9】"
},
{
"id": 559510,
"name": "【差出人不明のデータ10】"
},
{
"id": 559511,
"name": "【差出人不明のデータ11】"
},
{
"id": 559512,
"name": "【差出人不明のデータ12】"
},
{
"id": 559998,
"name": "希望之门已经打开"
},
{
"id": 559999,
"name": "サイゴノキボウ ヲミツケテ"
},
{
"id": 605901,
"name": "アルカイド 推し"
@@ -13593,10 +13725,6 @@
{
"id": 609000,
"name": "WEC2026 以光之明"
},
{
"id": 708106,
"name": "OV3RCLOCK"
}
],
"3": [
@@ -17548,6 +17676,18 @@
"id": 550204,
"name": "ドラゴンの王"
},
{
"id": 550301,
"name": "W?K?Y?"
},
{
"id": 550302,
"name": "ロートスカラ"
},
{
"id": 550303,
"name": "アシッド"
},
{
"id": 555101,
"name": "超てんちゃん(てんしのたからばこ)"
@@ -17756,6 +17896,10 @@
"id": 558032,
"name": "♡みるく(ぷりずむ)♡"
},
{
"id": 558034,
"name": "♡リズ♡"
},
{
"id": 559501,
"name": "KALEIDXSCOPE -はじまりエリア-"
@@ -17764,6 +17908,42 @@
"id": 559502,
"name": "KALEIDXSCOPE -世界樹エリア-"
},
{
"id": 559503,
"name": "KALEIDXSCOPE -プリズムエリア-"
},
{
"id": 559504,
"name": "KALEIDXSCOPE -旧き世界-"
},
{
"id": 559505,
"name": "KALEIDXSCOPE -PRiSM-"
},
{
"id": 559506,
"name": "閉ざされた青の扉"
},
{
"id": 559507,
"name": "閉ざされた白の扉"
},
{
"id": 559508,
"name": "閉ざされた紫の扉"
},
{
"id": 559509,
"name": "閉ざされた黒の扉"
},
{
"id": 559510,
"name": "閉ざされた黄の扉"
},
{
"id": 559511,
"name": "閉ざされた赤の扉"
},
{
"id": 605901,
"name": "アルカイド"
@@ -23348,6 +23528,24 @@
"genre": 550002,
"genreName": "ドラゴンちほー4"
},
{
"id": 550301,
"name": "W?K?Y?",
"genre": 550003,
"genreName": "7sRefちほー4"
},
{
"id": 550302,
"name": "ロートスカラ",
"genre": 550003,
"genreName": "7sRefちほー4"
},
{
"id": 550303,
"name": "アシッド",
"genre": 550003,
"genreName": "7sRefちほー4"
},
{
"id": 555101,
"name": "超てんちゃん(てんしのたからばこ)",
@@ -23654,6 +23852,12 @@
"genre": 550060,
"genreName": "Phigrosちほー"
},
{
"id": 559999,
"name": "希望钥匙",
"genre": 550003,
"genreName": "7sRefちほー4"
},
{
"id": 605901,
"name": "アルカイド",
@@ -24988,6 +25192,34 @@
"id": 550202,
"name": "KALEIDXSCOPE -世界樹エリア-"
},
{
"id": 550301,
"name": "7sRefちほー4"
},
{
"id": 550302,
"name": "KALEIDXSCOPE -プリズムエリア-"
},
{
"id": 550303,
"name": "KALEIDXSCOPE -旧き世界-"
},
{
"id": 550304,
"name": "KALEIDXSCOPE -アシッド-"
},
{
"id": 550305,
"name": "KALEIDXSCOPE -プリズム-"
},
{
"id": 550306,
"name": "KALEIDXSCOPE -PRiSM-"
},
{
"id": 550307,
"name": "KALEIDXSCOPE -Ref:rain-"
},
{
"id": 550401,
"name": "プリズムちほー2"
@@ -25160,6 +25392,10 @@
"id": 558032,
"name": "♡みるく(ぷりずむ)♡"
},
{
"id": 558034,
"name": "♡リズ♡"
},
{
"id": 559504,
"name": "Cryptarithm"
+14 -14
View File
@@ -2281,6 +2281,20 @@
"IsCollabo": false,
"IsInfinity": false
},
{
"id": 550003,
"name": "7sRef区域4",
"IslandId": 50,
"IslandIdName": "maimaiDX PRiSM",
"OpenEventId": 26100131,
"OpenEventIdName": "261001_03_1:7sRefちほー4 解禁",
"ColorId": 550003,
"ColorIdName": "7sRef4",
"BonusMusicId": 550003,
"BonusMusicIdName": "7sRefちほー4ボーナス曲",
"IsCollabo": false,
"IsInfinity": false
},
{
"id": 550004,
"name": "棱镜区域2",
@@ -2350,19 +2364,5 @@
"BonusMusicIdName": "Paradigm: Rebootちほーボーナス曲",
"IsCollabo": true,
"IsInfinity": false
},
{
"id": 650056,
"name": "ヒメヒナちほー2",
"IslandId": 60,
"IslandIdName": "maimaiDX CiRCLE",
"OpenEventId": 261002041,
"OpenEventIdName": "261002_04_1:ヒメヒナちほー2 解禁",
"ColorId": 650056,
"ColorIdName": "ヒメヒナ2",
"BonusMusicId": 650056,
"BonusMusicIdName": "ヒメヒナちほー2ボーナス曲",
"IsCollabo": true,
"IsInfinity": false
}
]
+8 -8
View File
@@ -9,16 +9,16 @@
"counts": {
"music": 1378,
"map": 169,
"gate": 6,
"course": 6,
"key": 6,
"gate": 10,
"course": 10,
"key": 10,
"event": 824,
"itemKind1": 398,
"itemKind2": 3001,
"itemKind3": 1046,
"itemKind9": 983,
"itemKind1": 400,
"itemKind2": 3031,
"itemKind3": 1059,
"itemKind9": 987,
"itemKind10": 25,
"itemKind11": 345,
"itemKind11": 353,
"itemKind12": 11
}
}
+188 -188
View File
@@ -9196,6 +9196,40 @@
"longMusic": 0,
"version": 25003
},
{
"id": 1736,
"name": "プリズム△▽リズム",
"artistName": 462,
"artistNameName": "Shoichiro Hirata feat.Sana",
"genreName": 105,
"genreNameName": "maimai",
"AddVersion": 24,
"AddVersionName": "PRiSMPLUS",
"eventName": 26100123,
"eventNameName": "261001_02_3:楽曲解禁(希望)",
"disable": false,
"lockType": 4,
"subLockType": 1,
"longMusic": 0,
"version": 25504
},
{
"id": 1819,
"name": "AFTER PANDORA",
"artistName": 366,
"artistNameName": "削除",
"genreName": 105,
"genreNameName": "maimai",
"AddVersion": 24,
"AddVersionName": "PRiSMPLUS",
"eventName": 26100123,
"eventNameName": "261001_02_3:楽曲解禁(希望)",
"disable": false,
"lockType": 4,
"subLockType": 1,
"longMusic": 0,
"version": 25504
},
{
"id": 10030,
"name": "ネコ日和。",
@@ -10029,6 +10063,23 @@
"longMusic": 0,
"version": 20106
},
{
"id": 10835,
"name": "Believe the Rainbow",
"artistName": 462,
"artistNameName": "Shoichiro Hirata feat.Sana",
"genreName": 105,
"genreNameName": "maimai",
"AddVersion": 24,
"AddVersionName": "PRiSMPLUS",
"eventName": 26100123,
"eventNameName": "261001_02_3:楽曲解禁(希望)",
"disable": false,
"lockType": 4,
"subLockType": 1,
"longMusic": 0,
"version": 25504
},
{
"id": 11001,
"name": "BLACK ROSE",
@@ -18969,7 +19020,7 @@
"lockType": 0,
"subLockType": 1,
"longMusic": 0,
"version": 24003
"version": 24006
},
{
"id": 11640,
@@ -21776,6 +21827,108 @@
"longMusic": 0,
"version": 25502
},
{
"id": 11815,
"name": "IMBRUED:FLUX",
"artistName": 1022,
"artistNameName": "qfeileadh feat.のあ",
"genreName": 105,
"genreNameName": "maimai",
"AddVersion": 24,
"AddVersionName": "PRiSMPLUS",
"eventName": 26100121,
"eventNameName": "261001_02_1:7sRefちほー4 4曲(Lock)追加",
"disable": false,
"lockType": 1,
"subLockType": 1,
"longMusic": 0,
"version": 25504
},
{
"id": 11816,
"name": "砂の函",
"artistName": 1023,
"artistNameName": "Nego_tiator",
"genreName": 105,
"genreNameName": "maimai",
"AddVersion": 24,
"AddVersionName": "PRiSMPLUS",
"eventName": 26100121,
"eventNameName": "261001_02_1:7sRefちほー4 4曲(Lock)追加",
"disable": false,
"lockType": 1,
"subLockType": 1,
"longMusic": 0,
"version": 25504
},
{
"id": 11817,
"name": "Amereistr",
"artistName": 1029,
"artistNameName": "rN",
"genreName": 105,
"genreNameName": "maimai",
"AddVersion": 24,
"AddVersionName": "PRiSMPLUS",
"eventName": 26100121,
"eventNameName": "261001_02_1:7sRefちほー4 4曲(Lock)追加",
"disable": false,
"lockType": 2,
"subLockType": 1,
"longMusic": 0,
"version": 25504
},
{
"id": 11818,
"name": "World's end BLACKBOX",
"artistName": 761,
"artistNameName": "打打だいず",
"genreName": 105,
"genreNameName": "maimai",
"AddVersion": 24,
"AddVersionName": "PRiSMPLUS",
"eventName": 26100121,
"eventNameName": "261001_02_1:7sRefちほー4 4曲(Lock)追加",
"disable": false,
"lockType": 4,
"subLockType": 1,
"longMusic": 0,
"version": 25504
},
{
"id": 11820,
"name": "Xaleid◆scopiX",
"artistName": 232,
"artistNameName": "xi",
"genreName": 105,
"genreNameName": "maimai",
"AddVersion": 24,
"AddVersionName": "PRiSMPLUS",
"eventName": 26100124,
"eventNameName": "261001_02_4:楽曲解禁(イベント2)",
"disable": false,
"lockType": 4,
"subLockType": 0,
"longMusic": 1,
"version": 25504
},
{
"id": 11821,
"name": "Ref:rain (for 7th Heaven)",
"artistName": 1054,
"artistNameName": "カモメサノエレクトリックオーケストラ include Limonène",
"genreName": 105,
"genreNameName": "maimai",
"AddVersion": 24,
"AddVersionName": "PRiSMPLUS",
"eventName": 26100125,
"eventNameName": "261001_02_5:楽曲解禁(エクストラ)",
"disable": false,
"lockType": 4,
"subLockType": 1,
"longMusic": 1,
"version": 25504
},
{
"id": 11822,
"name": "Supersonic Generation",
@@ -21827,6 +21980,23 @@
"longMusic": 0,
"version": 25502
},
{
"id": 11827,
"name": "サウンドプレイヤー",
"artistName": 1026,
"artistNameName": "tilt-six feat.バル",
"genreName": 106,
"genreNameName": "オンゲキCHUNITHM",
"AddVersion": 24,
"AddVersionName": "PRiSMPLUS",
"eventName": 26100126,
"eventNameName": "261001_02_6:チュウニズム&オンゲキ1曲紹介《サウンドプレイヤー》",
"disable": false,
"lockType": 1,
"subLockType": 1,
"longMusic": 0,
"version": 25504
},
{
"id": 11831,
"name": "きゅびずむ",
@@ -22167,6 +22337,23 @@
"longMusic": 0,
"version": 25502
},
{
"id": 11879,
"name": "Xaleid◆scopiX (2)",
"artistName": 232,
"artistNameName": "xi",
"genreName": 105,
"genreNameName": "maimai",
"AddVersion": 24,
"AddVersionName": "PRiSMPLUS",
"eventName": 26100122,
"eventNameName": "261001_02_2:楽曲解禁(イベント1)",
"disable": false,
"lockType": 4,
"subLockType": 1,
"longMusic": 0,
"version": 25504
},
{
"id": 11919,
"name": "エンジェル ドリーム",
@@ -22252,142 +22439,6 @@
"longMusic": 0,
"version": 25007
},
{
"id": 11997,
"name": "キスキツネ",
"artistName": 781,
"artistNameName": "HIMEHINA",
"genreName": 101,
"genreNameName": "POPSアニメ",
"AddVersion": 26,
"AddVersionName": "CiRCLEPLUS",
"eventName": 261002021,
"eventNameName": "261002_02_1:ヒメヒナちほー2 3曲追加《キスキツネ、WWW、うたかたよいかないで》",
"disable": false,
"lockType": 0,
"subLockType": 1,
"longMusic": 0,
"version": 26506
},
{
"id": 11998,
"name": "WWW",
"artistName": 781,
"artistNameName": "HIMEHINA",
"genreName": 101,
"genreNameName": "POPSアニメ",
"AddVersion": 26,
"AddVersionName": "CiRCLEPLUS",
"eventName": 261002021,
"eventNameName": "261002_02_1:ヒメヒナちほー2 3曲追加《キスキツネ、WWW、うたかたよいかないで》",
"disable": false,
"lockType": 0,
"subLockType": 1,
"longMusic": 0,
"version": 26506
},
{
"id": 11999,
"name": "うたかたよいかないで",
"artistName": 781,
"artistNameName": "HIMEHINA",
"genreName": 101,
"genreNameName": "POPSアニメ",
"AddVersion": 26,
"AddVersionName": "CiRCLEPLUS",
"eventName": 261002021,
"eventNameName": "261002_02_1:ヒメヒナちほー2 3曲追加《キスキツネ、WWW、うたかたよいかないで》",
"disable": false,
"lockType": 0,
"subLockType": 1,
"longMusic": 0,
"version": 26506
},
{
"id": 12000,
"name": "Intergalactic Bound",
"artistName": 1127,
"artistNameName": "Yunosuke / CircusP",
"genreName": 102,
"genreNameName": "niconicoボーカロイド",
"AddVersion": 26,
"AddVersionName": "CiRCLEPLUS",
"eventName": 261016021,
"eventNameName": "261016_02_1:niconico2曲、バラエティ1曲追加《Intergalactic Bound、LEMON MELON COOKIE、3rd Avenue》",
"disable": false,
"lockType": 0,
"subLockType": 1,
"longMusic": 0,
"version": 26507
},
{
"id": 12001,
"name": "LEMON MELON COOKIE",
"artistName": 1128,
"artistNameName": "TAK",
"genreName": 102,
"genreNameName": "niconicoボーカロイド",
"AddVersion": 26,
"AddVersionName": "CiRCLEPLUS",
"eventName": 261016021,
"eventNameName": "261016_02_1:niconico2曲、バラエティ1曲追加《Intergalactic Bound、LEMON MELON COOKIE、3rd Avenue》",
"disable": false,
"lockType": 0,
"subLockType": 0,
"longMusic": 0,
"version": 26507
},
{
"id": 12002,
"name": "3rd Avenue",
"artistName": 1138,
"artistNameName": "Sound Souler",
"genreName": 104,
"genreNameName": "ゲームバラエティ",
"AddVersion": 26,
"AddVersionName": "CiRCLEPLUS",
"eventName": 261016021,
"eventNameName": "261016_02_1:niconico2曲、バラエティ1曲追加《Intergalactic Bound、LEMON MELON COOKIE、3rd Avenue》",
"disable": false,
"lockType": 0,
"subLockType": 1,
"longMusic": 0,
"version": 26507
},
{
"id": 12019,
"name": "Cryogenic",
"artistName": 1148,
"artistNameName": "Camellia ft. Petra Gurin「In Falsus」",
"genreName": 104,
"genreNameName": "ゲームバラエティ",
"AddVersion": 26,
"AddVersionName": "CiRCLEPLUS",
"eventName": 261016022,
"eventNameName": "261016_02_2:バラエティ1曲追加《Cryogenic》",
"disable": false,
"lockType": 0,
"subLockType": 1,
"longMusic": 0,
"version": 26507
},
{
"id": 12024,
"name": "OV3RCLOCK",
"artistName": 1152,
"artistNameName": "Alicemetix",
"genreName": 105,
"genreNameName": "maimai",
"AddVersion": 26,
"AddVersionName": "CiRCLEPLUS",
"eventName": 261002024,
"eventNameName": "261002_02_4:伝導楽曲 1曲(Lock)",
"disable": false,
"lockType": 3,
"subLockType": 1,
"longMusic": 0,
"version": 26506
},
{
"id": 100018,
"name": "[協]Love You",
@@ -23085,23 +23136,6 @@
"longMusic": 0,
"version": 24015
},
{
"id": 111537,
"name": "[即]Straight into the lights",
"artistName": 890,
"artistNameName": "Cosmograph",
"genreName": 107,
"genreNameName": "宴会場",
"AddVersion": 26,
"AddVersionName": "CiRCLEPLUS",
"eventName": 261016023,
"eventNameName": "261016_02_3:宴譜面追加3",
"disable": false,
"lockType": 0,
"subLockType": 0,
"longMusic": 0,
"version": 26508
},
{
"id": 111557,
"name": "[蛸]不機嫌なスリーカード",
@@ -23204,23 +23238,6 @@
"longMusic": 0,
"version": 25007
},
{
"id": 111765,
"name": "[音]愛包ダンスホール",
"artistName": 781,
"artistNameName": "HIMEHINA",
"genreName": 107,
"genreNameName": "宴会場",
"AddVersion": 26,
"AddVersionName": "CiRCLEPLUS",
"eventName": 261002022,
"eventNameName": "261002_02_2:宴譜面追加4",
"disable": false,
"lockType": 0,
"subLockType": 0,
"longMusic": 0,
"version": 26507
},
{
"id": 111772,
"name": "[宴]人マニア",
@@ -23272,23 +23289,6 @@
"longMusic": 0,
"version": 25502
},
{
"id": 112002,
"name": "[覚]3rd Avenue",
"artistName": 1138,
"artistNameName": "Sound Souler",
"genreName": 107,
"genreNameName": "宴会場",
"AddVersion": 26,
"AddVersionName": "CiRCLEPLUS",
"eventName": 261016023,
"eventNameName": "261016_02_3:宴譜面追加3",
"disable": false,
"lockType": 0,
"subLockType": 0,
"longMusic": 0,
"version": 26508
},
{
"id": 120227,
"name": "[r]Garakuta Doll Play",
+11 -2
View File
@@ -320,14 +320,23 @@ class _MusicRiskFeatureViewState extends State<MusicRiskFeatureView>
// isNewItemList 得按 (itemKind, itemId) 主键比对服务器快照来给 0/1,
// 不能一律发 '1':重复解锁一首已经存在的歌时,服务器会把插入冲突的
// 行整行丢掉,表现就是「上传成功但没生效」。
final existingKeys = await service.getUserItemKeys(
// 但这次回读不能让整件事失败——私服要是不实现 GetUserItemApi,
// 退化成一律 '1'(就是加这段之前的行为)总比解锁整个不能用强。
Set<String>? existingKeys;
try {
existingKeys = await service.getUserItemKeys(
widget.userId,
items.map((e) => e['itemKind'] as int),
);
} catch (_) {
existingKeys = null;
}
builder.applyItemListPatch(
packet,
items: items,
newFlags: [
newFlags: existingKeys == null
? null
: [
for (final item in items)
existingKeys.contains(
'${item['itemKind']}:${item['itemId']}',