mirror of
http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite.git
synced 2025-11-20 05:27:13 +08:00
(client) feat:健康给予,路径优化,结算界面,商店界面 (#60)
Co-authored-by: m0_75251201 <m0_75251201@noreply.gitcode.com> Reviewed-on: http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite/pulls/60
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
using Map;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -6,35 +5,38 @@ using Base;
|
||||
using Data;
|
||||
using Entity;
|
||||
using Managers;
|
||||
using Map;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using Utils;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
/// <summary>
|
||||
/// Program 类作为单例模式的核心管理器,负责维护和管理游戏或应用中的维度(Dimension)实例和焦点状态。
|
||||
/// 它提供了维度注册、注销、获取以及焦点维度设置的功能。
|
||||
/// Program 类作为单例模式的核心管理器,负责维护和管理游戏或应用中的维度(Dimension)实例和焦点状态。
|
||||
/// 它提供了维度注册、注销、获取以及焦点维度设置的功能。
|
||||
/// </summary>
|
||||
public class Program : Singleton<Program>
|
||||
{
|
||||
// 当前角色定义
|
||||
public CharacterDef CurrentCharacter { get;private set; }
|
||||
/// <summary>
|
||||
/// 维护所有已注册的维度实例的字典,键是维度的唯一标识符 (ID)。
|
||||
/// </summary>
|
||||
private readonly Dictionary<string, Dimension> _registeredDimensions = new();
|
||||
|
||||
// 指示是否需要加载数据的标志,例如在游戏启动或场景切换时。
|
||||
private bool _needLoad = true;
|
||||
|
||||
// 当前角色定义
|
||||
public CharacterDef CurrentCharacter { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 指示是否需要加载数据的标志,例如在游戏启动或场景切换时。
|
||||
/// 指示是否需要加载数据的标志,例如在游戏启动或场景切换时。
|
||||
/// </summary>
|
||||
public bool NeedLoad
|
||||
{
|
||||
get => _needLoad;
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
CurrentCharacter = null;
|
||||
}
|
||||
if (value) CurrentCharacter = null;
|
||||
_needLoad = value;
|
||||
}
|
||||
}
|
||||
@@ -42,75 +44,65 @@ public class Program : Singleton<Program>
|
||||
public bool OnPlay => CurrentCharacter != null;
|
||||
|
||||
/// <summary>
|
||||
/// 当前聚焦的实体对象。
|
||||
/// 变更为属性,并私有化setter,确保通过 SetFocusedEntity 方法集中管理其更新和事件触发。
|
||||
/// 当前聚焦的实体对象。
|
||||
/// 变更为属性,并私有化setter,确保通过 SetFocusedEntity 方法集中管理其更新和事件触发。
|
||||
/// </summary>
|
||||
public Entity.Entity FocusedEntity => FocusedDimension?.focusEntity;
|
||||
|
||||
/// <summary>
|
||||
/// 当焦点实体发生变化时触发的事件。
|
||||
/// 事件参数为新的焦点 Entity 实例,如果焦点被清除则为 null。
|
||||
/// 当前活跃焦点的维度唯一标识符,可能为空。
|
||||
/// 变更为属性,并私有化setter,确保通过 SetFocusedDimension 方法集中管理其更新。
|
||||
/// </summary>
|
||||
public event Action<Entity.Entity> OnFocusedEntityChanged;
|
||||
public string FocusedDimensionId { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前活跃焦点的维度唯一标识符,可能为空。
|
||||
/// 变更为属性,并私有化setter,确保通过 SetFocusedDimension 方法集中管理其更新。
|
||||
/// </summary>
|
||||
public string FocusedDimensionId { get; private set; } = null;
|
||||
|
||||
/// <summary>
|
||||
/// 当前聚焦的维度对象实例。当 <see cref="FocusedDimensionId"/> 不为空时,此属性指向对应的维度实例。
|
||||
/// 当前聚焦的维度对象实例。当 <see cref="FocusedDimensionId" /> 不为空时,此属性指向对应的维度实例。
|
||||
/// </summary>
|
||||
public Dimension FocusedDimension { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 维护所有已注册的维度实例的字典,键是维度的唯一标识符 (ID)。
|
||||
/// </summary>
|
||||
private readonly Dictionary<string, Dimension> _registeredDimensions = new Dictionary<string, Dimension>();
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有已注册的维度。返回一个只读字典副本,防止外部直接修改。
|
||||
/// 获取所有已注册的维度。返回一个只读字典副本,防止外部直接修改。
|
||||
/// </summary>
|
||||
public IReadOnlyDictionary<string, Dimension> RegisteredDimensions => _registeredDimensions;
|
||||
|
||||
/// <summary>
|
||||
/// 当焦点维度发生变化时触发的事件。
|
||||
/// 事件参数为新的焦点 Dimension 实例,如果焦点被清除则为 null。
|
||||
/// </summary>
|
||||
public event Action<Dimension> OnFocusedDimensionChanged;
|
||||
|
||||
/// <summary>
|
||||
/// 获取已注册维度的数量。
|
||||
/// 获取已注册维度的数量。
|
||||
/// </summary>
|
||||
public int DimensionCount => _registeredDimensions.Count;
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有已注册维度的ID数组。
|
||||
/// 获取所有已注册维度的ID数组。
|
||||
/// </summary>
|
||||
public string[] Dimensions => _registeredDimensions.Keys.ToArray();
|
||||
|
||||
|
||||
|
||||
|
||||
public bool CanOpenRightMenu => Setting.Instance.CurrentSettings.developerMode && !OnPlay;
|
||||
public bool CanMoveCamera => CanOpenRightMenu && !UIInputControl.Instance.HasWindowOpen;
|
||||
|
||||
public DimensionDef OutsidePlayDimension { get; private set; } = null;
|
||||
|
||||
public bool CanMoveCamera => CanOpenRightMenu && !UIInputControl.Instance.HasInputExclusionWindow;
|
||||
|
||||
public DimensionDef OutsidePlayDimension { get; private set; }
|
||||
|
||||
public int CoinCount
|
||||
{
|
||||
get => KeyValueArchiveManager.Instance.Get<int>("coinCount");
|
||||
set => KeyValueArchiveManager.Instance.Set("coinCount", value);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public RobotLogicDef CurrentRobotLogic { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 注册一个维度实例到 Program。
|
||||
/// 当焦点实体发生变化时触发的事件。
|
||||
/// 事件参数为新的焦点 Entity 实例,如果焦点被清除则为 null。
|
||||
/// </summary>
|
||||
public event Action<Entity.Entity> OnFocusedEntityChanged;
|
||||
|
||||
/// <summary>
|
||||
/// 当焦点维度发生变化时触发的事件。
|
||||
/// 事件参数为新的焦点 Dimension 实例,如果焦点被清除则为 null。
|
||||
/// </summary>
|
||||
public event Action<Dimension> OnFocusedDimensionChanged;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 注册一个维度实例到 Program。
|
||||
/// </summary>
|
||||
/// <param name="dimension">要注册的维度实例。</param>
|
||||
public void RegisterDimension(Dimension dimension)
|
||||
@@ -120,12 +112,14 @@ public class Program : Singleton<Program>
|
||||
Debug.LogError("[Program] 尝试注册一个空的维度。");
|
||||
return;
|
||||
}
|
||||
|
||||
var id = dimension.DimensionId;
|
||||
if (string.IsNullOrEmpty(id))
|
||||
{
|
||||
Debug.LogError($"[Program] 尝试注册一个ID为空的维度: {dimension.name}");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_registeredDimensions.TryAdd(id, dimension))
|
||||
{
|
||||
Debug.LogWarning($"[Program] ID为 '{id}' 的维度已注册。跳过重复注册 {dimension.name}。");
|
||||
@@ -134,14 +128,11 @@ public class Program : Singleton<Program>
|
||||
|
||||
// 如果注册的维度恰好是当前 focusedDimensionId,SetFocusedDimension(id) 将负责更新 FocusedDimension 并触发事件。
|
||||
// 并且,由于SetFocusedDimension会清空FocusedEntity,这也符合新维度的行为。
|
||||
if (FocusedDimensionId == id)
|
||||
{
|
||||
SetFocusedDimension(id);
|
||||
}
|
||||
if (FocusedDimensionId == id) SetFocusedDimension(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从 Program 注销一个维度实例。
|
||||
/// 从 Program 注销一个维度实例。
|
||||
/// </summary>
|
||||
/// <param name="dimension">要注销的维度实例。</param>
|
||||
public void UnregisterDimension(Dimension dimension)
|
||||
@@ -151,14 +142,12 @@ public class Program : Singleton<Program>
|
||||
Debug.LogWarning("[Program] 尝试注销一个空的维度。");
|
||||
return;
|
||||
}
|
||||
|
||||
var id = dimension.DimensionId;
|
||||
if (_registeredDimensions.Remove(id))
|
||||
{
|
||||
// 如果注销的维度是当前焦点维度,则调用 SetFocusedDimension(null) 清除焦点并触发事件。
|
||||
if (FocusedDimensionId == id)
|
||||
{
|
||||
SetFocusedDimension(null); // 清除焦点
|
||||
}
|
||||
if (FocusedDimensionId == id) SetFocusedDimension(null); // 清除焦点
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -167,7 +156,7 @@ public class Program : Singleton<Program>
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据ID获取一个已注册的维度。
|
||||
/// 根据ID获取一个已注册的维度。
|
||||
/// </summary>
|
||||
/// <param name="dimensionId">维度的唯一标识符。</param>
|
||||
/// <returns>对应的Dimension实例,如果未找到则返回null。</returns>
|
||||
@@ -180,8 +169,8 @@ public class Program : Singleton<Program>
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置当前聚焦的维度。
|
||||
/// 这是更改焦点维度的唯一官方入口。
|
||||
/// 设置当前聚焦的维度。
|
||||
/// 这是更改焦点维度的唯一官方入口。
|
||||
/// </summary>
|
||||
/// <param name="dimensionId">要设置为焦点的维度的唯一标识符。如果传入null或空字符串,将清除当前焦点维度。</param>
|
||||
public void SetFocusedDimension(string dimensionId)
|
||||
@@ -207,41 +196,35 @@ public class Program : Singleton<Program>
|
||||
// 如果 dimensionId 为 null 或空, newFocusedDimension 和 newFocusedDimensionId 将保持为 null,表示清除焦点。
|
||||
|
||||
// 检查是否实际发生变化
|
||||
if (FocusedDimensionId == newFocusedDimensionId && FocusedDimension == newFocusedDimension)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (FocusedDimensionId == newFocusedDimensionId && FocusedDimension == newFocusedDimension) return;
|
||||
|
||||
if (FocusedEntity)
|
||||
{
|
||||
FocusedEntity.PlayerControlled = false;
|
||||
}
|
||||
if (FocusedEntity) FocusedEntity.PlayerControlled = false;
|
||||
// 更新内部状态
|
||||
FocusedDimensionId = newFocusedDimensionId;
|
||||
FocusedDimension = newFocusedDimension;
|
||||
|
||||
// 确保功能一致性:当维度焦点改变(或被清除)时,任何实体焦点也应被清除。
|
||||
SetFocusedEntity(null);
|
||||
|
||||
// 触发事件
|
||||
OnFocusedDimensionChanged?.Invoke(FocusedDimension);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置当前聚焦的实体。
|
||||
/// 这是更改焦点实体的唯一官方入口,并会在实体改变时触发 OnFocusedEntityChanged 事件。
|
||||
/// 设置当前聚焦的实体。
|
||||
/// 这是更改焦点实体的唯一官方入口,并会在实体改变时触发 OnFocusedEntityChanged 事件。
|
||||
/// </summary>
|
||||
/// <param name="entity">要设置为焦点的实体实例。如果传入null,将清除当前焦点实体。</param>
|
||||
public void SetFocusedEntity(Entity.Entity entity)
|
||||
{
|
||||
// 检查是否实际发生变化
|
||||
if (FocusedEntity == entity || !FocusedDimension)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!FocusedDimension) return;
|
||||
FocusedDimension.focusEntity = entity;
|
||||
// 触发事件,将新的焦点实体(或 null)作为参数传递。
|
||||
OnFocusedEntityChanged?.Invoke(FocusedEntity);
|
||||
|
||||
if (entity is LivingEntity { getBaseHediff: false } livingEntity)
|
||||
{
|
||||
foreach (var hediffDef in HediffManager.Instance.BaseHediffs) livingEntity.AddHediff(new Hediff(hediffDef));
|
||||
|
||||
livingEntity.getBaseHediff = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void SelectCharacterPlayGame(CharacterDef character)
|
||||
@@ -254,7 +237,7 @@ public class Program : Singleton<Program>
|
||||
|
||||
public void PutPlayer()
|
||||
{
|
||||
if (FocusedEntity != null || CurrentCharacter == null)
|
||||
if (FocusedEntity || CurrentCharacter == null)
|
||||
return;
|
||||
var pos = CameraControl.CameraControl.Instance.Position;
|
||||
var player =
|
||||
@@ -267,7 +250,7 @@ public class Program : Singleton<Program>
|
||||
|
||||
public void StartPlayGame(DimensionDef dimension)
|
||||
{
|
||||
OutsidePlayDimension=dimension;
|
||||
OutsidePlayDimension = dimension;
|
||||
PerlinNoise.Instance.Reinitialize(Random.Range(int.MinValue, int.MaxValue));
|
||||
SceneManager.LoadScene("Play");
|
||||
}
|
||||
@@ -275,5 +258,13 @@ public class Program : Singleton<Program>
|
||||
public void EndPlayGame()
|
||||
{
|
||||
OutsidePlayDimension = null;
|
||||
CurrentCharacter = null;
|
||||
SetFocusedDimension(null);
|
||||
EventManager.Instance.StopAllStories();
|
||||
}
|
||||
}
|
||||
public void ReturnBase()
|
||||
{
|
||||
Program.Instance.EndPlayGame();
|
||||
SceneManager.LoadScene("Base");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user