diff --git a/locals/Log.csv b/locals/Log.csv index 096e251..b9250da 100644 --- a/locals/Log.csv +++ b/locals/Log.csv @@ -5,4 +5,7 @@ build_an_index,为{0}构建索引。,"Build an index for {0}." add_file_index,添加文件索引{0}。,"Add file index {0}." index_updated,{0}索引已更新。,"{0} Index has been updated." no_manifest_file,位于{0}的数据包,没有清单文件,无法加载。,"Packet located in {0}, no manifest file, cannot be loaded." -duplicate_at_path_id,位于{0}路径{1}的Id({2})已被占用,无法加载。,"Id({2}) in {0} path {1} is occupied and cannot be loaded." \ No newline at end of file +duplicate_at_path_id,位于{0}路径{1}的Id({2})已被占用,无法加载。,"Id({2}) in {0} path {1} is occupied and cannot be loaded." +duplicate_at_path_id,位于{0}路径{1}的Id({2})已被占用,无法加载。,"Id({2}) in {0} path {1} is occupied and cannot be loaded." +map_generator_is_not_set_up,未设置地图生成器。,Map generator is not set up. +map_generator_is_not_configured,地图生成器没有有效配置。,Map Generator is not configured. \ No newline at end of file diff --git a/locals/Log.en.translation b/locals/Log.en.translation index f17951b..9e1a398 100644 Binary files a/locals/Log.en.translation and b/locals/Log.en.translation differ diff --git a/locals/Log.zh.translation b/locals/Log.zh.translation index ef39466..bfd8740 100644 Binary files a/locals/Log.zh.translation and b/locals/Log.zh.translation differ diff --git a/project.godot b/project.godot index 1be4e31..8165990 100644 --- a/project.godot +++ b/project.godot @@ -147,7 +147,6 @@ hotbar_previous={ [internationalization] locale/translations=PackedStringArray("res://locals/UI.en.translation", "res://locals/UI.zh.translation", "res://locals/Error.zh.translation", "res://locals/Error.en.translation", "res://locals/slogan.en.translation", "res://locals/slogan.zh.translation", "res://locals/Log.en.translation", "res://locals/Log.zh.translation", "res://locals/Weapon.en.translation", "res://locals/Weapon.zh.translation", "res://locals/InputMapping.en.translation", "res://locals/InputMapping.zh.translation") -locale/test="en" [layer_names] diff --git a/scripts/GameSceneNodeHolder.cs b/scripts/GameSceneNodeHolder.cs index 31e3205..9ca287f 100644 --- a/scripts/GameSceneNodeHolder.cs +++ b/scripts/GameSceneNodeHolder.cs @@ -1,4 +1,5 @@ -using ColdMint.scripts.inventory; +using ColdMint.scripts.character; +using ColdMint.scripts.inventory; using Godot; namespace ColdMint.scripts; @@ -7,7 +8,7 @@ namespace ColdMint.scripts; /// The node holder within the game scene /// 游戏场景内的节点持有者 /// -public class GameSceneNodeHolder +public static class GameSceneNodeHolder { /// /// Player instances within the game scene diff --git a/scripts/character/CharacterTemplate.cs b/scripts/character/CharacterTemplate.cs index d0b4d12..3b89ce8 100644 --- a/scripts/character/CharacterTemplate.cs +++ b/scripts/character/CharacterTemplate.cs @@ -32,7 +32,7 @@ public partial class CharacterTemplate : CharacterBody2D //Item containers are used to store items. //物品容器用于存储物品。 - protected IItemContainer? _itemContainer; + private IItemContainer? _itemContainer; public IItemContainer? ItemContainer diff --git a/scripts/character/Player.cs b/scripts/character/Player.cs index 6063f68..141b78c 100644 --- a/scripts/character/Player.cs +++ b/scripts/character/Player.cs @@ -1,64 +1,60 @@ -using Godot; using System; -using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; -using ColdMint.scripts; -using ColdMint.scripts.character; using ColdMint.scripts.damage; -using ColdMint.scripts.debug; using ColdMint.scripts.utils; using ColdMint.scripts.weapon; +using Godot; + +namespace ColdMint.scripts.character; /// /// 玩家角色 /// public partial class Player : CharacterTemplate { - private PackedScene FloatLabelPackedScene; + private PackedScene? _floatLabelPackedScene; - protected Control FloatLabel; + private Control? _floatLabel; //Empty object projectile //空的物品抛射线 - private Vector2[] emptyVector2Array = new[] { Vector2.Zero }; + private readonly Vector2[] _emptyVector2Array = new[] { Vector2.Zero }; //抛物线 - private Line2D Parabola; + private Line2D? _parabola; //用于检测玩家是否站在平台上的射线 - private RayCast2D PlatformDetectionRayCast2D; + private RayCast2D? _platformDetectionRayCast2D; //在拾捡范围内,可拾起的物品数量 - private int TotalNumberOfPickups = 0; + private int _totalNumberOfPickups; - private const float promptTextDistance = 50; + private const float PromptTextDistance = 50; //玩家可拾捡的物品 - private Node2D PickAbleItem; + private Node2D? _pickAbleItem; //抛出物品的飞行速度 - private float throwingVelocity = Config.CellSize * 13; + private float _throwingVelocity = Config.CellSize * 13; //射线是否与平台碰撞 - private bool CollidingWithPlatform = false; + private bool _collidingWithPlatform; //How long does it take for the character to recover from a collision with the platform after jumping off the platform (in seconds) //角色从平台上跳下后,多少时间后恢复与平台的碰撞(单位:秒) - private double PlatformCollisionRecoveryTime = 0.2f; + private double _platformCollisionRecoveryTime = 0.2f; //物品被扔出后多长时间恢复与地面和平台的碰撞(单位:秒) - private double ItemCollisionRecoveryTime = 0.045f; + private readonly double _itemCollisionRecoveryTime = 0.045f; public override void _Ready() { base._Ready(); CharacterName = TranslationServer.Translate("default_player_name"); - FloatLabelPackedScene = GD.Load("res://prefab/ui/FloatLabel.tscn"); - Parabola = GetNode("Parabola"); - PlatformDetectionRayCast2D = GetNode("PlatformDetectionRayCast"); + _floatLabelPackedScene = GD.Load("res://prefab/ui/FloatLabel.tscn"); + _parabola = GetNode("Parabola"); + _platformDetectionRayCast2D = GetNode("PlatformDetectionRayCast"); UpdateOperationTip(); GameSceneNodeHolder.HealthBarUi.MaxHp = MaxHp; GameSceneNodeHolder.HealthBarUi.CurrentHp = CurrentHp; @@ -71,16 +67,16 @@ public partial class Player : CharacterTemplate private void UpdateOperationTip() { var operationTipBuilder = new StringBuilder(); - if (TotalNumberOfPickups > 0) + if (_totalNumberOfPickups > 0) { //If there's anything around to pick up //如果周围有能捡的东西 if (CurrentItem == null) { - if (PickAbleItem != null) + if (_pickAbleItem != null) { - string name = null; - if (PickAbleItem is WeaponTemplate weaponTemplate) + string? name = null; + if (_pickAbleItem is WeaponTemplate weaponTemplate) { //When the weapon has no owner, a pick up prompt is displayed. //当武器没有主人时,显示捡起提示。 @@ -101,13 +97,13 @@ public partial class Player : CharacterTemplate } else { - string pickAbleItemName = null; - string currentItemName = null; + string? pickAbleItemName = null; + string? currentItemName = null; string mustBeThrown = TranslationServer.Translate("must_be_thrown"); - if (PickAbleItem != null) + if (_pickAbleItem != null) { //可捡的物品是武器 - if (PickAbleItem is WeaponTemplate weaponTemplate) + if (_pickAbleItem is WeaponTemplate weaponTemplate) { pickAbleItemName = TranslationServer.Translate(weaponTemplate.Name); } @@ -145,7 +141,7 @@ public partial class Player : CharacterTemplate operationTipBuilder.Append(' '); operationTipBuilder.Append(TranslationServer.Translate(InputMap.ActionGetEvents("ui_up")[0].AsText())); operationTipBuilder.Append(TranslationServer.Translate("jump")); - if (CollidingWithPlatform) + if (_collidingWithPlatform) { operationTipBuilder.Append(' '); operationTipBuilder.Append(TranslationServer.Translate(InputMap.ActionGetEvents("ui_down")[0].AsText())); @@ -177,11 +173,11 @@ public partial class Player : CharacterTemplate { //When the collision state between the platform detection ray and the platform changes //在平台检测射线与平台碰撞状态改变时 - if (PlatformDetectionRayCast2D.IsColliding() != CollidingWithPlatform) + if (_platformDetectionRayCast2D != null && _platformDetectionRayCast2D.IsColliding() != _collidingWithPlatform) { //When the state changes, update the action hint //当状态改变时,更新操作提示 - CollidingWithPlatform = PlatformDetectionRayCast2D.IsColliding(); + _collidingWithPlatform = _platformDetectionRayCast2D.IsColliding(); UpdateOperationTip(); } @@ -206,15 +202,15 @@ public partial class Player : CharacterTemplate //捡起物品 if (Input.IsActionJustPressed("pick_up")) { - var success = PickItem(PickAbleItem); + var success = PickItem(_pickAbleItem); if (success) { - PickAbleItem = null; - TotalNumberOfPickups--; - if (FloatLabel != null) + _pickAbleItem = null; + _totalNumberOfPickups--; + if (_floatLabel != null) { - FloatLabel.QueueFree(); - FloatLabel = null; + _floatLabel.QueueFree(); + _floatLabel = null; } UpdateOperationTip(); @@ -223,13 +219,13 @@ public partial class Player : CharacterTemplate if (Input.IsActionJustPressed("ui_down")) { - if (CollidingWithPlatform) + if (_collidingWithPlatform) { //When the character stands on the platform and presses the ui_down key, we cancel the collision between the character and the platform //当角色站在平台上按下 ui_down 键时,我们取消角色与平台的碰撞 var timer = new Timer(); AddChild(timer); - timer.WaitTime = PlatformCollisionRecoveryTime; + timer.WaitTime = _platformCollisionRecoveryTime; timer.OneShot = true; timer.Start(); timer.Timeout += () => @@ -246,15 +242,21 @@ public partial class Player : CharacterTemplate //抛出物品时,显示抛物线 if (Input.IsActionPressed("throw")) { - if (CurrentItem == null) + if (_parabola == null) { - Parabola.Points = emptyVector2Array; + return; } - else + + if (ItemMarker2D == null) { - Parabola.Points = - ParabolicUtils.ComputeParabolic(ItemMarker2D.Position, GetThrowVelocity(), Gravity, 0.1f); + //Cannot get the marked location of the item, then do not draw a line + //无法获取物品的标记位置,那么不绘制线 + return; } + + _parabola.Points = CurrentItem == null + ? _emptyVector2Array + : ParabolicUtils.ComputeParabolic(ItemMarker2D.Position, GetThrowVelocity(), Gravity, 0.1f); } @@ -262,15 +264,20 @@ public partial class Player : CharacterTemplate //抬起手时,抛出物品 if (Input.IsActionJustReleased("throw")) { - if (CurrentItem != null) + if (CurrentItem == null) return; + if (_parabola != null) { - Parabola.Points = new[] { Vector2.Zero }; - CurrentItem.Reparent(GameSceneNodeHolder.WeaponContainer); - if (CurrentItem is WeaponTemplate weaponTemplate) + _parabola.Points = new[] { Vector2.Zero }; + } + + CurrentItem.Reparent(GameSceneNodeHolder.WeaponContainer); + switch (CurrentItem) + { + case WeaponTemplate weaponTemplate: { var timer = new Timer(); weaponTemplate.AddChild(timer); - timer.WaitTime = ItemCollisionRecoveryTime; + timer.WaitTime = _itemCollisionRecoveryTime; timer.OneShot = true; timer.Timeout += () => { @@ -284,23 +291,20 @@ public partial class Player : CharacterTemplate timer.Start(); weaponTemplate.Sleeping = false; weaponTemplate.LinearVelocity = Vector2.Zero; + break; } - - if (CurrentItem is CharacterBody2D characterBody2D) - { + case CharacterBody2D characterBody2D: characterBody2D.Velocity = GetThrowVelocity(); - } - - if (CurrentItem is RigidBody2D rigidBody2D) - { + break; + case RigidBody2D rigidBody2D: rigidBody2D.LinearVelocity = GetThrowVelocity(); - } - - CurrentItem = null; - TotalNumberOfPickups++; - GameSceneNodeHolder.HotBar.RemoveItemFromItemSlotBySelectIndex(1); - UpdateOperationTip(); + break; } + + CurrentItem = null; + _totalNumberOfPickups++; + GameSceneNodeHolder.HotBar.RemoveItemFromItemSlotBySelectIndex(1); + UpdateOperationTip(); } } @@ -309,13 +313,18 @@ public partial class Player : CharacterTemplate { //We take the mouse position, normalize it, and then multiply it by the distance the player can throw //我们拿到鼠标的位置,将其归一化处理,然后乘以玩家可扔出的距离 - return GetLocalMousePosition().Normalized() * throwingVelocity; + return GetLocalMousePosition().Normalized() * _throwingVelocity; } public override void _Process(double delta) { AimTheCurrentItemAtAPoint(GetGlobalMousePosition()); - var itemMarker2DPosition = ItemMarker2D.Position; + var itemMarker2DPosition = Vector2.Zero; + if (ItemMarker2D != null) + { + itemMarker2DPosition = ItemMarker2D.Position; + } + var axis = Input.GetAxis("ui_left", "ui_right"); switch (axis) { @@ -323,23 +332,30 @@ public partial class Player : CharacterTemplate //Minus 1, we move to the left //-1,向左移动 FacingLeft = true; - itemMarker2DPosition.X = -ReadOnlyItemMarkerOriginalX; + if (ItemMarker2D != null) + { + itemMarker2DPosition.X = -ReadOnlyItemMarkerOriginalX; + } + Flip(); break; case 1: //1, move to the right //1,向右移动 FacingLeft = false; - itemMarker2DPosition.X = ReadOnlyItemMarkerOriginalX; + if (ItemMarker2D != null) + { + itemMarker2DPosition.X = ReadOnlyItemMarkerOriginalX; + } + Flip(); break; - default: - //0, when it's not pressed - //0,没有按下时 - break; } - ItemMarker2D.Position = itemMarker2DPosition; + if (ItemMarker2D != null) + { + ItemMarker2D.Position = itemMarker2DPosition; + } } protected override void Flip() @@ -347,12 +363,9 @@ public partial class Player : CharacterTemplate base.Flip(); //If there is a weapon, flip it too //如果有武器的话,也要翻转 - if (CurrentItem != null) + if (CurrentItem is WeaponTemplate weapon) { - if (CurrentItem is WeaponTemplate weapon) - { - weapon.Flip(FacingLeft); - } + weapon.Flip(FacingLeft); } } @@ -365,50 +378,42 @@ public partial class Player : CharacterTemplate return; } - if (node is not Node2D) + if (node is not Node2D node2D) { return; } - var node2D = node as Node2D; - TotalNumberOfPickups++; - PickAbleItem = node2D; - if (FloatLabel != null) + _totalNumberOfPickups++; + _pickAbleItem = node2D; + if (_floatLabelPackedScene != null) { - FloatLabel.QueueFree(); - } - - FloatLabel = (Control)FloatLabelPackedScene.Instantiate(); - var rotationDegreesNode2D = node2D.RotationDegrees; - var rotationDegreesNode2DAbs = Math.Abs(rotationDegreesNode2D); - if (rotationDegreesNode2DAbs > 90) - { - FloatLabel.Position = new Vector2(0, promptTextDistance); - } - else - { - FloatLabel.Position = new Vector2(0, -promptTextDistance); - } - - FloatLabel.RotationDegrees = 0 - rotationDegreesNode2D; - var label = FloatLabel.GetNode