supervisor-simulator/scripts/Models/Task.cs
wjsjwr 9c1593e717 已把 TaskSystem/SynergySystem/EconomySystem 按设计文档的“核心规则”落地成可运行逻辑,并把回合结算从 GameManager 下沉到系统与事件流上。
- 任务推进与结算:执行阶段按任务类型用属性权重计算进度、考虑角色/学科匹配、状态衰减与难度缩放,回合结束统一扣 Deadline、判定完成/失败并派发事件,同时记录署名贡献度 scripts/Core/GameSystems.cs
  - 经济结算:接收任务事件发奖惩,学术探索根据难度生成论文卡;回合结束统一扣工资并结息(经济学学科触发基础利率)scripts/Core/GameSystems.cs
  - 羁绊层数与效果:统计人群画像/职能分工堆叠,激活层级并聚合为全局 ModifierBundle 给数值解析器使用 scripts/Core/GameSystems.cs, scripts/Models/GameState.cs
  - 事件与数值解析支撑:新增领域事件与统一属性合成器,兼容羁绊/学科/特质/装备的叠加 scripts/Core/DomainEvents.cs, scripts/Core/StatResolver.cs
  - 回合结算入口调整:Review 阶段改由系统处理并发布回合结束事件 scripts/GameManager.cs
2026-01-01 00:07:16 +08:00

81 lines
2.5 KiB
C#
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.

using System;
using System.Collections.Generic;
namespace Models;
/// <summary>
/// 任务运行时模型 (TaskModel)
/// 设计说明:
/// 1) TaskDefinition 描述“配置”TaskModel 描述“运行时进度”。二者分离利于 Mod 追加内容。
/// 2) 任务状态只保存必要字段,展示文本统一由 Definition + i18n 输出。
/// 3) 任务参与单位只记录 Id避免模型直接引用 Node。
/// 注意事项:
/// - 如果没有 DefinitionId可使用 Name 作为临时演示数据。
/// - Deadline 语义是“剩余回合数”,由 TurnSystem 递减。
/// 未来扩展:
/// - 可加入阶段状态(灵感/写作/实验/审核),与 UI 进度条分段对应。
/// - 可加入失败原因/完成评级,用于结算与肉鸽评分。
/// </summary>
public sealed class TaskModel
{
public Guid Id { get; } = Guid.NewGuid();
public string DefinitionId { get; set; }
public string Name { get; set; }
public TaskTrack Track { get; set; }
public TaskKind Kind { get; set; }
public TaskDifficulty Difficulty { get; set; }
public TaskRuntime Runtime { get; }
public TaskRewardSnapshot Reward { get; set; } = new();
public List<Guid> AssignedUnitIds { get; } = new();
public bool IsCompleted => Runtime.CurrentProgress >= Runtime.TotalWorkload;
public bool IsFailed => Runtime.RemainingTurns <= 0 && !IsCompleted;
public TaskModel(string name, TaskKind kind, float workload, int deadline)
{
Name = name;
Kind = kind;
Track = TaskTrack.LabProject;
Difficulty = TaskDifficulty.Standard;
Runtime = new TaskRuntime(workload, deadline);
}
public void AddProgress(float amount)
{
Runtime.CurrentProgress += amount;
if (Runtime.CurrentProgress > Runtime.TotalWorkload)
{
Runtime.CurrentProgress = Runtime.TotalWorkload;
}
}
}
/// <summary>
/// 任务运行参数(进度与截止)
/// </summary>
public sealed class TaskRuntime
{
public float TotalWorkload { get; set; }
public float CurrentProgress { get; set; }
public float DifficultyScale { get; set; } = 1.0f;
public int RemainingTurns { get; set; }
public TaskRuntime(float totalWorkload, int remainingTurns)
{
TotalWorkload = totalWorkload;
RemainingTurns = remainingTurns;
}
}
/// <summary>
/// 运行时奖励快照(避免 Definition 被动态修改)
/// </summary>
public sealed class TaskRewardSnapshot
{
public int Money { get; set; }
public int Reputation { get; set; }
public List<string> PaperIds { get; } = new();
public List<string> ItemIds { get; set; }
}