| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- using System.Text.RegularExpressions;
- namespace XafPet.Desktop.PetEngine;
- /// <summary>把 CFC API 数据转换为宠物状态(纯逻辑,无 UI 依赖)</summary>
- public static class StateManager
- {
- /// <summary>核心状态映射。优先级:Sleeping > Excited > Happy > Worried > Busy > Sad > Tired/Energetic/Curious > Idle</summary>
- public static PetState MapState(
- List<CfcTask>? tasks,
- EnergyOverview? energy,
- DailyCheckin? checkin,
- bool userInactive)
- {
- // 1. 用户无操作 → 睡眠(最高优先级,除非有未完成任务需要提醒)
- var hasPendingTasks = tasks?.Any(t => t.Status is "PENDING" or "IN_PROGRESS") ?? false;
- if (userInactive && !hasPendingTasks) return PetState.Sleeping;
- // 2. 健康打卡完成 → 兴奋(次高)
- if (checkin is { Checked: true }) return PetState.Excited;
- // 3. 任务状态
- if (tasks is { Count: > 0 })
- {
- var allDone = tasks.All(t => t.Status == "COMPLETED");
- if (allDone) return PetState.Happy;
- // 超期未完成(dueDate 早于今天且非完成态)→ 担忧
- var today = DateOnly.FromDateTime(DateTime.Today);
- var overdue = tasks.Any(t =>
- t.Status is "PENDING" or "IN_PROGRESS" &&
- DateOnly.TryParse(t.DueDate, out var due) && due < today);
- if (overdue) return PetState.Worried;
- return PetState.Busy;
- }
- // 4. 五维能量
- if (energy is { Dimensions.Count: > 0 })
- {
- var dims = energy.Dimensions;
- var allLow = dims.All(d => d.Value < 30);
- if (allLow) return PetState.Sad;
- var body = dims.FirstOrDefault(d => d.Dimension == "身");
- if (body != null && body.Value < 30) return PetState.Tired;
- if (body != null && body.Value >= 85) return PetState.Energetic;
- var mind = dims.FirstOrDefault(d => d.Dimension == "智");
- if (mind != null && mind.Value >= 85) return PetState.Curious;
- }
- return PetState.Idle;
- }
- /// <summary>枚举 → camelCase(JS 侧状态名)。WaitingForInteraction → waitingForInteraction</summary>
- public static string StateToCamelCase(PetState state)
- {
- var name = state.ToString();
- return Regex.Replace(name, "(^[A-Z])", m => m.Value.ToLowerInvariant());
- }
- }
|