[解決済み]能力低下スキルの魔法力依存

民々ゼミ
記事: 5
登録日時: 2016年1月20日(水) 20:01

[解決済み]能力低下スキルの魔法力依存

投稿記事by 民々ゼミ » 2016年12月31日(土) 21:40

どなたか、能力低下等のスキルを割合ではなく、スキル使用者の魔法力の数値だけ下げるというスクリプトをご存じないでしょうか?
私なりに能力低下の部分をa.matにしていじってみたのですが、無理でした :cry:
最後に編集したユーザー 民々ゼミ on 2017年1月21日(土) 07:53 [ 編集 2 回目 ]

faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 能力低下スキルの魔法力依存

投稿記事by faida » 2017年1月02日(月) 16:49

単にそれだけだと「上書きするときの処理」をどうしようかで悩む方も多いと思います。
最初に能力低下をかけたキャラと同じキャラがかけなおした能力低下の効果、別のキャラがかけなおした効果……など、
ちょっと考えることが多いのではないでしょうか。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
民々ゼミ
記事: 5
登録日時: 2016年1月20日(水) 20:01

Re: 能力低下スキルの魔法力依存

投稿記事by 民々ゼミ » 2017年1月02日(月) 22:46

返信ありがとうございます :D
私が想定しているのは
a.mat - b.mat / 2 = x
xの数値だけ対象のステータスを下げ/上げます。
重ね掛けはできず、1回のみです。
能力低下と上昇を併用した場合は、相殺されます。
例えば低下100で上昇が120, 攻撃力が100の場合は120ダメージ(防御はないものとして)となります。
別のキャラが発動してもすでに上がってる/下がってる場合には効果はありません。
faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 能力低下スキルの魔法力依存

投稿記事by faida » 2017年1月20日(金) 20:50

長らくお待たせしました。
汎用的に使えるようにするにはどうしたらいいか散々うなった結果、
多分求めておられるものとなんか違うものになってしまったかもしれません。

コード: 全て選択

=begin
◆概要
能力強化/弱体の仕様を変更し、計算式による強化/弱体を可能にします。

◆機能
・メモ欄に<能力強化 id, 計算式>と記入すると、スキルに設定されたid(0~7)の強化が
発動するときにその計算式を適用します。
・メモ欄に<能力弱体 id, 計算式>と記入すると、スキルに設定されたid(0~7)の弱体が
発動するときにその計算式を適用します。
例1:<能力強化 2, a.mat / 2>とメモ欄に記述し、「能力強化 攻撃力」を
指定すると、対象の攻撃力が(使用者の魔法力/2)だけ上昇します。
例2:<能力弱体 3, b.def / 3>とメモ欄に記述し、「能力弱体 防御力」を
指定すると、対象の防御力が(対象の弱体による変動がある状態の防御力/3)だけ
低下します。
例3:<能力弱体 3, b.def_nbd / 3>とメモ欄に記述し、「能力弱体 防御力」を
指定すると、対象の防御力が(対象の弱体による変動がない状態の防御力/3)だけ
低下します。
2と3の違いですが、防御力27の敵に対してこれを3回かけると、
例2:27→18→12→8
例3:27→18→ 9→0
となります。他のパラメータも「_nbd」をつければそんな感じになります。
・設定項目で強化/弱体の最大数などを変更できます。

◆仕様
・メモ欄に記述のない強化/弱体は、"b.fai_ebd_param(id) / 4"として
計算されます。idはそれぞれのパラメータのIDです。
・強化/弱体の上書きは原則「先にかけたもの」から消去されます。

◆使用上の注意
・★……エイリアス ●……再定義 ○……新規定義

◆作者:faida @faida3983

=end

module FAI_EBD
  # 設定項目:バフ/デバフの容量
  BD_VOL = 1
  # 設定項目:バフ/デバフのアイコンのレベル
  # [1段階目のアイコンがつく数, 2段階目のアイコンがつく数]
  BD_LEVEL = [1, 3]
  # 設定項目:バフ/デバフの効果を上書きするか
  # true:容量がいっぱいなら上書きする false:容量がいっぱいでも上書きしない
  BD_OW_EFF = false
  # 設定項目:バフ/デバフの持続ターンを上書きするか
  # true:常に上書きする false:効果が上書きされたときのみ上書き
  # nil:常に上書きしない
  BD_OW_TURN = nil
end

class RPG::UsableItem < RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ パラメータ
  #--------------------------------------------------------------------------
  def note_buff_effects
    @buff_effects = []; @debuff_effects = []
    note.each_line{|line|
      if line =~ /<能力強化\s*(\d+)\s?\,\s?(.+)>/
        id = $1.to_i; eff = $2
        @buff_effects[id] ||= []; @buff_effects[id] << $2
      elsif line =~ /<能力弱体\s*(\d+)\s?\,\s?(.+)>/
        id = $1.to_i; eff = $2
        @debuff_effects[id] ||= []; @debuff_effects[id] << $2
      end
    }
  end
  def buff_effects
    note_buff_effects if !@buff_effects; @buff_effects
  end
  def debuff_effects
    note_buff_effects if !@debuff_effects; @debuff_effects
  end
end

#==============================================================================
# ■ Game_BattlerBase
#==============================================================================

class Game_BattlerBase
  include FAI_EBD
  #--------------------------------------------------------------------------
  # ★ 能力強化情報をクリア
  #--------------------------------------------------------------------------
  alias fai_ebd_clear_buffs clear_buffs
  def clear_buffs
    fai_ebd_clear_buffs
    @buff_effects = Array.new(8) { [].clone }
  end
  #--------------------------------------------------------------------------
  # ● 現在の強化/弱体をアイコン番号の配列で取得
  #--------------------------------------------------------------------------
  def buff_icons
    icons = []
    (0..7).each{|i| icons.push(buff_icon_index(buff_level(i), i)) }
    icons.delete(0)
    icons
  end
  #--------------------------------------------------------------------------
  # ○ 現在の強化/弱体のレベル
  #--------------------------------------------------------------------------
  def buff_level(id)
    n = BD_LEVEL.select{|level|level <= @buff_effects[id].size}.size
    n == 0 ? 0 : n * @buff_effects[id][0] / @buff_effects[id][0].abs
  end
end

#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ○ 能力強化(特殊)
  #--------------------------------------------------------------------------
  def add_buff_ex(param_id, value, turns)
    return unless alive?
    if debuff?(param_id)
      erase_buff(param_id)
    else
      if buff_max?(param_id)
        if BD_OW_EFF
          @buff_effects[param_id].shift
          @buff_effects[param_id].push(value)
          overwrite_buff_turns(param_id, turns) if !BD_OW_TURN.nil?
        else
          overwrite_buff_turns(param_id, turns) if BD_OW_TURN
        end
      else
        @buff_effects[param_id] << value
        if !BD_OW_TURN.nil? || @buff_effects[param_id].size == 1
          overwrite_buff_turns(param_id, turns)
        end
      end
    end
    @result.added_buffs.push(param_id).uniq!
    refresh
  end
  #--------------------------------------------------------------------------
  # ○ 能力弱体(特殊)
  #--------------------------------------------------------------------------
  def add_debuff_ex(param_id, value, turns)
    return unless alive?
    if buff?(param_id)
      erase_buff(param_id)
    else
      if debuff_max?(param_id)
        if BD_OW_EFF
          @buff_effects[param_id].shift
          @buff_effects[param_id].push(value)
          overwrite_buff_turns(param_id, turns) if !BD_OW_TURN.nil?
        else
          overwrite_buff_turns(param_id, turns) if BD_OW_TURN
        end
      else
        @buff_effects[param_id] << value
        if !BD_OW_TURN.nil? || @buff_effects[param_id].size == 1
          overwrite_buff_turns(param_id, turns)
        end
      end
    end
    overwrite_buff_turns(param_id, turns)
    @result.added_debuffs.push(param_id).uniq!
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 能力強化/弱体の解除
  #--------------------------------------------------------------------------
  def remove_buff(param_id)
    return unless alive?
    return if @buffs[param_id] == 0 && @buff_effects[param_id].empty? # ☆
    erase_buff(param_id)
    @buff_turns.delete(param_id)
    @result.removed_buffs.push(param_id).uniq!
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 能力強化/弱体の消去
  #--------------------------------------------------------------------------
  alias fai_ebd_erase_buff erase_buff
  def erase_buff(param_id)
    fai_ebd_erase_buff(param_id)
    @buff_effects[param_id].clear
  end
  #--------------------------------------------------------------------------
  # ● 能力強化状態の判定
  #--------------------------------------------------------------------------
  def buff?(param_id)
    !@buff_effects[param_id].empty? && @buff_effects[param_id].any?{|n|n > 0}
  end
  #--------------------------------------------------------------------------
  # ● 能力弱体状態の判定
  #--------------------------------------------------------------------------
  def debuff?(param_id)
    !@buff_effects[param_id].empty? && @buff_effects[param_id].any?{|n|n < 0}
  end
  #--------------------------------------------------------------------------
  # ● 能力強化が最大の段階か否かを判定
  #--------------------------------------------------------------------------
  def buff_max?(param_id)
    buff?(param_id) && @buff_effects[param_id].size == BD_VOL
  end
  #--------------------------------------------------------------------------
  # ● 能力弱体が最大の段階か否かを判定
  #--------------------------------------------------------------------------
  def debuff_max?(param_id)
    debuff?(param_id) && @buff_effects[param_id].size == BD_VOL
  end
  #--------------------------------------------------------------------------
  # ● 使用効果[能力強化]
  #--------------------------------------------------------------------------
  def item_effect_add_buff(user, item, effect)
    if !(item.buff_effects[effect.data_id] || []).empty?
      value = item.buff_effects[effect.data_id].inject(0){|r, eff|
        r + eval_buff_effect(eff, user, self, $game_variables)
      }
    else
      eff = "b.fai_ebd_param(#{effect.data_id}) / 4"
      value = eval_buff_effect(eff, user, self, $game_variables)
    end
    add_buff_ex(effect.data_id, value, effect.value1)
    @result.success = true
  end
  #--------------------------------------------------------------------------
  # ● 使用効果[能力弱体]
  #--------------------------------------------------------------------------
  def item_effect_add_debuff(user, item, effect)
    chance = debuff_rate(effect.data_id) * luk_effect_rate(user)
    if rand < chance
      if !(item.debuff_effects[effect.data_id] || []).empty?
        value = item.debuff_effects[effect.data_id].inject(0){|r, eff|
          r + eval_debuff_effect(eff, user, self, $game_variables)
        }
      else
        eff = "b.fai_ebd_param(#{effect.data_id}) / 4"
        value = eval_debuff_effect(eff, user, self, $game_variables)
      end
      add_debuff_ex(effect.data_id, value, effect.value1)
      @result.success = true
    end
  end
  #--------------------------------------------------------------------------
  # ○ 能力強化の計算
  #--------------------------------------------------------------------------
  def eval_buff_effect(effect, a, b, v)
    eval(effect)
  end
  #--------------------------------------------------------------------------
  # ○ 能力弱体の計算
  #--------------------------------------------------------------------------
  def eval_debuff_effect(effect, a, b, v)
    -eval(effect)
  end
end

#==============================================================================
# ■ Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ★ 通常能力値の加算値取得
  #--------------------------------------------------------------------------
  alias fai_ebd_param_plus param_plus
  def param_plus(param_id)
    @buff_effects[param_id].inject(fai_ebd_param_plus(param_id)){|r, n|r + n}
  end
  #--------------------------------------------------------------------------
  # ○ 追加パラメータ:計算式に使用できるもの
  #--------------------------------------------------------------------------
  def fai_ebd_param(param_id)
    n = (param_base(param_id)+fai_ebd_param_plus(param_id))*param_rate(param_id)
    [[n, param_max(param_id)].min, param_min(param_id)].max.to_i
  end
  def mhp_nbd;  fai_ebd_param(0);   end    # 最大HP      Maximum Hit Point
  def mmp_nbd;  fai_ebd_param(1);   end    # 最大MP      Maximum Magic Point
  def atk_nbd;  fai_ebd_param(2);   end    # 攻撃力      ATtacK power
  def def_nbd;  fai_ebd_param(3);   end    # 防御力      DEFense power
  def mat_nbd;  fai_ebd_param(4);   end    # 魔法力      Magic ATtack power
  def mdf_nbd;  fai_ebd_param(5);   end    # 魔法防御    Magic DeFense power
  def agi_nbd;  fai_ebd_param(6);   end    # 敏捷性      AGIlity
  def luk_nbd;  fai_ebd_param(7);   end    # 運          LUcK
end

#==============================================================================
# ■ Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ★ 通常能力値の加算値取得
  #--------------------------------------------------------------------------
  alias fai_ebd_param_plus param_plus
  def param_plus(param_id)
    @buff_effects[param_id].inject(fai_ebd_param_plus(param_id)){|r, n|r + n}
  end
  #--------------------------------------------------------------------------
  # ○ 追加パラメータ:計算式に使用できるもの
  #--------------------------------------------------------------------------
  def fai_ebd_param(param_id)
    n = (param_base(param_id)+fai_ebd_param_plus(param_id))*param_rate(param_id)
    [[n, param_max(param_id)].min, param_min(param_id)].max.to_i
  end
  def mhp_nbd;  fai_ebd_param(0);   end    # 最大HP      Maximum Hit Point
  def mmp_nbd;  fai_ebd_param(1);   end    # 最大MP      Maximum Magic Point
  def atk_nbd;  fai_ebd_param(2);   end    # 攻撃力      ATtacK power
  def def_nbd;  fai_ebd_param(3);   end    # 防御力      DEFense power
  def mat_nbd;  fai_ebd_param(4);   end    # 魔法力      Magic ATtack power
  def mdf_nbd;  fai_ebd_param(5);   end    # 魔法防御    Magic DeFense power
  def agi_nbd;  fai_ebd_param(6);   end    # 敏捷性      AGIlity
  def luk_nbd;  fai_ebd_param(7);   end    # 運          LUcK
end
要望・不具合等ございましたらお手数ですが報告お願いします。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
民々ゼミ
記事: 5
登録日時: 2016年1月20日(水) 20:01

Re: [解決済み]能力低下スキルの魔法力依存

投稿記事by 民々ゼミ » 2017年1月21日(土) 08:15

ありがとうございます :D !!
試してみても、特に問題ありませんでした。
本当にありがとうございます! 長らく抱えていた問題だっただけに今日、解決できて本当に感動しています :D

“VX / Ace:質問” へ戻る