Files
Ichino/lib/models/user_character.dart
T
Bad0RANG3 e9357f5969 refactor: 拆分主页与公共组件,扫码登录改走 WinHTTP
- 抽出 lib/core 的日期/JSON 工具,收敛各页重复解析
- 主页与音乐风险页拆成组件,风险功能共用一套运行框架
- 修复设置页作为主页页签保存时弹掉根路由导致的黑屏
- 登录对齐 Astral aimedb 协议:84 位二维码校验、签名与请求头修正,
  补 GlobalSign 中间证书;Windows 改用 WinHTTP 绕过服务端对
  BoringSSL 的 TLS 指纹拦截(证书校验保持开启)
- 补开发预览数据与测试
2026-10-25 15:51:10 +08:00

59 lines
2.0 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import '../core/json_value.dart';
/// GetUserRatingApi 之外的角色(旅行伙伴)数据。
///
/// 对应客户端 `Net.VO.Mai2.UserCharacter`:只有 4 个字段,走
/// `UpsertUserAllApi` 的 `upsertUserAll.userCharacterList`,主键是
/// `characterId`(见 VOExtensions.cs:265 的 BuildListData 比较器)。
///
/// 注意:旅行伙伴不是「搭档」。搭档是 ItemKind.Partner = 10,走 userItemList;
/// 角色是 ItemKind.Character = 9,客户端的 ExportUserItems() 并不导出它,
/// 角色的拥有状态由 userCharacterList 表达。
class UserCharacterBean {
final int characterId;
final int level;
final int awakening;
final int useCount;
const UserCharacterBean({
required this.characterId,
required this.level,
required this.awakening,
required this.useCount,
});
/// wire 上的 UserCharacter,字段与顺序与客户端声明一致。
Map<String, dynamic> toWireJson() => {
'characterId': characterId,
'level': level,
'awakening': awakening,
'useCount': useCount,
};
UserCharacterBean copyWith({int? level, int? awakening, int? useCount}) =>
UserCharacterBean(
characterId: characterId,
level: level ?? this.level,
awakening: awakening ?? this.awakening,
useCount: useCount ?? this.useCount,
);
factory UserCharacterBean.fromJson(Map<String, dynamic> json) =>
UserCharacterBean(
characterId: jsonInt(json['characterId']),
level: jsonInt(json['level']),
awakening: jsonInt(json['awakening']),
useCount: jsonInt(json['useCount']),
);
static List<UserCharacterBean> listFromResponse(Map<String, dynamic> json) =>
jsonMapList(json['userCharacterList'])
.map(UserCharacterBean.fromJson)
.toList();
}
/// `UserDetail.charaSlot` 固定 5 个槽,槽 0 是队长
/// (客户端 CharactorSlotController.cs:27 对 i==0 用 leaderCharaSlotPrefab)。
List<int> normalizeCharaSlot(List<int> slots) =>
List<int>.generate(5, (i) => i < slots.length ? slots[i] : 0);