【RGSS3】属性有効度を『全て乗算』から『ステート優先』へ

せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

【RGSS3】属性有効度を『全て乗算』から『ステート優先』へ

投稿記事by せくもん » 2022年2月20日(日) 12:47

いつもお世話になっております。

RPGツクールVXaceでの属性有効度はデフォルトだと
アクター、エネミー、職業、装備品、ステートの特徴欄に設定された値を
全て乗算して数値を算出していますが、ここからステートの値のみを独立化させ

・『火属性2倍』のステートを付加された時は元が50%でも100%でも300%でも
 そのアクター、エネミーの火属性有効度を200%として計算する。

・『火属性3倍』『火属性半減』等、同じ属性のステートを複数付加された時は
 ステートの値のみを乗算し300 * 50 = 150%として計算する。

・そのスキルの属性に関連するステートが何も付加されていない時は
 アクター、エネミー、職業、装備品の特徴欄の値を乗算して計算する。

といった仕様に変更したい場合は、どの様にスクリプトを組めば良いでしょうか?

名無し蛙
記事: 304
登録日時: 2015年11月23日(月) 02:46

Re: 【RGSS3】属性有効度を『全て乗算』から『ステート優先』へ

投稿記事by 名無し蛙 » 2022年2月22日(火) 00:36

根深いところで合体しているので分解、再構築するのはかなり面倒そうですね

ステート有効度の取得はGame_BattlerBase#state_rateで計算しています
そのメソッドの中で使用されるfeatures_pi(特徴値の相乗計算処理)
そのメソッドの中で使用されるfeatures_with_id(特徴オブジェクトの配列取得)
そのメソッドの中で参照されるall_features(全ての特徴オブジェクトの配列取得)
そのメソッドの中で参照されるfeature_objects(特徴を保持する全オブジェクトの配列取得)
このfeature_objects内でアクターであればstates+actor+class+equips
エネミーであればstates+enemyの合体が行われます

当然ここを弄ってしまうと全ての特徴に影響が出てしまうので
起点となるGame_BattlerBase#state_rateを編集して上記の担当処理を全て自前で書き直すしかないのでは

コード: 全て選択

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ○ 属性有効度の取得
  #--------------------------------------------------------------------------
  def element_rate(element_id)
    candidates = states.inject([]) {|r, obj|
      r + obj.features
    }.select{|ft|
      ft.code == FEATURE_ELEMENT_RATE && ft.data_id == element_id
    }
    return candidates[0].value unless candidates.empty?
    return (actor? ? ([actor] + [self.class] + equips.compact) : [enemy]).inject([]) {|r, obj|
      r + obj.features
    }.select{|ft|
      ft.code == FEATURE_ELEMENT_RATE && ft.data_id == element_id
    }.inject(1.0){|r, ft|
      r * ft.value
    }
  end 
end

動作チェックしてないけどこんな感じですかね?
もしも異なる効果値のステートが重複していたら単純に先頭のステートから効果値を取得しています。
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 【RGSS3】属性有効度を『全て乗算』から『ステート優先』へ

投稿記事by せくもん » 2022年3月06日(日) 12:58

名無し蛙様、ご返答ありがとうございます。

ご制作頂いたスクリプトを導入し動作チェックしてみましたところ
特にエラーのような物は出なかったのですが、デフォルトと動作に変化が見られませんでした。

『先頭のステートから効果値を取得している』との事なので
戦闘不能のすぐ下に『火属性2倍』のステートを配置しても通常通り
アクター、エネミーの属性有効度とステートの属性有効度を乗算してしまうみたいです。

別のアプローチとして、Game_Battlerの● ダメージ計算 に

コード: 全て選択

value *= item_element_rate(user, item) if !self.feature_objects.any? {|obj| obj.note.include?("<属性有効度無効>")}


と記述して、ステート上ではデフォルトの属性有効度を使わずに、別の変数で代用する方法も考えたのですが
これだと異なる効果値のステートの重複に対応出来る代わりに、無関係の属性まで全部無効化してしまう為
中々思い通りには行かないみたいです。

お手数をおかけして申し訳ありませんでした。

“VX / Ace:質問” へ戻る