临时保存

This commit is contained in:
Cold-Mint 2024-07-11 20:29:04 +08:00
parent 61618c13a9
commit 750e7860ec
3 changed files with 184 additions and 163 deletions

View File

@ -223,15 +223,8 @@ public partial class CharacterTemplate : CharacterBody2D
return null; return null;
} }
HashSet<Node>? exclude = null; return NodeUtils.GetTheNearestNode(this, PickingRangeBodiesList.ToArray(), true,
if (_currentItem != null) node => !CanPickItem(node));
{
//Prevent picking up objects in your hands again.
//防止再次捡起自己手上的物品。
exclude = new HashSet<Node> { _currentItem };
}
return NodeUtils.GetTheNearestNode(this, PickingRangeBodiesList.ToArray(), exclude);
} }
@ -308,25 +301,53 @@ public partial class CharacterTemplate : CharacterBody2D
} }
} }
/// <summary>
/// <para>Whether you can pick up specified items</para>
/// <para>是否能捡起指定物品</para>
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private bool CanPickItem(Node node)
{
if (_currentItem != null && node == _currentItem)
{
//Do not include your own belongings.
//不包含自己手上的物品。
return false;
}
if (node is PickAbleTemplate pickAbleTemplate)
{
//Does not contain items that have been picked up.
//不包含已被捡起的物品。
return !pickAbleTemplate.Picked;
}
return false;
}
/// <summary> /// <summary>
/// <para>Pick up the specified items</para> /// <para>Pick up the specified items</para>
/// <para>将指定物品拾起来</para> /// <para>将指定物品拾起来</para>
/// </summary> /// </summary>
/// <param name="pickAbleItem"></param> /// <param name="pickAbleItemNode2D"></param>
/// <returns> /// <returns>
///<para>Whether successfully picked up</para> ///<para>Whether successfully picked up</para>
///<para>是否成功拾起</para> ///<para>是否成功拾起</para>
/// </returns> /// </returns>
public bool PickItem(Node2D? pickAbleItem) protected bool PickItem(Node2D? pickAbleItemNode2D)
{ {
//Empty reference checking is implicitly performed here. //Empty reference checking is implicitly performed here.
//此处隐式的执行了空引用检查。 //此处隐式的执行了空引用检查。
if (pickAbleItem is not IItem item) if (pickAbleItemNode2D is not IItem item)
{ {
return false; return false;
} }
if (ItemContainer == null)
//The item store is marked null, or the item container is null.
//物品存放的标记为null或者物品容器为null。
if (ItemMarker2D == null || ItemContainer == null)
{ {
return false; return false;
} }
@ -339,10 +360,10 @@ public partial class CharacterTemplate : CharacterBody2D
return false; return false;
} }
//First check if we can pick up the item. //Check to see if you can fit the item into the container first.
//先检查我们能否拾起此物品 //先检查是否能将物品放入容器
var canPick = ItemContainer.CanAddItem(item); var canAddItem = ItemContainer.CanAddItem(item);
if (!canPick) if (!canAddItem)
{ {
return false; return false;
} }
@ -359,7 +380,7 @@ public partial class CharacterTemplate : CharacterBody2D
//设置捡起物品的常规处理。 //设置捡起物品的常规处理。
//You can supplement picking up state handling for more types of objects here. //You can supplement picking up state handling for more types of objects here.
//您可以在这里补充更多类型对象的捡起状态处理。 //您可以在这里补充更多类型对象的捡起状态处理。
if (pickAbleItem is PickAbleTemplate pickAbleTemplate) if (pickAbleItemNode2D is PickAbleTemplate pickAbleTemplate)
{ {
pickAbleTemplate.Owner = this; pickAbleTemplate.Owner = this;
pickAbleTemplate.Picked = true; pickAbleTemplate.Picked = true;
@ -374,16 +395,16 @@ public partial class CharacterTemplate : CharacterBody2D
{ {
//If the selected item slot in the item container is a newly picked item, and there is no item in the hand, then we put the selected item into the hand. //If the selected item slot in the item container is a newly picked item, and there is no item in the hand, then we put the selected item into the hand.
//如果物品容器内选中的物品槽是刚刚捡到的物品,且手里没有物品持有,那么我们将选中的物品放到手上。 //如果物品容器内选中的物品槽是刚刚捡到的物品,且手里没有物品持有,那么我们将选中的物品放到手上。
CurrentItem = pickAbleItem; CurrentItem = pickAbleItemNode2D;
} }
else else
{ {
pickAbleItem.Hide(); pickAbleItemNode2D.Hide();
pickAbleItem.ProcessMode = ProcessModeEnum.Disabled; pickAbleItemNode2D.ProcessMode = ProcessModeEnum.Disabled;
} }
pickAbleItem.Reparent(ItemMarker2D); NodeUtils.CallDeferredReparent(ItemMarker2D, pickAbleItemNode2D);
pickAbleItem.Position = Vector2.Zero; pickAbleItemNode2D.Position = Vector2.Zero;
return true; return true;
} }

View File

@ -20,148 +20,148 @@ namespace ColdMint.scripts.loader.uiLoader;
/// </summary> /// </summary>
public partial class MainMenuLoader : UiLoaderTemplate public partial class MainMenuLoader : UiLoaderTemplate
{ {
private Button? _startGameButton; private Button? _startGameButton;
private Label? _copyrightLabel; private Label? _copyrightLabel;
private StringBuilder? _copyrightBuilder; private StringBuilder? _copyrightBuilder;
private PackedScene? _gameScene; private PackedScene? _gameScene;
private PackedScene? _contributor; private PackedScene? _contributor;
private PackedScene? _levelGraphEditor; private PackedScene? _levelGraphEditor;
private Label? _sloganLabel; private Label? _sloganLabel;
private Label? _versionLabel; private Label? _versionLabel;
private Button? _levelGraphEditorButton; private Button? _levelGraphEditorButton;
private LinkButton? _contributorButton; private LinkButton? _contributorButton;
public override void InitializeData() public override void InitializeData()
{ {
if (Config.IsDebug()) if (Config.IsDebug())
{ {
//Set the minimum log level to Info in debug mode.(Print all logs) //Set the minimum log level to Info in debug mode.(Print all logs)
//在调试模式下将最小日志等级设置为Info。打印全部日志 //在调试模式下将最小日志等级设置为Info。打印全部日志
LogCat.MinLogLevel = LogCat.InfoLogLevel; LogCat.MinLogLevel = LogCat.InfoLogLevel;
} }
else else
{ {
//Disable all logs in the release version. //Disable all logs in the release version.
//在发行版禁用所有日志。 //在发行版禁用所有日志。
LogCat.MinLogLevel = LogCat.DisableAllLogLevel; LogCat.MinLogLevel = LogCat.DisableAllLogLevel;
} }
ContributorDataManager.RegisterAllContributorData(); ContributorDataManager.RegisterAllContributorData();
DeathInfoGenerator.RegisterDeathInfoHandler(new SelfDeathInfoHandler()); DeathInfoGenerator.RegisterDeathInfoHandler(new SelfDeathInfoHandler());
MapGenerator.RegisterRoomInjectionProcessor(new ChanceRoomInjectionProcessor()); MapGenerator.RegisterRoomInjectionProcessor(new ChanceRoomInjectionProcessor());
MapGenerator.RegisterRoomInjectionProcessor(new TimeIntervalRoomInjectorProcessor()); MapGenerator.RegisterRoomInjectionProcessor(new TimeIntervalRoomInjectorProcessor());
//Register the corresponding encoding provider to solve the problem of garbled Chinese path of the compressed package //Register the corresponding encoding provider to solve the problem of garbled Chinese path of the compressed package
//注册对应的编码提供程序,解决压缩包中文路径乱码问题 //注册对应的编码提供程序,解决压缩包中文路径乱码问题
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
//创建游戏数据文件夹 //创建游戏数据文件夹
var dataPath = Config.GetGameDataDirectory(); var dataPath = Config.GetGameDataDirectory();
if (!Directory.Exists(dataPath)) if (!Directory.Exists(dataPath))
{ {
Directory.CreateDirectory(dataPath); Directory.CreateDirectory(dataPath);
} }
//Registered camp //Registered camp
//注册阵营 //注册阵营
var defaultCamp = new Camp(Config.CampId.Default) var defaultCamp = new Camp(Config.CampId.Default)
{ {
FriendInjury = true FriendInjury = true
}; };
CampManager.SetDefaultCamp(defaultCamp); CampManager.SetDefaultCamp(defaultCamp);
var mazoku = new Camp(Config.CampId.Mazoku); var mazoku = new Camp(Config.CampId.Mazoku);
CampManager.AddCamp(mazoku); CampManager.AddCamp(mazoku);
var aborigines = new Camp(Config.CampId.Aborigines); var aborigines = new Camp(Config.CampId.Aborigines);
CampManager.AddCamp(aborigines); CampManager.AddCamp(aborigines);
_gameScene = GD.Load<PackedScene>("res://scenes/game.tscn"); _gameScene = GD.Load<PackedScene>("res://scenes/game.tscn");
_contributor = GD.Load<PackedScene>("res://scenes/contributor.tscn"); _contributor = GD.Load<PackedScene>("res://scenes/contributor.tscn");
_levelGraphEditor = GD.Load<PackedScene>("res://scenes/levelGraphEditor.tscn"); _levelGraphEditor = GD.Load<PackedScene>("res://scenes/levelGraphEditor.tscn");
//Register ItemTypes from file //Register ItemTypes from file
//从文件注册物品类型 //从文件注册物品类型
ItemTypeRegister.RegisterFromFile(); ItemTypeRegister.RegisterFromFile();
//Hardcoded ItemTypes Register //Hardcoded ItemTypes Register
//硬编码注册物品类型 //硬编码注册物品类型
ItemTypeRegister.StaticRegister(); ItemTypeRegister.StaticRegister();
//静态注册掉落表 //静态注册掉落表
LootRegister.StaticRegister(); LootRegister.StaticRegister();
} }
public override void InitializeUi() public override void InitializeUi()
{ {
_contributorButton = GetNode<LinkButton>("VBoxContainer2/ContributorButton"); _contributorButton = GetNode<LinkButton>("VBoxContainer2/ContributorButton");
_startGameButton = GetNode<Button>("StartGameButton"); _startGameButton = GetNode<Button>("StartGameButton");
_levelGraphEditorButton = GetNode<Button>("levelGraphEditorButton"); _levelGraphEditorButton = GetNode<Button>("levelGraphEditorButton");
//The level map editor is only available in debug mode. //The level map editor is only available in debug mode.
//关卡图编辑器仅在调试模式可用。 //关卡图编辑器仅在调试模式可用。
_levelGraphEditorButton.Visible = Config.IsDebug(); _levelGraphEditorButton.Visible = Config.IsDebug();
_startGameButton.GrabFocus(); _startGameButton.GrabFocus();
_versionLabel = GetNode<Label>("VBoxContainer2/VersionLabel"); _versionLabel = GetNode<Label>("VBoxContainer2/VersionLabel");
//Generative copyright //Generative copyright
//生成版权 //生成版权
_copyrightLabel = GetNode<Label>("VBoxContainer/CopyrightLabel"); _copyrightLabel = GetNode<Label>("VBoxContainer/CopyrightLabel");
_sloganLabel = GetNode<Label>("CenterContainer2/SloganLabel"); _sloganLabel = GetNode<Label>("CenterContainer2/SloganLabel");
_copyrightBuilder = new StringBuilder(); _copyrightBuilder = new StringBuilder();
_copyrightBuilder.Append('\u00a9'); _copyrightBuilder.Append('\u00a9');
var currentYear = DateTime.Now.Year; var currentYear = DateTime.Now.Year;
_copyrightBuilder.Append(Config.CreationYear); _copyrightBuilder.Append(Config.CreationYear);
if (currentYear != Config.CreationYear) if (currentYear != Config.CreationYear)
{ {
_copyrightBuilder.Append('-'); _copyrightBuilder.Append('-');
_copyrightBuilder.Append(currentYear); _copyrightBuilder.Append(currentYear);
} }
_copyrightBuilder.Append(' '); _copyrightBuilder.Append(' ');
_copyrightBuilder.Append(Config.CompanyName); _copyrightBuilder.Append(Config.CompanyName);
_copyrightBuilder.Append(" all rights reserved."); _copyrightBuilder.Append(" all rights reserved.");
_copyrightLabel.Text = _copyrightBuilder.ToString(); _copyrightLabel.Text = _copyrightBuilder.ToString();
_versionLabel.Text = "ver." + Config.GetVersion(); _versionLabel.Text = "ver." + Config.GetVersion();
_sloganLabel.Text = SloganProvider.GetSlogan(); _sloganLabel.Text = SloganProvider.GetSlogan();
_contributorButton.Text = _contributorButton.Text =
TranslationServerUtils.TranslateWithFormat("ui_contributor_tips", TranslationServerUtils.TranslateWithFormat("ui_contributor_tips",
ContributorDataManager.GetContributorTotals()); ContributorDataManager.GetContributorTotals());
} }
public override void LoadUiActions() public override void LoadUiActions()
{ {
if (_startGameButton != null) if (_startGameButton != null)
{ {
_startGameButton.Pressed += () => _startGameButton.Pressed += () =>
{ {
if (_gameScene == null) if (_gameScene == null)
{ {
return; return;
} }
GetTree().ChangeSceneToPacked(_gameScene); GetTree().ChangeSceneToPacked(_gameScene);
}; };
} }
if (_contributorButton != null) if (_contributorButton != null)
{ {
_contributorButton.Pressed += () => _contributorButton.Pressed += () =>
{ {
if (_contributor == null) if (_contributor == null)
{ {
return; return;
} }
GetTree().ChangeSceneToPacked(_contributor); GetTree().ChangeSceneToPacked(_contributor);
}; };
} }
if (_levelGraphEditorButton != null) if (_levelGraphEditorButton != null)
{ {
_levelGraphEditorButton.Pressed += () => _levelGraphEditorButton.Pressed += () =>
{ {
LogCat.Log("level_graph_editor"); LogCat.Log("level_graph_editor");
if (_levelGraphEditor == null) if (_levelGraphEditor == null)
{ {
return; return;
} }
GetTree().ChangeSceneToPacked(_levelGraphEditor); GetTree().ChangeSceneToPacked(_levelGraphEditor);
}; };
} }
} }
} }

View File

@ -175,17 +175,17 @@ public static class NodeUtils
///<para>Node array</para> ///<para>Node array</para>
///<para>节点数组</para> ///<para>节点数组</para>
/// </param> /// </param>
/// <param name="exclude">
///<para>Which nodes are excluded</para>
///<para>排除哪些节点</para>
/// </param>
/// <param name="excludeInvisibleNodes"> /// <param name="excludeInvisibleNodes">
///<para>Whether or not unseen nodes should be excluded</para> ///<para>Whether or not unseen nodes should be excluded</para>
///<para>是否排除不可见的节点</para> ///<para>是否排除不可见的节点</para>
/// </param> /// </param>
/// <param name="filter">
///<para>Filter, which returns true within the function to filter the specified node.</para>
///<para>过滤器在函数内返回true则过滤指定节点。</para>
/// </param>
/// <returns></returns> /// <returns></returns>
public static Node2D? GetTheNearestNode(Node2D origin, Node[] array, HashSet<Node>? exclude = null, public static Node2D? GetTheNearestNode(Node2D origin, Node[] array,
bool excludeInvisibleNodes = true) bool excludeInvisibleNodes = true, Func<Node2D, bool>? filter = null)
{ {
var closestDistance = float.MaxValue; var closestDistance = float.MaxValue;
Node2D? closestNode = null; Node2D? closestNode = null;
@ -199,10 +199,10 @@ public static class NodeUtils
continue; continue;
} }
if (exclude != null && exclude.Contains(node)) if (filter != null && filter.Invoke(node2D))
{ {
//If the current node, is within our exclusion project. So the next one. //If there is a filter, and the filter returns true, then the next.
//如果当前节点,在我们的排除项目内。那么下一个。 //如果有过滤器且过滤器返回true那么下一个。
continue; continue;
} }