import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:trackoffical_app/logger.dart'; import 'package:trackoffical_app/model.dart'; import 'package:trackoffical_app/pb.dart' as pb; class UserProfile { final token = ''.val('token'); final lastUseSportWearMac = ''.val('lastUseSportWearMac'); var username = ''.obs; var head = MNetImage().obs; final _sexIndex = Sex.Male.index.val('UserProfile_sex'); Sex get sex => Sex.values[_sexIndex.val]; set sex(Sex v) { _sexIndex.val = v.index; } var age = 12.val('UserProfile_age'); var weightKg = 42.0.val('UserProfile_weightKg'); var heightCm = 150.0.val('UserProfile_heightCm'); var rhr = 60.val('UserProfile_rhr'); /// 已经询问过开屏权限 final isAskPermissions = false.val('UserProfile_isAskPermissions'); var isCompassUseRealNorth = true.val('UserProfile_isCompassUseRealNorth'); final isInGameUISimplifyMode = true.val('UserProfile_isInGameUISimplifyMode'); final isEnableOutBoundaryWarn = true.val('UserProfile_isEnableOutBoundaryWarn'); static const inGameTrajectorySecondsList = [60, 90, 120]; final inGameTrajectorySeconds = inGameTrajectorySecondsList[0].val('UserProfile_inGameTrajectorySeconds'); final isEnableUserLocation = true.val('UserProfile_isUserLocationEnable'); final isStartShowWarn = true.val('UserProfile_isStartShowWarn'); final isEnableGameSound = true.val('UserProfile_isEnableGameSound'); final isEnableGameVibrate = true.val('UserProfile_isEnableGameVibrate'); /// 文创 final isEnableGameCulture = true.val('UserProfile_isEnableGameCulture'); /// 游戏开始后是否显示提示 final isEnableInGameStartWarn = true.val('UserProfile_isEnableInGameStartWarn'); /// 游戏开始后是否显示开始点气泡 final isEnableInGameStartCPBubble = true.val('UserProfile_isEnableInGameStartCPBubble'); /// 首页是否显示提示 final isEnableHomeSpecialWarn = true.val('UserProfile_isEnableHomeSpecialWarn'); /// 游戏开始后是否屏幕最亮 final isEnableInGameBrightnessMax = false.val('UserProfile_isEnableInGameBrightnessMax'); final gameSettingsUIMode = GameSettingsValue( 'map_mode', GameUIMode.electronicMap, storageFmt: (v) => v.index, storageFmtRe: (s)=> GameUIMode.values[s] ); final gameSettingsSimpleDashboard = GameSettingsValue('simple_dashboard', true); final gameSettingsBoundaryWarn = GameSettingsValue('boundary_warn', true); final gameSettingsTrackLengthSeconds = GameSettingsValue('track_length', 60); final gameSettingsShowMyLocation = GameSettingsValue('show_my_location', true); final gameSettingsStartRemind = GameSettingsValue('start_remind', true); final gameSettingsSoundPrompt = GameSettingsValue('sound_prompt', true); final gameSettingsVibrationPrompt = GameSettingsValue('vibration_prompt', true); final gameSettingsShowOriginality = GameSettingsValue('show_originality', true); final gameSettingsRealNorth = GameSettingsValue('real_north', true); final gameSettingsGpsTrack = GameSettingsValue('gps_track', true); final gameSettingsTargetErrorMeter = GameSettingsValue('target_error', 5); final gameSettingsPunchRadiusMeter = GameSettingsValue('punch_radius', 2); final gameSettingsCpRadiusMeter = GameSettingsValue('cp_radius', 15); final gameSettingsCpColor = gameSettingsColor('cp_color', const Color(0xffff00f7)); final gameSettingsCpTargetColor = gameSettingsColor('target_cp_color', const Color(0xfff44336)); final gameSettingsCpJumpColor = gameSettingsColor('jump_cp_color', const Color(0xff9e9e9e)); final gameSettingsCpPunchedColor = gameSettingsColor('punched_cp_color', const Color(0xff4caf50)); final gameSettingsRoutePreview = GameSettingsValue('route_preview', false); final gameSettingsPunchErrorPrompt = GameSettingsValue('punch_error_prompt', true); final gameSettingsHotZonePrompt = GameSettingsValue('hotspot_prompt', true); final gameSettingsVCPPunchType = GameSettingsValue( 'vcp_punch_type', VCPPunchType.manual, storageFmt: (v) => v.index, storageFmtRe: (s)=> VCPPunchType.values[s] ); final _gameSettingsIndex = {}; void _gameSettingsInitIndex(List list) { for (final one in list) { _gameSettingsIndex[one.name] = one; } } UserProfile() { _gameSettingsInitIndex([ gameSettingsUIMode, gameSettingsSimpleDashboard, gameSettingsBoundaryWarn, gameSettingsTrackLengthSeconds, gameSettingsShowMyLocation, gameSettingsStartRemind, gameSettingsSoundPrompt, gameSettingsVibrationPrompt, gameSettingsShowOriginality, gameSettingsRealNorth, gameSettingsGpsTrack, gameSettingsTargetErrorMeter, gameSettingsPunchRadiusMeter, gameSettingsCpRadiusMeter, gameSettingsCpColor, gameSettingsCpTargetColor, gameSettingsCpJumpColor, gameSettingsCpPunchedColor, gameSettingsRoutePreview, gameSettingsPunchErrorPrompt, gameSettingsHotZonePrompt, gameSettingsVCPPunchType, ]); } void gameSettingsLoadLock(List rules) { var msg = '载入服务器配置:\n'; for (final rule in rules) { final s = _gameSettingsIndex[rule.arName]; if (s != null && rule.isLock) { s.parseStringLock(rule.arValue); msg += '${rule.arName}: ${rule.arValue}'; } } info(msg); } void cleanGameSettingsLock() { for (final one in _gameSettingsIndex.values) { one.lockValue = null; } } } enum GameUIMode { electronicMap, noMap, paperMap } enum VCPPunchType{ manual, auto } GameSettingsValue gameSettingsColor(String name, Color color){ return GameSettingsValue(name, color, storageFmt: (v) => v.value, storageFmtRe: (s)=> Color(s) ); } class GameSettingsValue { GameSettingsValue(this.name, T value, {S Function(T)? storageFmt, T Function(S)? storageFmtRe}) : _same = storageFmt==null, _storageFmt = storageFmt, _storageFmtRe = storageFmtRe{ final key = 'GameSettingsValue_$name'; if(_same){ _storage = value.val(key); }else{ _storage = storageFmt!(value).val(key); } } /// 类型T和S相同 final bool _same; final String name; late ReadWriteValue _storage; final S Function(T)? _storageFmt; final T Function(S)? _storageFmtRe; T? lockValue; bool get isLocked => lockValue != null; parseStringLock(String value) { switch (T) { case bool: lockValue = (bool.tryParse(value) ?? false) as T; break; case int: lockValue = (int.tryParse(value) ?? 0) as T; break; case GameUIMode: lockValue = GameUIMode.values[int.tryParse(value) ?? 0] as T; break; case VCPPunchType: lockValue = VCPPunchType.values[int.tryParse(value) ?? 0] as T; break; default: throw Exception("T: $T name:$name v:$value 不支持"); } } set value(T v) { if (lockValue == null) { if (_same) { _storage.val = v; } else { _storage.val = _storageFmt!(v); } } } T get value { if (_same) { return lockValue ?? _storage.val; } else { return lockValue ?? _storageFmtRe!(_storage.val); } } }