Newer
Older
DungeonShooting / DungeonShooting_Godot / src / config / Weapon.cs
@lijincheng lijincheng on 3 Jun 2023 7 KB 克隆数据
namespace Config;

public class Weapon
{
    /// <summary>
    /// 物体唯一id <br/>
    /// 不需要添加类型前缀
    /// </summary>
    public string Id;

    /// <summary>
    /// 武器 Prefab, 必须继承场景 "res://prefab/weapon/Weapon.tscn"
    /// </summary>
    public string Prefab;

    /// <summary>
    /// 重量
    /// </summary>
    public float Weight;

    /// <summary>
    /// 武器显示的名称
    /// </summary>
    public string Name;

    /// <summary>
    /// 武器的图标
    /// </summary>
    public string Icon;

    /// <summary>
    /// 武器类型: <br/>
    /// 1.副武器 <br/>
    /// 2.主武器 <br/>
    /// 3.重型武器
    /// </summary>
    public byte WeightType;

    /// <summary>
    /// 是否连续发射, 如果为false, 则每次发射都需要扣动扳机
    /// </summary>
    public bool ContinuousShoot;

    /// <summary>
    /// 弹夹容量
    /// </summary>
    public int AmmoCapacity;

    /// <summary>
    /// 弹药容量上限
    /// </summary>
    public int MaxAmmoCapacity;

    /// <summary>
    /// 起始备用弹药数量
    /// </summary>
    public int StandbyAmmoCapacity;

    /// <summary>
    /// 装弹时间, 单位: 秒
    /// </summary>
    public float ReloadTime;

    /// <summary>
    /// 每粒子弹是否是单独装填, 如果是, 那么每上一发子弹的时间就是 ReloadTime, 可以做霰弹武器装填效果
    /// </summary>
    public bool AloneReload;

    /// <summary>
    /// 单独装填时每次装填子弹数量, 必须要将 'AloneReload' 属性设置为 true
    /// </summary>
    public int AloneReloadCount;

    /// <summary>
    /// 单独装填的子弹时可以立即射击, 必须要将 'AloneReload' 属性设置为 true
    /// </summary>
    public bool AloneReloadCanShoot;

    /// <summary>
    /// 是否为松发开火, 也就是松开扳机才开火, 若要启用该属性, 必须将 'ContinuousShoot' 设置为 false
    /// </summary>
    public bool LooseShoot;

    /// <summary>
    /// 最少需要蓄力多久才能开火, 必须将 'LooseShoot' 设置为 true
    /// </summary>
    public float MinChargeTime;

    /// <summary>
    /// 连续发射最小次数, 仅当 ContinuousShoot 为 false 时生效
    /// </summary>
    public int MinContinuousCount;

    /// <summary>
    /// 连续发射最大次数, 仅当 ContinuousShoot 为 false 时生效
    /// </summary>
    public int MaxContinuousCount;

    /// <summary>
    /// 按下一次扳机后需要多长时间才能再次感应按下
    /// </summary>
    public float TriggerInterval;

    /// <summary>
    /// 初始射速, 初始每分钟能开火次数
    /// </summary>
    public float StartFiringSpeed;

    /// <summary>
    /// 最终射速, 最终每分钟能开火次数, 仅当 ContinuousShoot 为 true 时生效
    /// </summary>
    public float FinalFiringSpeed;

    /// <summary>
    /// 按下扳机并开火后射速增加速率
    /// </summary>
    public float FiringSpeedAddSpeed;

    /// <summary>
    /// 松开扳机后射速消散速率
    /// </summary>
    public float FiringSpeedBackSpeed;

    /// <summary>
    /// 单次开火发射子弹最小数量
    /// </summary>
    public int MinFireBulletCount;

    /// <summary>
    /// 单次开火发射子弹最大数量
    /// </summary>
    public int MaxFireBulletCount;

    /// <summary>
    /// 开火前延时
    /// </summary>
    public float DelayedTime;

    /// <summary>
    /// 初始散射半径
    /// </summary>
    public float StartScatteringRange;

    /// <summary>
    /// 最终散射半径
    /// </summary>
    public float FinalScatteringRange;

    /// <summary>
    /// 每次发射后散射增加值
    /// </summary>
    public float ScatteringRangeAddValue;

    /// <summary>
    /// 松开扳机后散射销退速率
    /// </summary>
    public float ScatteringRangeBackSpeed;

    /// <summary>
    /// 松开扳机多久后开始销退散射值 (单位: 秒)
    /// </summary>
    public float ScatteringRangeBackTime;

    /// <summary>
    /// 子弹飞行最大距离
    /// </summary>
    public float MaxDistance;

    /// <summary>
    /// 子弹飞行最小距离
    /// </summary>
    public float MinDistance;

    /// <summary>
    /// 最大后坐力 (仅用于开火后武器身抖动)
    /// </summary>
    public float MaxBacklash;

    /// <summary>
    /// 最小后坐力 (仅用于开火后武器身抖动)
    /// </summary>
    public float MinBacklash;

    /// <summary>
    /// 后坐力偏移回归回归速度
    /// </summary>
    public float BacklashRegressionSpeed;

    /// <summary>
    /// 开火后武器口上抬角度
    /// </summary>
    public float UpliftAngle;

    /// <summary>
    /// 武器默认上抬角度
    /// </summary>
    public float DefaultAngle;

    /// <summary>
    /// 开火后武器口角度恢复速度倍数
    /// </summary>
    public float UpliftAngleRestore;

    /// <summary>
    /// 默认射出的子弹id
    /// </summary>
    public string BulletId;

    /// <summary>
    /// 投抛状态下物体碰撞器大小
    /// </summary>
    public SerializeVector2 ThrowCollisionSize;

    public Weapon Clone()
    {
        var inst = new Weapon();
        inst.Id = Id;
        inst.Prefab = Prefab;
        inst.Weight = Weight;
        inst.Name = Name;
        inst.Icon = Icon;
        inst.WeightType = WeightType;
        inst.ContinuousShoot = ContinuousShoot;
        inst.AmmoCapacity = AmmoCapacity;
        inst.MaxAmmoCapacity = MaxAmmoCapacity;
        inst.StandbyAmmoCapacity = StandbyAmmoCapacity;
        inst.ReloadTime = ReloadTime;
        inst.AloneReload = AloneReload;
        inst.AloneReloadCount = AloneReloadCount;
        inst.AloneReloadCanShoot = AloneReloadCanShoot;
        inst.LooseShoot = LooseShoot;
        inst.MinChargeTime = MinChargeTime;
        inst.MinContinuousCount = MinContinuousCount;
        inst.MaxContinuousCount = MaxContinuousCount;
        inst.TriggerInterval = TriggerInterval;
        inst.StartFiringSpeed = StartFiringSpeed;
        inst.FinalFiringSpeed = FinalFiringSpeed;
        inst.FiringSpeedAddSpeed = FiringSpeedAddSpeed;
        inst.FiringSpeedBackSpeed = FiringSpeedBackSpeed;
        inst.MinFireBulletCount = MinFireBulletCount;
        inst.MaxFireBulletCount = MaxFireBulletCount;
        inst.DelayedTime = DelayedTime;
        inst.StartScatteringRange = StartScatteringRange;
        inst.FinalScatteringRange = FinalScatteringRange;
        inst.ScatteringRangeAddValue = ScatteringRangeAddValue;
        inst.ScatteringRangeBackSpeed = ScatteringRangeBackSpeed;
        inst.ScatteringRangeBackTime = ScatteringRangeBackTime;
        inst.MaxDistance = MaxDistance;
        inst.MinDistance = MinDistance;
        inst.MaxBacklash = MaxBacklash;
        inst.MinBacklash = MinBacklash;
        inst.BacklashRegressionSpeed = BacklashRegressionSpeed;
        inst.UpliftAngle = UpliftAngle;
        inst.DefaultAngle = DefaultAngle;
        inst.UpliftAngleRestore = UpliftAngleRestore;
        inst.BulletId = BulletId;
        inst.ThrowCollisionSize = ThrowCollisionSize;
        return inst;
    }
}