Add a contributor page.

添加贡献者页面。
This commit is contained in:
Cold-Mint 2024-06-15 00:14:17 +08:00
parent 30a0a6539f
commit 4077d77b32
Signed by: Cold-Mint
GPG Key ID: C5A9BF8A98E0CE99
19 changed files with 593 additions and 14 deletions

View File

@ -26,7 +26,6 @@ log_death_info,生物{0}被{1}击败。,"Creature {0} was defeated by {1}.",生
log_loot_list_has_no_entries,ID为{0}的战利品表,没有指定条目。,"Loot list with ID {0}, no entry specified.",ID{0}の戦利品テーブルは、エントリ指定されていません。 log_loot_list_has_no_entries,ID为{0}的战利品表,没有指定条目。,"Loot list with ID {0}, no entry specified.",ID{0}の戦利品テーブルは、エントリ指定されていません。
log_not_within_the_loot_spawn_range,给定的数值{0}没有在战利品{1}的生成范围{2}内。,The given value {0} is not within the spawn range {2} of loot {1}.,与えられた数値{0}は戦利品{1}の生成範囲{2}内にありません。 log_not_within_the_loot_spawn_range,给定的数值{0}没有在战利品{1}的生成范围{2}内。,The given value {0} is not within the spawn range {2} of loot {1}.,与えられた数値{0}は戦利品{1}の生成範囲{2}内にありません。
log_loot_data_quantity,有{0}个战利品数据被返回。,{0} loot data was returned.,{0}個の戦利品データが返されます。 log_loot_data_quantity,有{0}个战利品数据被返回。,{0} loot data was returned.,{0}個の戦利品データが返されます。
log_start_item_register_from_file,开始从文件注册物品信息,Start registering item information from files,アイテム情報をファイルから登録開始 log_start_item_register_from_file,开始从文件注册物品信息,Start registering item information from files,アイテム情報をファイルから登録開始
log_item_register_from_file,从文件{0}中注册物品信息,Registering item information from file {0},ファイル{0}からアイテム情報を登録する log_item_register_from_file,从文件{0}中注册物品信息,Registering item information from file {0},ファイル{0}からアイテム情報を登録する
log_item_register_find_item_in_file,注册发现的物品{0},Register discovered item {0},見つかったアイテム{0}を登録 log_item_register_find_item_in_file,注册发现的物品{0},Register discovered item {0},見つかったアイテム{0}を登録

1 id zh en ja
26 log_loot_list_has_no_entries ID为{0}的战利品表,没有指定条目。 Loot list with ID {0}, no entry specified. ID{0}の戦利品テーブルは、エントリ指定されていません。
27 log_not_within_the_loot_spawn_range 给定的数值{0}没有在战利品{1}的生成范围{2}内。 The given value {0} is not within the spawn range {2} of loot {1}. 与えられた数値{0}は戦利品{1}の生成範囲{2}内にありません。
28 log_loot_data_quantity 有{0}个战利品数据被返回。 {0} loot data was returned. {0}個の戦利品データが返されます。
log_start_item_register_from_file 开始从文件注册物品信息 Start registering item information from files アイテム情報をファイルから登録開始
29 log_item_register_from_file log_start_item_register_from_file 从文件{0}中注册物品信息 开始从文件注册物品信息 Registering item information from file {0} Start registering item information from files ファイル{0}からアイテム情報を登録する アイテム情報をファイルから登録開始
30 log_item_register_find_item_in_file log_item_register_from_file 注册发现的物品{0} 从文件{0}中注册物品信息 Register discovered item {0} Registering item information from file {0} 見つかったアイテム{0}を登録 ファイル{0}からアイテム情報を登録する
31 log_error_when_open_item_regs_dir log_item_register_find_item_in_file 尝试打开物品信息目录时发生错误 注册发现的物品{0} Error when opening itemRegs dir Register discovered item {0} アイテム情報カタログを開こうとしてエラーが発生しました。 見つかったアイテム{0}を登録

View File

@ -25,3 +25,11 @@ ui_room_injection_processor,房间注入处理器,Room injection processor,部
ui_game_over_title,游戏结束!,Game Over!,ゲームオーバー! ui_game_over_title,游戏结束!,Game Over!,ゲームオーバー!
ui_death_info_describe,死因,death,死因 ui_death_info_describe,死因,death,死因
ui_restart,重新开始,Restart,ぶり返す ui_restart,重新开始,Restart,ぶり返す
ui_contributor_tips,由{0}位贡献者共同打造,Built by {0} contributors,{0}のコントリビューターが共同で作り上げました
ui_contributor,贡献者,contributor,貢献者です
ui_coder,编程,coder,程序设计
ui_artist,美术,artist,びじゅつ
ui_musician,音乐,musician,音楽
ui_character_voice,角色配音,character_voice,キャラクターボイスです
ui_translator,翻译,translator,翻訳
ui_unordered_list_tip,排名不分先后,Ranking is not in order,順位は関係ありません

1 id zh en ja
25 ui_game_over_title 游戏结束! Game Over! ゲームオーバー!
26 ui_death_info_describe 死因 death 死因
27 ui_restart 重新开始 Restart ぶり返す
28 ui_contributor_tips 由{0}位贡献者共同打造 Built by {0} contributors {0}のコントリビューターが共同で作り上げました
29 ui_contributor 贡献者 contributor 貢献者です
30 ui_coder 编程 coder 程序设计
31 ui_artist 美术 artist びじゅつ
32 ui_musician 音乐 musician 音楽
33 ui_character_voice 角色配音 character_voice キャラクターボイスです
34 ui_translator 翻译 translator 翻訳
35 ui_unordered_list_tip 排名不分先后 Ranking is not in order 順位は関係ありません

View File

@ -45,18 +45,42 @@ script = ExtResource("2_6p8mv")
[node name="StaffOfTheUndead" parent="." instance=ExtResource("3_ud0w8")] [node name="StaffOfTheUndead" parent="." instance=ExtResource("3_ud0w8")]
position = Vector2(231, 116) position = Vector2(231, 116)
_minContactInjury = null
_maxContactInjury = null
_firingIntervalAsMillisecond = null
_recoil = null
[node name="StaffOfTheUndead2" parent="." instance=ExtResource("3_ud0w8")] [node name="StaffOfTheUndead2" parent="." instance=ExtResource("3_ud0w8")]
position = Vector2(113, 149) position = Vector2(113, 149)
_minContactInjury = null
_maxContactInjury = null
_firingIntervalAsMillisecond = null
_recoil = null
[node name="StaffOfTheUndead5" parent="." instance=ExtResource("3_ud0w8")] [node name="StaffOfTheUndead5" parent="." instance=ExtResource("3_ud0w8")]
position = Vector2(213, 177) position = Vector2(213, 177)
_minContactInjury = null
_maxContactInjury = null
_firingIntervalAsMillisecond = null
_recoil = null
[node name="StaffOfTheUndead6" parent="." instance=ExtResource("3_ud0w8")] [node name="StaffOfTheUndead6" parent="." instance=ExtResource("3_ud0w8")]
position = Vector2(290, 167) position = Vector2(290, 167)
_minContactInjury = null
_maxContactInjury = null
_firingIntervalAsMillisecond = null
_recoil = null
[node name="StaffOfTheUndead3" parent="." instance=ExtResource("3_ud0w8")] [node name="StaffOfTheUndead3" parent="." instance=ExtResource("3_ud0w8")]
position = Vector2(70, 88) position = Vector2(70, 88)
_minContactInjury = null
_maxContactInjury = null
_firingIntervalAsMillisecond = null
_recoil = null
[node name="StaffOfTheUndead4" parent="." instance=ExtResource("3_ud0w8")] [node name="StaffOfTheUndead4" parent="." instance=ExtResource("3_ud0w8")]
position = Vector2(367, 85) position = Vector2(367, 85)
_minContactInjury = null
_maxContactInjury = null
_firingIntervalAsMillisecond = null
_recoil = null

View File

@ -0,0 +1,32 @@
[gd_scene load_steps=2 format=3 uid="uid://6i7rgx3sdu1k"]
[ext_resource type="Script" path="res://scripts/loader/uiLoader/ContributorGroupLoader.cs" id="1_xwjh1"]
[node name="ContributorGroup" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("1_xwjh1")
[node name="TitleLabel" type="Label" parent="."]
layout_mode = 1
anchors_preset = 10
anchor_right = 1.0
offset_bottom = 39.0
grow_horizontal = 2
theme_override_font_sizes/font_size = 25
text = "组名"
[node name="HFlowContainer" type="HFlowContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = 51.0
grow_horizontal = 2
grow_vertical = 2

View File

@ -16,6 +16,10 @@ collision_mask = 34
script = ExtResource("1_w8hhv") script = ExtResource("1_w8hhv")
ProjectileScenes = [ExtResource("2_34250")] ProjectileScenes = [ExtResource("2_34250")]
Id = "staff_of_the_undead" Id = "staff_of_the_undead"
_minContactInjury = null
_maxContactInjury = null
_firingIntervalAsMillisecond = null
_recoil = null
metadata/Projectiles = PackedStringArray("res://prefab/projectile/curseOfTheUndead.tscn") metadata/Projectiles = PackedStringArray("res://prefab/projectile/curseOfTheUndead.tscn")
[node name="DamageArea2D" type="Area2D" parent="."] [node name="DamageArea2D" type="Area2D" parent="."]

68
scenes/contributor.tscn Normal file
View File

@ -0,0 +1,68 @@
[gd_scene load_steps=2 format=3 uid="uid://ljvmhhrk1d6j"]
[ext_resource type="Script" path="res://scripts/loader/uiLoader/ContributorLoader.cs" id="1_ia4x6"]
[node name="Contributor" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_ia4x6")
[node name="Panel" type="Panel" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="CenterContainer" type="CenterContainer" parent="."]
layout_mode = 1
anchors_preset = 10
anchor_right = 1.0
offset_bottom = 45.0
grow_horizontal = 2
[node name="Label" type="Label" parent="CenterContainer"]
layout_mode = 2
theme_override_font_sizes/font_size = 30
text = "ui_contributor"
[node name="ExitButton" type="Button" parent="."]
layout_mode = 1
anchors_preset = 1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -86.0
offset_top = 6.0
offset_right = -19.0
offset_bottom = 39.0
grow_horizontal = 0
text = "ui_close"
[node name="VBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 20.0
offset_top = 59.0
offset_right = -18.0
offset_bottom = -20.0
grow_horizontal = 2
grow_vertical = 2
[node name="Label" type="Label" parent="."]
layout_mode = 1
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_left = 16.0
offset_top = -36.0
offset_right = 168.0
offset_bottom = -11.0
grow_vertical = 0
text = "ui_unordered_list_tip"

View File

@ -119,6 +119,12 @@ grow_vertical = 0
layout_mode = 2 layout_mode = 2
horizontal_alignment = 2 horizontal_alignment = 2
[node name="ContributorButton" type="LinkButton" parent="VBoxContainer2"]
layout_direction = 3
layout_mode = 2
text = "ui_contributor_tips"
underline = 1
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer2"] [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer2"]
layout_mode = 2 layout_mode = 2

View File

@ -0,0 +1,26 @@
namespace ColdMint.scripts.contribute;
/// <summary>
/// <para>Contributor information</para>
/// <para>贡献者数据</para>
/// </summary>
public class ContributorData
{
/// <summary>
/// <para>Contributor's name</para>
/// <para>贡献者的名字</para>
/// </summary>
public string? Name { get; set; }
/// <summary>
/// <para>Links to contributors' home pages</para>
/// <para>贡献者的主页链接</para>
/// </summary>
public string? Url { get; set; }
/// <summary>
/// <para>Type of contribution</para>
/// <para>贡献的类型</para>
/// </summary>
public ContributorType[]? ContributorTypes { get; set; }
}

View File

@ -0,0 +1,151 @@
using System;
using System.Collections.Generic;
using ColdMint.scripts.utils;
namespace ColdMint.scripts.contribute;
/// <summary>
/// <para>Contributor data Manager</para>
/// <para>贡献者数据管理器</para>
/// </summary>
public static class ContributorDataManager
{
private static Dictionary<ContributorType, List<ContributorData>>? _contributorTypeDictionary;
private static readonly ContributorData[] ContributorArray =
[
new ContributorData
{
Name = "Cold-Mint",
Url = "https://github.com/Cold-Mint",
ContributorTypes = [ContributorType.Coder]
},
new ContributorData
{
Name = "Web13234",
Url = "https://github.com/Web13234",
ContributorTypes = [ContributorType.Coder]
},
new ContributorData
{
Name = "HYPERLINK BLOCKED",
Url = "https://www.pixiv.net/users/74412798",
ContributorTypes = [ContributorType.Artist]
}
];
/// <summary>
/// <para>Get contributor totals</para>
/// <para>获取贡献者总数</para>
/// </summary>
/// <returns></returns>
public static int GetContributorTotals()
{
return ContributorArray.Length;
}
/// <summary>
/// <para>Gets a dictionary of contribution types to the contributor array</para>
/// <para>获取贡献类型到贡献者数组的字典</para>
/// </summary>
/// <remarks>
///<para>Cache the results after calling this method, as it is very expensive to generate results.</para>
///<para>调用此方法后请将结果缓存起来,因为生成结果是非常昂贵的。</para>
/// </remarks>
/// <returns>
/// </returns>
public static Dictionary<ContributorType, ContributorData[]>? GetContributorTypeToContributorDataArray()
{
if (_contributorTypeDictionary == null)
{
return null;
}
var result = new Dictionary<ContributorType, ContributorData[]>();
foreach (var contributorType in _contributorTypeDictionary.Keys)
{
result[contributorType] = _contributorTypeDictionary[contributorType].ToArray();
}
return result;
}
/// <summary>
/// <para>Register all contributor data</para>
/// <para>注册所有的贡献者数据</para>
/// </summary>
public static void RegisterAllContributorData()
{
if (_contributorTypeDictionary!= null)
{
return;
}
foreach (var contributorData in ContributorArray)
{
RegisterContributorData(contributorData);
}
}
/// <summary>
/// <para>Gets a string description of a contribution type</para>
/// <para>获取某个贡献类型的字符串描述</para>
/// </summary>
/// <param name="contributorType"></param>
/// <returns></returns>
/// <exception cref="ArgumentOutOfRangeException"></exception>
public static string? ContributorTypeToString(ContributorType contributorType)
{
return contributorType switch
{
ContributorType.Coder => TranslationServerUtils.Translate("ui_coder"),
ContributorType.Artist => TranslationServerUtils.Translate("ui_artist"),
ContributorType.Musician => TranslationServerUtils.Translate("ui_musician"),
ContributorType.CharacterVoice => TranslationServerUtils.Translate("ui_character_voice"),
ContributorType.Translator => TranslationServerUtils.Translate("ui_translator"),
_ => throw new ArgumentOutOfRangeException(nameof(contributorType), contributorType, null)
};
}
/// <summary>
/// <para>Register contributor data to the type dictionary</para>
/// <para>注册贡献者数据到类型字典</para>
/// </summary>
/// <param name="contributorType"></param>
/// <param name="contributorData"></param>
private static void AddContributorDataToTypeDictionary(ContributorType contributorType,
ContributorData contributorData)
{
if (_contributorTypeDictionary == null)
{
return;
}
if (_contributorTypeDictionary.ContainsKey(contributorType))
{
_contributorTypeDictionary[contributorType].Add(contributorData);
}
else
{
_contributorTypeDictionary[contributorType] = [contributorData];
}
}
/// <summary>
/// <para>Register Contributor data</para>
/// <para>注册贡献者数据</para>
/// </summary>
/// <param name="contributorData"></param>
private static void RegisterContributorData(ContributorData contributorData)
{
if (contributorData.Name == null || contributorData.ContributorTypes == null)
{
return;
}
_contributorTypeDictionary ??= new Dictionary<ContributorType, List<ContributorData>>();
foreach (var contributorDataContributorType in contributorData.ContributorTypes)
{
AddContributorDataToTypeDictionary(contributorDataContributorType, contributorData);
}
}
}

View File

@ -0,0 +1,54 @@
namespace ColdMint.scripts.contribute;
/// <summary>
/// <para>Contribution type</para>
/// <para>贡献类型</para>
/// </summary>
public enum ContributorType
{
/// <summary>
/// <para>Coder</para>
/// <para>程序员</para>
/// </summary>
/// <remarks>
///<para>Contributed code to the project</para>
///<para>为项目贡献了代码</para>
/// </remarks>
Coder,
/// <summary>
/// <para>Artist</para>
/// <para>美术</para>
/// </summary>
/// <remarks>
///<para>Contributed art assets to the project</para>
///<para>为项目贡献了美术资产</para>
/// </remarks>
Artist,
/// <summary>
/// <para>Musician</para>
/// <para>音乐家</para>
/// </summary>
/// <remarks>
///<para>Contributed music, sound assets to the project</para>
///<para>为项目贡献了音乐,音效资产</para>
/// </remarks>
Musician,
/// <summary>
/// <para>CharacterVoice</para>
/// <para>角色配音</para>
/// </summary>
/// <remarks>
///<para>Contributed voice to the game character</para>
///<para>为游戏角色贡献了语音</para>
/// </remarks>
CharacterVoice,
/// <summary>
/// <para>Translator</para>
/// <para>翻译者</para>
/// </summary>
/// <remarks>
///<para>Contribute to localization of the project(specified language)</para>
///<para>为项目的本地化做出贡献(指定的语言)</para>
/// </remarks>
Translator
}

View File

@ -210,7 +210,6 @@ public interface IItemContainer : IEnumerable<ItemSlotNode>
/// <para>IEnumerable for the item slot matched to, will be empty if there's no slot satisfies the predicate</para> /// <para>IEnumerable for the item slot matched to, will be empty if there's no slot satisfies the predicate</para>
/// <para>包含匹配到的槽位的IEnumerable当没有满足条件的槽位时为空</para> /// <para>包含匹配到的槽位的IEnumerable当没有满足条件的槽位时为空</para>
/// </returns> /// </returns>
/// <seealso cref="Match(Func{IItemStack?,bool})"/>
IEnumerable<ItemSlotNode> MatchAll(Func<ItemSlotNode, bool> predicate); IEnumerable<ItemSlotNode> MatchAll(Func<ItemSlotNode, bool> predicate);

View File

@ -1,6 +1,5 @@
using ColdMint.scripts.inventory; using ColdMint.scripts.inventory;
using ColdMint.scripts.item.itemStacks; using ColdMint.scripts.item.itemStacks;
using Godot; using Godot;
namespace ColdMint.scripts.item; namespace ColdMint.scripts.item;
@ -37,7 +36,7 @@ public partial class Packsack : RigidBody2D, IItem
public bool CanStackWith(IItem item) => false; public bool CanStackWith(IItem item) => false;
public IItemStack? SpecialStack() public IItemStack SpecialStack()
{ {
return new PacksackStack(this); return new PacksackStack(this);
} }
@ -49,8 +48,5 @@ public partial class Packsack : RigidBody2D, IItem
{ {
base._Ready(); base._Ready();
ItemContainer = new UniversalItemContainer(); ItemContainer = new UniversalItemContainer();
//Test: Add one ItemSlot for pack
ItemContainer.AddItemSlot(this);
} }
} }

View File

@ -0,0 +1,102 @@
using ColdMint.scripts.contribute;
using ColdMint.scripts.utils;
using Godot;
namespace ColdMint.scripts.loader.uiLoader;
/// <summary>
/// <para>Contributor group loader</para>
/// <para>贡献者组加载器</para>
/// </summary>
public partial class ContributorGroupLoader : UiLoaderTemplate
{
private string? _title;
private ContributorData[]? _contributorDataArray;
/// <summary>
/// <para>Contributor array</para>
/// <para>贡献者数组</para>
/// </summary>
public ContributorData[]? ContributorDataArray
{
get => _contributorDataArray;
set
{
_contributorDataArray = value;
SetContributorData(value);
}
}
/// <summary>
/// <para>The title of the contribution group</para>
/// <para>贡献组的标题</para>
/// </summary>
public string? Title
{
get => _title;
set
{
_title = value;
SetTitle(value);
}
}
private Label? _titleLabel;
private HFlowContainer? _flowContainer;
public override void InitializeUi()
{
_titleLabel = GetNode<Label>("TitleLabel");
_flowContainer = GetNode<HFlowContainer>("HFlowContainer");
//If there is initial data, it is loaded at startup.
//如果有初始数据,那么在启动时加载。
SetTitle(_title);
SetContributorData(_contributorDataArray);
}
/// <summary>
/// <para>Set contributor array</para>
/// <para>设置贡献者数组</para>
/// </summary>
/// <param name="contributorDataArray"></param>
private void SetContributorData(ContributorData[]? contributorDataArray)
{
if (_flowContainer == null)
{
return;
}
NodeUtils.DeleteAllChild(_flowContainer);
if (contributorDataArray == null || contributorDataArray.Length == 0)
{
return;
}
foreach (var contributorData in contributorDataArray)
{
var linkButton = new LinkButton();
linkButton.Text = contributorData.Name;
linkButton.Uri = contributorData.Url;
_flowContainer.AddChild(linkButton);
}
}
/// <summary>
/// <para>Set Title</para>
/// <para>设置标题</para>
/// </summary>
/// <param name="title"></param>
private void SetTitle(string? title)
{
if (_titleLabel != null)
{
if (title == null)
{
_titleLabel.Hide();
}
else
{
_titleLabel.Show();
_titleLabel.Text = title;
}
}
}
}

View File

@ -0,0 +1,73 @@
using System.Collections.Generic;
using ColdMint.scripts.contribute;
using ColdMint.scripts.utils;
using Godot;
namespace ColdMint.scripts.loader.uiLoader;
/// <summary>
/// <para>ContributorLoader</para>
/// <para>贡献者页面加载器</para>
/// </summary>
public partial class ContributorLoader : UiLoaderTemplate
{
private Button? _exitButton;
private VBoxContainer? _boxContainer;
private PackedScene? _packedScene;
private PackedScene? _mainMenu;
private PackedScene? _contributorGroup;
public override void InitializeData()
{
_mainMenu = GD.Load<PackedScene>("res://scenes/mainMenu.tscn");
_packedScene = GD.Load<PackedScene>("res://prefab/ui/contributorGroup.tscn");
_contributorGroup = GD.Load<PackedScene>("res://prefab/ui/contributorGroup.tscn");
}
public override void InitializeUi()
{
_exitButton = GetNode<Button>("ExitButton");
_boxContainer = GetNode<VBoxContainer>("VBoxContainer");
var dictionary =
ContributorDataManager.GetContributorTypeToContributorDataArray();
if (dictionary != null)
{
foreach (var contributorType in dictionary.Keys)
{
AddGroup(ContributorDataManager.ContributorTypeToString(contributorType), dictionary[contributorType]);
}
}
}
private void AddGroup(string? title, ContributorData[] contributorDataArray)
{
if (_boxContainer == null || _contributorGroup == null)
{
return;
}
var contributorGroupLoader = NodeUtils.InstantiatePackedScene<ContributorGroupLoader>(_contributorGroup);
if (contributorGroupLoader != null)
{
contributorGroupLoader.Title = title;
contributorGroupLoader.ContributorDataArray = contributorDataArray;
_boxContainer.AddChild(contributorGroupLoader);
}
}
public override void LoadUiActions()
{
if (_exitButton != null)
{
_exitButton.Pressed += () =>
{
if (_mainMenu == null)
{
return;
}
GetTree().ChangeSceneToPacked(_mainMenu);
};
}
}
}

View File

@ -36,6 +36,7 @@ public partial class LevelGraphEditorLoader : UiLoaderTemplate
private PackedScene? _roomNodeScene; private PackedScene? _roomNodeScene;
private readonly List<Node> _selectedNodes = new(); private readonly List<Node> _selectedNodes = new();
private PackedScene? _mainMenu;
/// <summary> /// <summary>
/// <para>Displays the time to enter the suggestion</para> /// <para>Displays the time to enter the suggestion</para>
@ -59,7 +60,8 @@ public partial class LevelGraphEditorLoader : UiLoaderTemplate
public override void InitializeData() public override void InitializeData()
{ {
base.InitializeData(); base.InitializeData();
_roomNodeScene = (PackedScene)GD.Load("res://prefab/ui/RoomNode.tscn"); _mainMenu = GD.Load<PackedScene>("res://scenes/mainMenu.tscn");
_roomNodeScene = GD.Load<PackedScene>("res://prefab/ui/RoomNode.tscn");
_defaultRoomName = TranslationServerUtils.Translate("ui_default_room_name"); _defaultRoomName = TranslationServerUtils.Translate("ui_default_room_name");
var folder = Config.GetLevelGraphExportDirectory(); var folder = Config.GetLevelGraphExportDirectory();
if (!Directory.Exists(folder)) if (!Directory.Exists(folder))
@ -310,7 +312,11 @@ public partial class LevelGraphEditorLoader : UiLoaderTemplate
{ {
_nodeBinding.ReturnButton.Pressed += () => _nodeBinding.ReturnButton.Pressed += () =>
{ {
GetTree().ChangeSceneToPacked((PackedScene)GD.Load("res://scenes/mainMenu.tscn")); if (_mainMenu == null)
{
return;
}
GetTree().ChangeSceneToPacked(_mainMenu);
}; };
} }

View File

@ -3,13 +3,14 @@ using System.IO;
using System.Text; using System.Text;
using ColdMint.scripts.camp; using ColdMint.scripts.camp;
using ColdMint.scripts.contribute;
using ColdMint.scripts.deathInfo; using ColdMint.scripts.deathInfo;
using ColdMint.scripts.debug; using ColdMint.scripts.debug;
using ColdMint.scripts.inventory; using ColdMint.scripts.inventory;
using ColdMint.scripts.item; using ColdMint.scripts.item;
using ColdMint.scripts.map; using ColdMint.scripts.map;
using ColdMint.scripts.map.roomInjectionProcessor; using ColdMint.scripts.map.roomInjectionProcessor;
using ColdMint.scripts.utils;
using Godot; using Godot;
namespace ColdMint.scripts.loader.uiLoader; namespace ColdMint.scripts.loader.uiLoader;
@ -24,9 +25,12 @@ public partial class MainMenuLoader : UiLoaderTemplate
private Label? _copyrightLabel; private Label? _copyrightLabel;
private StringBuilder? _copyrightBuilder; private StringBuilder? _copyrightBuilder;
private PackedScene? _gameScene; private PackedScene? _gameScene;
private PackedScene? _contributor;
private PackedScene? _levelGraphEditor;
private Label? _sloganLabel; private Label? _sloganLabel;
private Label? _versionLabel; private Label? _versionLabel;
private Button? _levelGraphEditorButton; private Button? _levelGraphEditorButton;
private LinkButton? _contributorButton;
public override void InitializeData() public override void InitializeData()
{ {
@ -69,6 +73,7 @@ public partial class MainMenuLoader : UiLoaderTemplate
LootListManager.RegisterLootList(testLootList); LootListManager.RegisterLootList(testLootList);
} }
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());
@ -93,7 +98,9 @@ public partial class MainMenuLoader : UiLoaderTemplate
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 = (PackedScene)GD.Load("res://scenes/game.tscn"); _gameScene = GD.Load<PackedScene>("res://scenes/game.tscn");
_contributor = GD.Load<PackedScene>("res://scenes/contributor.tscn");
_levelGraphEditor = GD.Load<PackedScene>("res://scenes/levelGraphEditor.tscn");
//Register ItemTypes from file //Register ItemTypes from file
//从文件注册物品类型 //从文件注册物品类型
@ -105,6 +112,7 @@ public partial class MainMenuLoader : UiLoaderTemplate
public override void InitializeUi() public override void InitializeUi()
{ {
_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.
@ -132,6 +140,9 @@ public partial class MainMenuLoader : UiLoaderTemplate
_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 =
TranslationServerUtils.TranslateWithFormat("ui_contributor_tips",
ContributorDataManager.GetContributorTotals());
} }
public override void LoadUiActions() public override void LoadUiActions()
@ -141,16 +152,36 @@ public partial class MainMenuLoader : UiLoaderTemplate
_startGameButton.Pressed += () => _startGameButton.Pressed += () =>
{ {
LogCat.Log("start_game"); LogCat.Log("start_game");
if (_gameScene == null)
{
return;
}
GetTree().ChangeSceneToPacked(_gameScene); GetTree().ChangeSceneToPacked(_gameScene);
}; };
} }
if (_contributorButton!=null)
{
_contributorButton.Pressed += () =>
{
if (_contributor == null)
{
return;
}
GetTree().ChangeSceneToPacked(_contributor);
};
}
if (_levelGraphEditorButton != null) if (_levelGraphEditorButton != null)
{ {
_levelGraphEditorButton.Pressed += () => _levelGraphEditorButton.Pressed += () =>
{ {
LogCat.Log("level_graph_editor"); LogCat.Log("level_graph_editor");
GetTree().ChangeSceneToPacked((PackedScene)GD.Load("res://scenes/levelGraphEditor.tscn")); if (_levelGraphEditor == null)
{
return;
}
GetTree().ChangeSceneToPacked(_levelGraphEditor);
}; };
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

After

Width:  |  Height:  |  Size: 1011 B