using Godot; using System; using System.Collections.Generic; /// /// 玩家数据管理类 /// public partial class Player : Node { /// /// 预算类型,用于记录项目预算的不同类别费用。 /// public class BudgetType { /// /// 设备费:用于购买设备,升级实验室是指在项目实施过程中购置或试制专用仪 /// 器设备,对现有仪器设备进行升级改造,以及租赁外单位仪器设备而发生的费 /// 用。计算类仪器设备和软件工具可在设备费科目列支。应当严格控制设备购 /// 置,鼓励开放共享、自主研制、租赁专用仪器设备以及对现有仪器设备进行升 /// 级改造,避免重复购置。 /// public int Facility { get; set; } /// /// 业务费:是指项目实施过程中消耗的各种材料、辅助材料等低值易耗品的采 /// 购、运输、装卸、整理等费用,发生的测试化验加工、燃料动力、出版/文献/ /// 信息传播/知识产权事务、会议/差旅/国际合作交流等费用,以及其他相关支 /// 出。 /// public int Operational { get; set; } /// ///劳务费:是指在项目实施过程中支付给参与项目研究的研究生、博士后、访问学 ///者以及项目聘用的研究人员、科研辅助人员等的劳务性费用,以及支付给临时聘 ///请的咨询专家的费用等。 /// public int Labor { get; set; } /// /// 总预算 /// public int Total => Facility + Operational + Labor; } /// /// 时间轴类型 /// public class TimelineType { /// /// 内部日期 /// public DateOnly InternalDate { get; set; } private Dictionary> _events; /// /// 订阅事件 /// /// 日期 /// 事件UUID public void Subscribe(DateOnly date, Guid eventUuid) { _events ??= new Dictionary>(); if (!_events.ContainsKey(date)) _events[date] = new HashSet(); _events[date].Add(eventUuid); } /// /// 取消订阅事件 /// /// 日期 /// 事件UUID public void Unsubscribe(DateOnly date, Guid eventUuid) { if (_events == null) return; if (!_events.ContainsKey(date)) return; _events[date].Remove(eventUuid); } /// /// 进入下一天 /// private void NextDay() { if (_events == null) return; _events.Remove(InternalDate); InternalDate = InternalDate.AddDays(1); OnDayChanged?.Invoke(InternalDate); GD.Print("Today is: " + InternalDate.ToString("yyyy-MM-dd")); if (_events.ContainsKey(InternalDate)) { var events = _events[InternalDate]; foreach (var eventUuid in events) { // TODO: Trigger event OnEventTriggered?.Invoke(InternalDate, eventUuid); GD.Print("event triggered! eventUUID: " + eventUuid.ToString()); } } } /// /// 附加计时器 /// /// 计时器 public void Attach(Timer ticker) { ticker.Timeout += NextDay; } /// /// 构造函数 /// /// 开始日期 public TimelineType(DateOnly startDate) { InternalDate = startDate; } /// /// 事件触发委托 /// public delegate void EventTriggeredEventHandler(DateOnly date, Guid eventUuid); /// /// 事件触发事件 /// public event EventTriggeredEventHandler OnEventTriggered; /// /// 日期变更委托 /// public delegate void DayChangedEventHandler(DateOnly date); /// /// 日期变更事件 /// public event DayChangedEventHandler OnDayChanged; } /// /// 预算实例 /// public static BudgetType Budget { get; set; } = new(); /// /// 时间轴实例 /// public static readonly TimelineType Timeline = new(DateOnly.Parse("2024/11/17")); /// /// 名字 /// public static string PlayerName { get; set; } /// /// 年龄 /// public static uint Age { get; set; } /// /// 日期 /// public static DateOnly Date { get; set; } // Called when the node enters the scene tree for the first time. /// /// 场景加载完成时调用 /// public override void _Ready() { } // Called every frame. 'delta' is the elapsed time since the previous frame. /// /// 每帧更新 /// /// 帧间隔 public override void _Process(double delta) { } }