Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / mark / ActivityMark_HandlerExpression.cs
@小李xl 小李xl on 20 Aug 2023 2 KB 创建房间标记, 开发中

using System;
using Godot;

public partial class ActivityMark
{
    /// <summary>
    /// 根据预制表达式创建物体并返回
    /// </summary>
    /// <param name="type">物体类型</param>
    /// <param name="expressionFieldName">预制表达式字段名称, 注意是字段名称, 而不是内容</param>
    public ActivityObjectResult<T> CreateActivityObjectFromExpression<T>(ActivityType type, string expressionFieldName) where T : ActivityObject
    {
        if (_currentExpression.TryGetValue(expressionFieldName, out var expressionData))
        {
            if (expressionData.Id == "null")
            {
                return null;
            }
            var id = ActivityId.GetIdPrefix(type) + expressionData.Id;
            var activityObject = ActivityObject.Create<T>(id);
            if (activityObject == null)
            {
                return null;
            }

            HandlerExpressionArgs(type, activityObject, expressionData);
            return new ActivityObjectResult<T>(activityObject, expressionData);
        }

        GD.PrintErr("未找到表达式字段: " + expressionFieldName + ", 请检查是否有该字段或者该字段加上了[ActivityExpression]标记");
        return null;
    }

    private void HandlerExpressionArgs(ActivityType type, ActivityObject instance, ActivityExpressionData expressionData)
    {
        switch (type)
        {
            case ActivityType.None:
                break;
            case ActivityType.Player:
                break;
            case ActivityType.Test:
                break;
            case ActivityType.Role:
                break;
            case ActivityType.Enemy:
                break;
            case ActivityType.Weapon:
            {
                var weapon = (Weapon)instance;
                //当前弹夹弹药量
                if (expressionData.Args.TryGetValue("CurrAmmon", out var currAmmon))
                {
                    weapon.SetCurrAmmo(int.Parse(currAmmon));
                }
                //备用弹药量
                if (expressionData.Args.TryGetValue("ResidueAmmo", out var residueAmmo))
                {
                    weapon.SetResidueAmmo(int.Parse(residueAmmo));   
                }
            }
                break;
            case ActivityType.Bullet:
                break;
            case ActivityType.Shell:
                break;
            case ActivityType.Other:
                break;
        }
    }
}