From b6ef0034ac8d3d63d7463adea54efb066189324a Mon Sep 17 00:00:00 2001 From: wjsjwr Date: Sat, 23 Nov 2024 19:07:12 +0800 Subject: [PATCH] Implement timeline --- scripts/Player.cs | 95 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 76 insertions(+), 19 deletions(-) diff --git a/scripts/Player.cs b/scripts/Player.cs index e47c5f7..ab9aedc 100644 --- a/scripts/Player.cs +++ b/scripts/Player.cs @@ -1,10 +1,14 @@ using Godot; using System; +using System.Collections.Generic; public partial class Player : Node { - - public class BudgetType { + /// + /// 预算类型,用于记录项目预算的不同类别费用。 + /// + public class BudgetType + { /// /// 设备费:用于购买设备,升级实验室是指在项目实施过程中购置或试制专用仪 /// 器设备,对现有仪器设备进行升级改造,以及租赁外单位仪器设备而发生的费 @@ -12,7 +16,7 @@ public partial class Player : Node /// 置,鼓励开放共享、自主研制、租赁专用仪器设备以及对现有仪器设备进行升 /// 级改造,避免重复购置。 /// - public int Facility { get; set; } + public int Facility { get; set; } /// /// 业务费:是指项目实施过程中消耗的各种材料、辅助材料等低值易耗品的采 /// 购、运输、装卸、整理等费用,发生的测试化验加工、燃料动力、出版/文献/ @@ -30,15 +34,72 @@ public partial class Player : Node /// /// 总预算 /// - public int Total => Facility + Operational + Labor; - } + public int Total => Facility + Operational + Labor; + } + public class TimelineType + { + public DateOnly InternalDate { get; set; } + private Dictionary> _events; + + public void Subscribe(DateOnly date, Guid eventUUID) + { + _events ??= new Dictionary>(); + if (!_events.ContainsKey(date)) _events[date] = new HashSet(); + _events[date].Add(eventUUID); + } + + 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; } + public static readonly TimelineType Timeline = new(DateOnly.Parse("2024/11/17")); /// /// 名字 @@ -48,28 +109,24 @@ public partial class Player : Node /// /// 年龄 /// - public static uint Age { get; set; } + public static uint Age { get; set; } /// /// 日期 /// - public static DateOnly Date { 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 when the node enters the scene tree for the first time. + public override void _Ready() { var ticker = GetNode("/root/GameManager/OneSecondTicker"); - ticker.Timeout += OnTickerTimeout; + Timeline.Attach(ticker); + Timeline.Subscribe(DateOnly.Parse("2024/11/20"), Guid.NewGuid()); + Timeline.OnEventTriggered += (d, e) => GD.Print($"Timeline event triggered: {d}, {e}"); } // Called every frame. 'delta' is the elapsed time since the previous frame. public override void _Process(double delta) { } - - private static void OnTickerTimeout() - { - Date = DateOnly.FromDateTime(DateTime.Now); - GD.Print(Date.ToString()); - } }