Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / mark / EnemyMark.cs
@小李xl 小李xl on 4 Jul 2023 2 KB 优化相机

using Godot;

/// <summary>
/// 针对敌人生成位置的标记
/// </summary>
[Tool, GlobalClass]
public partial class EnemyMark : ActivityMark
{
    /// <summary>
    /// 脸默认朝向
    /// </summary>
    public enum FaceDirectionValueEnum
    {
        /// <summary>
        /// 随机
        /// </summary>
        Random,
        /// <summary>
        /// 左边
        /// </summary>
        Left,
        /// <summary>
        /// 右边
        /// </summary>
        Right
    }
    
    /// <summary>
    /// 武器1 id, id会自动加上武器前缀
    /// </summary>
    [Export(PropertyHint.Expression), ActivityExpression]
    public string Weapon1Id;
    /// <summary>
    /// 武器2 id, id会自动加上武器前缀
    /// </summary>
    [Export(PropertyHint.Expression), ActivityExpression]
    public string Weapon2Id;
    /// <summary>
    /// 脸默认的朝向
    /// </summary>
    [Export]
    public FaceDirectionValueEnum FaceDirection = FaceDirectionValueEnum.Random;

    public override void _Ready()
    {
        Type = ActivityIdPrefix.ActivityPrefixType.Enemy;
        Layer = RoomLayerEnum.YSortLayer;
        Altitude = 0;
    }

    public override void Doing(ActivityObjectResult<ActivityObject> result, RoomInfo roomInfo)
    {
        //创建敌人
        var instance = (Enemy)result.ActivityObject;
        var pos = instance.Position;
        
        //脸的朝向
        if (FaceDirection == FaceDirectionValueEnum.Random)
        {
            instance.Face = Utils.RandomBoolean() ? global::FaceDirection.Left : global::FaceDirection.Right;
        }
        else if (FaceDirection == FaceDirectionValueEnum.Left)
        {
            instance.Face = global::FaceDirection.Left;
        }
        else
        {
            instance.Face = global::FaceDirection.Right;
        }

        if (!string.IsNullOrWhiteSpace(Weapon1Id))
            CreateWeapon(instance, pos, nameof(Weapon1Id));
        if (!string.IsNullOrWhiteSpace(Weapon2Id))
            CreateWeapon(instance, pos, nameof(Weapon2Id));
    }

    //生成武器
    private void CreateWeapon(Enemy enemy, Vector2 pos, string fieldName)
    {
        var result = CreateActivityObjectFromExpression<Weapon>(ActivityIdPrefix.ActivityPrefixType.Weapon, fieldName);
        if (result != null)
        {
            //如果不能放下, 则直接扔地上
            if (!enemy.PickUpWeapon(result.ActivityObject))
            {
                result.ActivityObject.PutDown(pos, RoomLayerEnum.NormalLayer);
            }
        }
    }
}