Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / activity / role / RoleState.cs

using System;
using Config;

/// <summary>
/// 角色属性类
/// </summary>
public class RoleState
{
    /// <summary>
    /// 金币数量
    /// </summary>
    public int Gold = 0;
    
    /// <summary>
    /// 是否可以拾起武器
    /// </summary>
    public bool CanPickUpWeapon = false;

    /// <summary>
    /// 移动速度
    /// </summary>
    public float MoveSpeed = 120f;
        
    /// <summary>
    /// 移动加速度
    /// </summary>
    public float Acceleration = 1500f;
    
    /// <summary>
    /// 移动摩擦力, 仅用于人物基础移动
    /// </summary>
    public float Friction = 900f;
    
    /// <summary>
    /// 单格护盾恢复时间, 单位: 秒
    /// </summary>
    public float ShieldRecoveryTime = 18;

    /// <summary>
    /// 受伤后的无敌时间, 单位: 秒
    /// </summary>
    public float WoundedInvincibleTime = 1f;

    /// <summary>
    /// 护盾被攻击后的无敌时间, 单位: 秒
    /// </summary>
    public float ShieldInvincibleTime = 0.4f;

    /// <summary>
    /// 近战攻击间隔时间
    /// </summary>
    public float MeleeAttackTime = 0.5f;

    /// <summary>
    /// 攻击/发射后计算伤害
    /// </summary>
    public event Action<int, RefValue<int>> CalcDamageEvent;
    public int CalcDamage(int damage)
    {
        if (CalcDamageEvent != null)
        {
            var result = new RefValue<int>(damage);
            CalcDamageEvent(damage, result);
            return result.Value;
        }

        return damage;
    }

    /// <summary>
    /// 受伤后计算受到的伤害
    /// </summary>
    public event Action<int, RefValue<int>> CalcHurtDamageEvent;
    public int CalcHurtDamage(int damage)
    {
        if (CalcHurtDamageEvent != null)
        {
            var result = new RefValue<int>(damage);
            CalcHurtDamageEvent(damage, result);
            return result.Value;
        }

        return damage;
    }

    /// <summary>
    /// 武器初始散射值增量
    /// </summary>
    public event Action<float, RefValue<float>> CalcStartScatteringEvent;
    public float CalcStartScattering(float value)
    {
        if (CalcStartScatteringEvent != null)
        {
            var result = new RefValue<float>(value);
            CalcStartScatteringEvent(value, result);
            return result.Value;
        }

        return value;
    }

    /// <summary>
    /// 武器最终散射值增量
    /// </summary>
    public event Action<float, RefValue<float>> CalcFinalScatteringEvent;
    public float CalcFinalScattering(float value)
    {
        if (CalcFinalScatteringEvent != null)
        {
            var result = new RefValue<float>(value);
            CalcFinalScatteringEvent(value, result);
            return result.Value;
        }

        return value;
    }

    /// <summary>
    /// 武器开火发射子弹数量
    /// </summary>
    public event Action<int, RefValue<int>> CalcBulletCountEvent;
    public int CalcBulletCount(int count)
    {
        if (CalcBulletCountEvent != null)
        {
            var result = new RefValue<int>(count);
            CalcBulletCountEvent(count, result);
            return result.Value;
        }

        return count;
    }

    /// <summary>
    /// 子弹偏移角度, 角度制
    /// </summary>
    public event Action<float, RefValue<float>> CalcBulletDeviationAngleEvent;
    public float CalcBulletDeviationAngle(float angle)
    {
        if (CalcBulletDeviationAngleEvent != null)
        {
            var result = new RefValue<float>(angle);
            CalcBulletDeviationAngleEvent(angle, result);
            return result.Value;
        }

        return angle;
    }

    /// <summary>
    /// 子弹速度
    /// </summary>
    public event Action<float, RefValue<float>> CalcBulletSpeedEvent;
    public float CalcBulletSpeed(float speed)
    {
        if (CalcBulletSpeedEvent != null)
        {
            var result = new RefValue<float>(speed);
            CalcBulletSpeedEvent(speed, result);
            return result.Value;
        }

        return speed;
    }
    
    /// <summary>
    /// 子弹射程
    /// </summary>
    public event Action<float, RefValue<float>> CalcBulletDistanceEvent;
    public float CalcBulletDistance(float distance)
    {
        if (CalcBulletDistanceEvent != null)
        {
            var result = new RefValue<float>(distance);
            CalcBulletDistanceEvent(distance, result);
            return result.Value;
        }

        return distance;
    }

    /// <summary>
    /// 子弹击退
    /// </summary>
    public event Action<float, RefValue<float>> CalcBulletRepelEvent;
    public float CalcBulletRepel(float distance)
    {
        if (CalcBulletRepelEvent != null)
        {
            var result = new RefValue<float>(distance);
            CalcBulletRepelEvent(distance, result);
            return result.Value;
        }

        return distance;
    }

    /// <summary>
    /// 子弹反弹次数
    /// </summary>
    public event Action<int, RefValue<int>> CalcBulletBounceCountEvent;
    public int CalcBulletBounceCount(int distance)
    {
        if (CalcBulletBounceCountEvent != null)
        {
            var result = new RefValue<int>(distance);
            CalcBulletBounceCountEvent(distance, result);
            return result.Value;
        }

        return distance;
    }
    
    /// <summary>
    /// 子弹穿透次数
    /// </summary>
    public event Action<int, RefValue<int>> CalcBulletPenetrationEvent;
    public int CalcBulletPenetration(int distance)
    {
        if (CalcBulletPenetrationEvent != null)
        {
            var result = new RefValue<int>(distance);
            CalcBulletPenetrationEvent(distance, result);
            return result.Value;
        }

        return distance;
    }

    /// <summary>
    /// 计算获取的金币
    /// </summary>
    public event Action<int, RefValue<int>> CalcGetGoldEvent;
    public int CalcGetGold(int gold)
    {
        if (CalcGetGoldEvent != null)
        {
            var result = new RefValue<int>(gold);
            CalcGetGoldEvent(gold, result);
            return result.Value;
        }

        return gold;
    }

    /// <summary>
    /// 计算射出的子弹
    /// </summary>
    public event Action<ExcelConfig.BulletBase, RefValue<ExcelConfig.BulletBase>> CalcBulletEvent;
    public ExcelConfig.BulletBase CalcBullet(ExcelConfig.BulletBase attributeBullet)
    {
        if (CalcBulletEvent != null)
        {
            var result = new RefValue<ExcelConfig.BulletBase>(attributeBullet);
            CalcBulletEvent(attributeBullet, result);
            return result.Value;
        }

        return attributeBullet;
    }
}