✓ ESS21仅限 激进红原创特性的简单实现

komeiji514

馆主
2022/09/01
107
1
14
775
20
叠甲:编程水平有限,如有错误,欢迎指出。
Fatal Precision(准的要命):效果绝佳招式必中+威力1.2倍。代码如下:
Ruby:
Battle::AbilityEffects::DamageCalcFromUser.add(:FATALPRECISION,
  proc { |ability, user, target, move, mults, power, type|
    if Effectiveness.super_effective?(target.damageState.typeMod)
      mults[:final_damage_multiplier] *= 1.2
    end
  }
)

Battle::AbilityEffects::AccuracyCalcFromUser.add(:FATALPRECISION,
  proc { |ability, mods, user, target, move, type|
    mods[:base_accuracy] = 0 if Effectiveness.super_effective?(target.damageState.typeMod)
  }
)
第一部分由提高效果绝佳招式的威力的效果,自然联想到脑核之力,复制粘贴,改一下倍率和名称,完事。
第二部分,无防守代码中有mods[:base_accuracy] = 0,可实现招式必中。后面的判断条件就是判断是否效果绝佳。
 
最后编辑:

komeiji514

馆主
2022/09/01
107
1
14
775
20
ORAORAORAORA!(欧拉欧拉欧拉欧拉!):作用于拳类招式的亲子爱(第二次威力伤害为第一次的一半),是超级怪力(采用超极巨怪力的形象)的专属特性。
显然,参考亲子爱代码就可以了。
Move_Usage部分:
Ruby:
  def pbNumHits(user, targets)
    if (user.hasActiveAbility?(:PARENTALBOND) && pbDamagingMove? &&
       !chargingTurnMove? && targets.length == 1) ||
       (user.hasActiveAbility?(:ORAORAORAORA) && punchingMove?) 
      # Record that Parental Bond applies, to weaken the second attack
      user.effects[PBEffects::ParentalBond] = 3
      return 2
    end
    return 1
  end
&&是和,||是或,括号括起来的部分视为整体。
hasActiveAbility?用于检查某一对象是否拥有这一特性(这里是user),.punchingMove?用于检查使出招式是否为拳类招式(铁拳的代码应用了这个,参考亲子爱代码去掉move.的部分)
Move_UsageCalculation部分(340行):
Ruby:
if user.effects[PBEffects::ParentalBond] == 1
      multipliers[:power_multiplier] /= (user.hasActiveAbility?(:PARENTALBOND)) ? 4 : 2 #此处亲子爱第二次攻击伤害为四分之一,本特性则为二分之一,可根据需要自行修改。
    end
(条件)? 满足的结果:不满足的结果。
PS:也可以另加PBEffects:ORAORAORAORA并配置有关代码,不过那样要改的东西更多更繁琐,也没必要重造轮子。
 

komeiji514

馆主
2022/09/01
107
1
14
775
20
Bull Rush(猛牛狂飙):出场的首回合,攻击变为原先的1.2倍,速度变为原先的1.5倍。
Ruby:
Battle::AbilityEffects::DamageCalcFromUser.add(:BULLRUSH,
  proc { |ability, user, target, move, mults, power, type|
    mults[:attack_multiplier] *= 1.2 if user.turnCount == 1
  }
)

Battle::AbilityEffects::SpeedCalc.add(:BULLRUSH,
  proc { |ability, battler, mult|
    next mult * 1.5 if battler.turnCount == 1
  }
)
这两段代码的关键之处是如何让增益效果仅在首回合生效。
这一效果可以联想到击掌奇袭/迎头一击,这两个招式都有这样一串代码:
Ruby:
if user.turnCount > 1
      @battle.pbDisplay(_INTL("But it failed!"))
      return true
    end
可以推断出,当宝可梦在出场的首回合时,turnCount的值为1。于是就有了上述代码。
注意:要根据proc一行的内容,决定选用user还是battler。
 

komeiji514

馆主
2022/09/01
107
1
14
775
20
Frozen Mist(冰雾):不会受到招式追加效果和场地上陷阱(隐形岩、毒菱、撒菱、黏黏网)的影响。
第一个效果联想到鳞粉,直接在鳞粉的特性相关代码处加入就行了。
第二个效果联想到厚底靴这个道具,同样直接添加就可以了。
第一个效果:
Ruby:
def pbAdditionalEffectChance(user, target, effectChance = 0)
    return 0 if @battle.pbCheckGlobalAbility(:FROZENMIST)
    return 0 if target.hasActiveAbility?([:SHIELDDUST,:FROZENMIST]) && !@battle.moldBreaker
    ret = (effectChance > 0) ? effectChance : @addlEffect
    return ret if ret > 100
    if (Settings::MECHANICS_GENERATION >= 6 || @function_code != "EffectDependsOnEnvironment") &&
       (user.hasActiveAbility?(:SERENEGRACE) || user.pbOwnSide.effects[PBEffects::Rainbow] > 0)
      ret *= 2
    end
    ret = 100 if $DEBUG && Input.press?(Input::CTRL)
    return ret
  end
def pbFlinchChance(user, target)
    return 0 if flinchingMove?
    return 0 if target.hasActiveAbility?([:SHIELDDUST,:FROZENMIST]) && !@battle.moldBreaker
    ret = 0
    if user.hasActiveAbility?(:STENCH, true) ||
       user.hasActiveItem?([:KINGSROCK, :RAZORFANG], true)
      ret = 10
    end
    ret *= 2 if user.hasActiveAbility?(:SERENEGRACE) ||
                user.pbOwnSide.effects[PBEffects::Rainbow] > 0
    return ret
  end
end
第二个效果:
Ruby:
def pbEntryHazards(battler)
    battler_side = battler.pbOwnSide
    # Stealth Rock
    if battler_side.effects[PBEffects::StealthRock] && battler.takesIndirectDamage? &&
       GameData::Type.exists?(:ROCK) && !battler.hasActiveItem?(:HEAVYDUTYBOOTS) &&
       !battler.hasActiveAbility?(:FROZENMIST)
      bTypes = battler.pbTypes(true)
      eff = Effectiveness.calculate(:ROCK, *bTypes)
      if !Effectiveness.ineffective?(eff)
        battler.pbReduceHP(battler.totalhp * eff / 8, false)
        pbDisplay(_INTL("Pointed stones dug into {1}!", battler.pbThis))
        battler.pbItemHPHealCheck
      end
    end
    # Spikes
    if battler_side.effects[PBEffects::Spikes] > 0 && battler.takesIndirectDamage? &&
       !battler.airborne? && !battler.hasActiveItem?(:HEAVYDUTYBOOTS) &&
       !battler.hasActiveAbility?(:FROZENMIST)
      spikesDiv = [8, 6, 4][battler_side.effects[PBEffects::Spikes] - 1]
      battler.pbReduceHP(battler.totalhp / spikesDiv, false)
      pbDisplay(_INTL("{1} is hurt by the spikes!", battler.pbThis))
      battler.pbItemHPHealCheck
    end
    # Toxic Spikes
    if battler_side.effects[PBEffects::ToxicSpikes] > 0 && !battler.fainted? && !battler.airborne? && !battler.hasActiveAbility?(:FROZENMIST)
      if battler.pbHasType?(:POISON)
        battler_side.effects[PBEffects::ToxicSpikes] = 0
        pbDisplay(_INTL("{1} absorbed the poison spikes!", battler.pbThis))
      elsif battler.pbCanPoison?(nil, false) && !battler.hasActiveItem?(:HEAVYDUTYBOOTS)
        if battler_side.effects[PBEffects::ToxicSpikes] == 2
          battler.pbPoison(nil, _INTL("{1} was badly poisoned by the poison spikes!", battler.pbThis), true)
        else
          battler.pbPoison(nil, _INTL("{1} was poisoned by the poison spikes!", battler.pbThis))
        end
      end
    end
    # Sticky Web
    if battler_side.effects[PBEffects::StickyWeb] && !battler.fainted? && !battler.airborne? &&
       !battler.hasActiveItem?(:HEAVYDUTYBOOTS) && !battler.hasActiveAbility?(:FROZENMIST)
      pbDisplay(_INTL("{1} was caught in a sticky web!", battler.pbThis))
      if battler.pbCanLowerStatStage?(:SPEED)
        battler.pbLowerStatStage(:SPEED, 1, nil)
        battler.pbItemStatRestoreCheck
      end
    end
  end
 

TAAAAAAA

天王
管理成员
2024/06/16
241
4
36
1,270
Fatal Precision应该用power_multiplier。
ORAORAORAORA!抄亲子爱要抄完整,目前在处理蓄力技能时会有问题。
Frozen Mist还需要和破格类特性正确互动。
 

在线成员

现在没有成员在线。

最新帖子

论坛统计

主题
517
消息
2,352
成员
3,007
最新成员
ZQLdw