1つのステート耐性を別のステートにも対応させたい。

ズッキー
記事: 40
登録日時: 2021年11月10日(水) 13:26

1つのステート耐性を別のステートにも対応させたい。

投稿記事by ズッキー » 2022年6月13日(月) 10:21

ステートAの耐性があれば、ステートBにも同様の耐性がつくステートの制作をお願いします。
例えば『睡眠』と『悪夢』は同じ眠り系のステートですが、睡眠防止のアクセサリーで耐性をつける時、この二種類のステートの有効度を設定しなければなりません。
この手間を省くためにも、<共有耐性ステートn>とメモ欄に記入する事で耐性を共有できるスクリプトを作っていただけますでしょうか?(nはステートID)
よろしくお願いします。

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

Re: 1つのステート耐性を別のステートにも対応させたい。

投稿記事by 名無し蛙 » 2022年6月13日(月) 22:51

コード: 全て選択

class RPG::State
  #--------------------------------------------------------------------------
  # ● カテゴリーステートIDの取得
  #--------------------------------------------------------------------------
  def category_state_id
    note =~ /<共有耐性ステート(\d+)>/ ? $1.to_i : nil
  end
end

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ○ ステート有効度の取得
  #--------------------------------------------------------------------------
  alias :_old_state_rate :state_rate
  def state_rate(state_id)
    $data_states[state_id].category_state_id ?
      _old_state_rate(state_id) * _old_state_rate($data_states[state_id].category_state_id) :
      _old_state_rate(state_id)
  end
end

作り込むと色々ややこしい事になりそうですけどシンプルに仕上げるならこんなところですか
実用上差し障りがない範囲だと思います
「悪夢」(子)ステートのメモ欄に<共有耐性ステート6>と書いて睡眠(親)有効度を適用させる感じですかね

注意点としては「ステート無効化」や「ステート治療」に関しては未だ弄っていません。
子ステート有効度と親ステート有効度両方設定されている場合は両方適用します。
ズッキー
記事: 40
登録日時: 2021年11月10日(水) 13:26

Re: 1つのステート耐性を別のステートにも対応させたい。

投稿記事by ズッキー » 2022年6月14日(火) 18:28

名無し蛙様。
リクエストに応えてくださりありがとうございます。
早速導入実験をしたところ、効果を実感できました。これで大分楽ができそうです。ありがとうございます。
耐性を両方弄っていると両方適応される点も、かなり使いやすそうです。ただ、やはりステート無効へ対応していないのは少々不便に感じます。
お手数ですが、ステート無効へも対応していただけますでしょうか?
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: 1つのステート耐性を別のステートにも対応させたい。

投稿記事by 名無し蛙 » 2022年6月14日(火) 20:36

コード: 全て選択

class RPG::State
  #--------------------------------------------------------------------------
  # ● カテゴリーステートIDの取得
  #--------------------------------------------------------------------------
  def category_state_id
    note =~ /<共有耐性ステート(\d+)>/ ? $1.to_i : nil
  end
end

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ○ ステート有効度の取得
  #--------------------------------------------------------------------------
  alias :_old_state_rate :state_rate
  def state_rate(state_id)
    $data_states[state_id].category_state_id ?
      _old_state_rate(state_id) * _old_state_rate($data_states[state_id].category_state_id) :
      _old_state_rate(state_id)
  end
  #--------------------------------------------------------------------------
  # ○ 無効化されているステートの判定
  #--------------------------------------------------------------------------
  alias :_old_state_resist? :state_resist?
  def state_resist?(state_id)
    $data_states[state_id].category_state_id ?
      _old_state_resist?(state_id) || _old_state_resist?($data_states[state_id].category_state_id) :
      _old_state_resist?(state_id)
  end 
end

ほぼコピペになりますけどとりあえずこれで。
特徴「ステート無効化」が影響する処理は二ヶ所あります。
一つはステート付与時。「ステート有効度」とはまた異なる箇所で判定が行われます。
もう一つはバトラーのリフレッシュ時。
例えば毒に掛かったアクターに毒無効化アクセサリーを装備するとその時点で毒も解消します。
これがステート有効度0%との主な違いでもあります。

それで今回の追加だと前者には対応しましたけど後者には対応していません。
愚直に再現する分にはそれほど難しくないんですけど
流石に正規表現や繰り返しの重複が気になるので、
本格的に改修する場合は実装を全面的に見直さないといけない、と思います。
ぞの上でこの差異の部分が重要であるのならば対応しますけどちょっと時間は掛かるでしょうね。
ズッキー
記事: 40
登録日時: 2021年11月10日(水) 13:26

Re: 1つのステート耐性を別のステートにも対応させたい。

投稿記事by ズッキー » 2022年6月15日(水) 00:16

素早い対応ありがとうございます!
細かい仕様についての説明もありがたいです。
アクセサリー装備時の解除の仕様については、逆にどこかで利用できるかもしれませんね。
追加の要望にも応えてくださり、本当にありがとうございました。

“VX / Ace:スクリプト素材のリクエスト” へ戻る