public AttackingPlayer(Weapon weapon, int combatLevel, AccuracyModifier accuracyMod, AffinityModifier affinityMod)
 {
     this.combatLevel = combatLevel;
     this.weapon      = weapon;
     this.affinityMod = affinityMod;
     this.accuracyMod = accuracyMod;
 }
示例#2
0
    //  Add up all active effects into one final effect for each category
    private void DetermineEffects()
    {
        //  Reset all effects
        accMod      = new AccuracyModifier();
        levelMod    = new LevelModifier();
        hcMod       = new HitChanceModifier();
        affinityMod = new AffinityModifier();

        //  O(n) time since we need to either cache or recalculate all effects
        //  I chose to calculate since I have previously cached most values so this simply goes through each effect; hence O(n)
        //  List<List<AbsEffect>>
        foreach (ModifierList list in modLists)
        {
            //  List<AbsEffect>
            foreach (AbsEffect effect in list.ActiveEffects())
            {
                AddEffect(effect);
            }
        }

        //  Set each modifier and calculate hit chance
        model.SetAccuracyMod(in accMod);
        model.SetLevelMod(in levelMod);
        model.SetHitChanceMod(in hcMod);
        model.SetAffinityMod(in affinityMod);
        CalculateHitChance();
    }
示例#3
0
文件: MoveE.cs 项目: gyyfifafans/PBO
        public static bool CanHit(DefContext def)
        {
            var atk  = def.AtkContext;
            var aer  = atk.Attacker;
            var c    = atk.Controller;
            var move = atk.Move;
            int acc;

            if (move.Class == MoveClass.OHKO)
            {
                acc = move.Move.Accuracy + aer.Pokemon.Lv - def.Defender.Pokemon.Lv;
                if (move.Id == Ms.SHEER_COLD && !aer.OnboardPokemon.Types.Contains(BattleType.Ice))
                {
                    acc = acc - 10;
                }
            }
            else
            {
                int lv;
                if (def.AbilityE(As.UNAWARE))
                {
                    lv = 0;
                }
                else
                {
                    lv = aer.OnboardPokemon.AccuracyLv;
                }
                //如果攻击方是天然特性,防御方的回避等级按0计算。
                //循序渐进无视防御方回避等级。
                //将攻击方的命中等级减去防御方的回避等级。
                if (!(move.IgnoreDefenderLv7D || aer.AbilityE(As.UNAWARE) || aer.AbilityE(As.KEEN_EYE)))
                {
                    lv -= def.Defender.OnboardPokemon.EvasionLv;
                }
                if (lv < -6)
                {
                    lv = -6;
                }
                else if (lv > 6)
                {
                    lv = 6;
                }
                //用技能基础命中乘以命中等级修正,向下取整。
                int numerator = 3, denominator = 3;
                if (lv > 0)
                {
                    numerator += lv;
                }
                else
                {
                    denominator -= lv;
                }
                acc  = (c.Weather == Weather.IntenseSunlight && (move.Id == Ms.THUNDER || move.Id == Ms.HURRICANE) ? 50 : atk.Move.Move.Accuracy) * numerator / denominator;
                acc *= AccuracyModifier.Execute(def);
            }
            //产生1~100的随机数,如果小于等于命中,判定为命中,否则判定为失误。
            return(c.RandomHappen(acc));
        }
示例#4
0
 public HitChance(int combatLevel, int weaponAccTier)
 {
     this.combatLevel   = combatLevel;
     this.weaponAccTier = weaponAccTier;
     this.attStyle      = (AttackType.AttackStyles) 1; //  0 is none so initiate to 1
     affinityModifier   = new AffinityModifier();
     lvlModifier        = new LevelModifier();
     accuracyModifier   = new AccuracyModifier();
     hitChanceModifier  = new HitChanceModifier();
 }
示例#5
0
    //  Add each effect to its proper variable based on EffectType
    private void AddEffect(AbsEffect effect)
    {
        switch (effect.EffectType)
        {
        case AbsEffect.EffectTypes.Level:
            levelMod += (LevelModifier)effect;
            break;

        case AbsEffect.EffectTypes.Accuracy:
            accMod += (AccuracyModifier)effect;
            break;

        case AbsEffect.EffectTypes.HitChance:
            hcMod += (HitChanceModifier)effect;
            break;

        case AbsEffect.EffectTypes.Affinity:
            affinityMod += (AffinityModifier)effect;
            break;

        default:
            break;
        }
    }