public AttackingPlayer(Weapon weapon, int combatLevel, AccuracyModifier accuracyMod, AffinityModifier affinityMod) { this.combatLevel = combatLevel; this.weapon = weapon; this.affinityMod = affinityMod; this.accuracyMod = accuracyMod; }
// 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(); }
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)); }
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(); }
// 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; } }