StateManager.cs 2.4 KB

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