コード例 #1
0
    public static QuquBattler Create(Item item)
    {
        var         colorId = item[2002];
        var         partId  = item[2003];
        QuquBattler result  = new QuquBattler
        {
            Status        = BattlerStatus.存活,
            Hp            = QuquSystem.instance.GetData(colorId, partId, 11),
            MaxHp         = QuquSystem.instance.GetData(colorId, partId, 11),
            Sp            = QuquSystem.instance.GetData(colorId, partId, 12),
            MaxSp         = QuquSystem.instance.GetData(colorId, partId, 12),
            Level         = item.Get <int>(8),
            ColorId       = item.Get <int>(2002),
            PartId        = item.Get <int>(2003),
            气势            = QuquSystem.instance.GetData(colorId, partId, 21),
            角力            = QuquSystem.instance.GetData(colorId, partId, 22),
            牙钳            = QuquSystem.instance.GetData(colorId, partId, 23),
            暴击率           = QuquSystem.instance.GetData(colorId, partId, 31),
            暴击增伤          = QuquSystem.instance.GetData(colorId, partId, 32),
            击伤调整          = QuquSystem.instance.GetData(colorId, partId, 36),
            格挡率           = QuquSystem.instance.GetData(colorId, partId, 33),
            格挡数值          = QuquSystem.instance.GetData(colorId, partId, 34),
            反击率           = QuquSystem.instance.GetData(colorId, partId, 35),
            Durability    = item.Get <int>(901),
            MaxDurability = item.Get <int>(902),
            Name          = QuquSystem.instance.GetName(colorId, partId),
        };

        return(result);
    }
コード例 #2
0
    public QuquBattler MakeOne(int colorId, int partId)
    {
        int maxHp = GetData(colorId, partId, 1) + GetData(colorId, partId, 11) / 20;

        maxHp += Random.Range(-(maxHp * 35 / 100), maxHp * 35 / 100 + 1);
        var item = new Item
        {
            [2002] = colorId,
            [2003] = partId,
            [902]  = maxHp,
            [901]  = maxHp,
            [2007] = GetData(colorId, partId, 98) * Random.Range(0, 21) / 100,
        };

        var battler = QuquBattler.Create(item);

        for (int i = 0; i < Mathf.Min(3, maxHp - 1); i++)
        {
            if (Random.Range(0, 100) < 10)
            {
                battler.GetDamage(QuquBattler.DamageTyp.耐力, 1);
                battler.GetDamage(QuquBattler.DamageTyp.属性);
            }
        }
        return(battler);
    }
コード例 #3
0
    private void SetDamage(QuquBattler battler, QuquBattler.DamageTyp typ, int value = 0)
    {
        var change = battler.GetDamage(typ, value);

        if (showDetail && typ != QuquBattler.DamageTyp.属性)
        {
            detail += $"    {battler.Name} {typ}: {change[0]}>>{change[1]}\n";
        }
    }
コード例 #4
0
    private void 普攻(bool 我方先手)
    {
        bool 我方进攻 = 我方先手;

        for (int i = 0; i < 2; i++)
        {
            Count[1]++;
            if (showDetail)
            {
                detail += $"  进攻{Count[1]}\n";
            }
            QuquBattler 进攻者  = battlers[我方进攻 ? 0 : 1];
            QuquBattler 防守者  = battlers[我方进攻 ? 1 : 0];
            bool        触发暴击 = false;
            bool        触发格挡 = false;
            bool        触发反击 = false;
            int         伤害   = 进攻者.牙钳;
            if (Random.Range(0, 100) < 进攻者.暴击率)
            {
                触发暴击 = true;
                伤害  += 进攻者.暴击增伤;
            }
            if (Random.Range(0, 100) < 防守者.格挡率)
            {
                触发格挡 = true;
                伤害   = Mathf.Max(0, 伤害 - 防守者.格挡数值);
            }
            触发反击 = (Random.Range(0, 100) < 防守者.反击率);
            if (斗(我方进攻, !我方进攻, 伤害, 触发暴击, 触发格挡, 触发反击))
            {
                i = 0;                                        //如果有过反击,则一定还有半轮
            }
            if (进攻者.IsDead || 防守者.IsDead)
            {
                return;
            }
            我方进攻 = !我方进攻; //交换半场
        }
    }
コード例 #5
0
    private bool  斗(bool 进攻方, bool 受伤方, int 耐力伤害, bool 触发暴击, bool 触发格挡, bool 触发反击, bool 是反击 = false, int 反击计数 = 0)
    {
        while (true)
        {
            Count[2]++;
            QuquBattler 伤害来源 = battlers[受伤方 ? 1 : 0];
            QuquBattler 受伤者  = battlers[受伤方 ? 0 : 1];

            int 斗性伤害 = 0;
            if (触发暴击 | 是反击)
            {
                斗性伤害 = 伤害来源.气势;
            }
            if (触发格挡)
            {
                斗性伤害 = Mathf.Max(0, 斗性伤害 - 受伤者.格挡数值);
            }
            else if (触发暴击)
            {
                int 击伤率 = 伤害来源.暴击率 + 伤害来源.击伤调整;
                if (Random.Range(0, 100) < 击伤率)
                {
                    SetDamage(受伤者, QuquBattler.DamageTyp.耐久, 1);
                    if (Random.Range(0, 100) < 击伤率)
                    {
                        SetDamage(受伤者, QuquBattler.DamageTyp.属性);
                    }
                }
            }
            SetDamage(受伤者, QuquBattler.DamageTyp.耐力, 耐力伤害);
            if (斗性伤害 > 0)
            {
                SetDamage(受伤者, QuquBattler.DamageTyp.斗性, 斗性伤害);
            }

            if (受伤者.IsDead || !触发反击)
            {
                return(是反击);                     //若本次不触发反击,缠斗结束
            }
            //下一次攻击的反击判定
            bool 反击将触发暴击 = false;
            bool 反击将触发格挡 = false;
            int  反击伤害    = 进攻方 != 受伤方 ? 受伤者.角力 : 受伤者.牙钳;
            if (Random.Range(0, 100) < 受伤者.暴击率)
            {
                反击将触发暴击 = true;
                反击伤害   += 受伤者.暴击增伤;
            }
            if (Random.Range(0, 100) < 伤害来源.格挡率)
            {
                反击将触发格挡 = true;
                反击伤害    = Mathf.Max(0, 反击伤害 - 伤害来源.格挡数值);
            }
            bool 反击将触发反击 = false;
            int  反击概率    = 伤害来源.反击率 - 反击计数 * 反击衰减;
            if (Random.Range(0, 100) < 反击概率)
            {
                反击将触发反击 = true;
            }
            受伤方  = !受伤方;
            耐力伤害 = 反击伤害;
            触发暴击 = 反击将触发暴击;
            触发格挡 = 反击将触发格挡;
            触发反击 = 反击将触发反击;
            是反击  = true;
            反击计数++;
        }
    }