【RGSS3】TPチャージ率の細分化

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

【RGSS3】TPチャージ率の細分化

投稿記事by せくもん » 2019年7月16日(火) 22:01

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

VXaceには特殊能力値として『TPチャージ率』というものがありますが
デフォルトだと一つのパラメーターで一括管理している為
TPチャージ率の上がる装備品を1個身に付けただけで、物理攻撃が命中しても
魔法攻撃が命中しても逆に自分が被弾した時も全て倍率がかかってしまうので
いささか万能すぎる様な気がします。

これを

1.命中タイプ物理・命中タイプ魔法・命中タイプ必中(回復魔法などHPの数字を変えるもの)
  ・命中タイプ必中(バフデバフなど数字を変えないもの)・被弾に分け
  それぞれ別の装備品を身に付けないとチャージ率が上がらない様にしたい。

2.デフォルトでは攻撃を回避した場合、回避した側もされた側もTPに影響が出ないので
  これらの行動時にもTPが上がる様にしたい。

3.上記2.に対しても回避した場合とされた場合とで別々の装備品でチャージ率が上がる様にしたい。


…という風に改良を加えたいのですが、どの様にしたら良いのでしょうか?

ぽんぽこねるそん
記事: 53
登録日時: 2018年10月26日(金) 12:24

Re: 【RGSS3】TPチャージ率の細分化

投稿記事by ぽんぽこねるそん » 2019年7月17日(水) 01:48

せくもんさん、こんばんは。

1はメモ欄からそれぞれのチャージ率を取得できるようにでもして
それぞれの場面でそれを集計したものを乗算すればいいかと思います。

2はスキル/アイテムの効果を適用する時に回避していたらTPを増やす処理を行えばいいかと思います。

3は2の時に1と同じようにすればいいかと思います。

コード: 全て選択

=begin
・細分化したTPチャージ率の設定方法
    特徴を持つオブジェクトのメモ欄に
    物理TPチャージ率           :<物理TPチャージ率:チャージ率>
    魔法TPチャージ率           :<魔法TPチャージ率:チャージ率>
    必中(HP変動)TPチャージ率   :<必中TPチャージ率:チャージ率>
    必中(HP不動)TPチャージ率   :<非HP必中TPチャージ率:チャージ率>
    被ダメージのTPチャージ率   :<被弾TPチャージ率:チャージ率>
    回避した時のTPチャージ率   :<回避TPチャージ率:チャージ率>
    回避された時のTPチャージ率 :<被回避TPチャージ率:チャージ率>
    を記述してください。

    ※チャージ率はパーセンテージで設定してください。
      20%増にしたいときは120と記述してください。
   
    ※チャージ率は乗算です
   
    ※元のTPチャージ率は無効化していないので
      最終的なチャージ率は「元のTPチャージ率 * それぞれのチャージ率」です。
   
・回避時の得TPの個別設定方法
    スキル/アイテムのメモ欄に
    回避した時     :<回避得TP:得TP>
    回避された時   :<被回避得TP:得TP>
    を記述してください。
=end
module TP_GAIN
  #回避した時のデフォルト得TP
  EVA_TP_GAIN = 1
  #回避された時のデフォルト得TP
  MISS_TP_GAIN = 1
end
class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● スキル/アイテムの効果適用
  #--------------------------------------------------------------------------
  alias org_item_apply item_apply
  def item_apply(user, item)
    org_item_apply(user, item)
    if @result.evaded
      charge_tp_by_evaded(item)
      user.charge_tp_by_missed(item)
    end
  end
  #--------------------------------------------------------------------------
  # ● スキル/アイテムの使用者側への効果(再定義)
  #--------------------------------------------------------------------------
  def item_user_effect(user, item)
    type = item.certain? && @result.hp_damage == 0 ? 3 : item.hit_type
    user.tp += item.tp_gain * user.tcr * user.hit_tcr(type)
  end
  #--------------------------------------------------------------------------
  # ● 被ダメージによる TP チャージ(再定義)
  #--------------------------------------------------------------------------
  def charge_tp_by_damage(damage_rate)
    self.tp += 50 * damage_rate * tcr * damage_tcr
  end
  #--------------------------------------------------------------------------
  # ● 回避による TP チャージ
  #--------------------------------------------------------------------------
  def charge_tp_by_evaded(item)
    self.tp += item.evaded_tp_gain * tcr * evaded_tcr
  end
  #--------------------------------------------------------------------------
  # ● 被回避による TP チャージ
  #--------------------------------------------------------------------------
  def charge_tp_by_missed(item)
    self.tp += item.missed_tp_gain * tcr * missed_tcr
  end
  #--------------------------------------------------------------------------
  # ● 被弾時のTPチャージ率
  #--------------------------------------------------------------------------
  def damage_tcr
    feature_objects.inject(1.0) {|r, i| r *= i.damage_tcr }
  end
  #--------------------------------------------------------------------------
  # ● 命中時のTPチャージ率
  #--------------------------------------------------------------------------
  def hit_tcr(type)
    feature_objects.inject(1.0) {|r, i| r *= i.hit_tcr[type] }
  end
  #--------------------------------------------------------------------------
  # ● 回避した時のTPチャージ率
  #--------------------------------------------------------------------------
  def evaded_tcr
    feature_objects.inject(1.0) {|r, i| r *= i.evaded_tcr }
  end
  #--------------------------------------------------------------------------
  # ● 回避された時のTPチャージ率
  #--------------------------------------------------------------------------
  def missed_tcr
    feature_objects.inject(1.0) {|r, i| r *= i.missed_tcr }
  end
end
class RPG::UsableItem < RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● 回避した時に得るTP
  #--------------------------------------------------------------------------
  def evaded_tp_gain
    return @evaded_tp_gain if @evaded_tp_gain
    @evaded_tp_gain = /<回避得TP:(\d+)>/ =~ note ? $1.to_i : TP_GAIN::EVA_TP_GAIN
    @evaded_tp_gain
  end
  #--------------------------------------------------------------------------
  # ● 回避された時に得るTP
  #--------------------------------------------------------------------------
  def missed_tp_gain
    return @missed_tp_gain if @missed_tp_gain
    @missed_tp_gain = /<被回避得TP:(\d+)>/ =~ note ? $1.to_i : TP_GAIN::MISS_TP_GAIN
    @missed_tp_gain
  end
end
class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● 被弾時のTPチャージ率
  #--------------------------------------------------------------------------
  def damage_tcr
    return @damage_tcr if @damage_tcr
    @damage_tcr = /<被弾TPチャージ率:(\d+)>/ =~ note ? $1.to_i / 100.0 : 1.0
    @damage_tcr
  end
  #--------------------------------------------------------------------------
  # ● 命中時のTPチャージ率
  #--------------------------------------------------------------------------
  def hit_tcr
    return @hit_tcr if @hit_tcr
    @hit_tcr = []
    [/<必中TPチャージ率:(\d+)>/,/<物理TPチャージ率:(\d+)>/,/<魔法TPチャージ率:(\d+)>/,/<非HP必中TPチャージ率:(\d+)>/].each do |exp|
      @hit_tcr << (exp =~ note ? $1.to_i / 100.0 : 1.0)
    end
    @hit_tcr
  end
  #--------------------------------------------------------------------------
  # ● 回避した時のTPチャージ率
  #--------------------------------------------------------------------------
  def evaded_tcr
    return @evaded_tcr if @evaded_tcr
    @evaded_tcr = /<回避TPチャージ率:(\d+)>/ =~ note ? $1.to_i / 100.0 : 1.0
    @evaded_tcr
  end
  #--------------------------------------------------------------------------
  # ● 回避された時のTPチャージ率
  #--------------------------------------------------------------------------
  def missed_tcr
    return @missed_tcr if @missed_tcr
    @missed_tcr = /<被回避TPチャージ率:(\d+)>/ =~ note ? $1.to_i / 100.0 : 1.0
    @missed_tcr
  end
end

※回避時に得るTPの量をどう設定したいのか分からなかったのでスキル/アイテムで設定するようにしています。
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 【RGSS3】TPチャージ率の細分化

投稿記事by せくもん » 2019年7月18日(木) 23:13

ぽんぽこねるそん様、ご返答ありがとうございます。

はじめは命中率の計算式の様に if item.physical? や if item.magical? を用いれば
判別できるかな?とも思いましたが、確かにメモ欄を活用した方が
複数のチャージ率を併せ持つ装備等が簡単に作れるので
この方法のほうが汎用性は高そうですね。
こちらで作っていただいたスクリプトを試してみたところ物理攻撃や魔法攻撃
被弾などでそれぞれチャージ率を個別に設定できる事が確認できました。


ただ回避に関してはした時もされた時もTPの数字の増加は確認できませんでした。
EVA_TP_GAIN = 100 にしたり
<被回避得TP:100>にしたり

def charge_tp_by_missed(item)
self.tp += 100
end

などの様に書き換えても回避時や被回避時にTPの数値が変わらないのですが
恐縮ですが、チャージ率を乗算する前のデフォルトの得TP値はどの様に設定すれば良いのでしょうか?
ぽんぽこねるそん
記事: 53
登録日時: 2018年10月26日(金) 12:24

Re: 【RGSS3】TPチャージ率の細分化

投稿記事by ぽんぽこねるそん » 2019年7月19日(金) 00:12

スクリプトが競合している可能性が高いので
お手数ですがスクリプトエディタでitem_applyで全件検索して
このスクリプトより下のセクションでHitするものがあると思うので
それよりも下に配置してみてください。
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 【RGSS3】TPチャージ率の細分化

投稿記事by せくもん » 2019年7月19日(金) 23:11

すいません、原因が判明しました。

https://tm.lucky-duet.com/viewtopic.php?f=43&t=7913


以前、上記トピックでお話したとおり命中率と回避率の計算式を一本化しており
Game_Battlerのスキル/アイテムの回避率計算を

コード: 全て選択

  def item_eva(user, item)
    return 0
  end

と改変してある為、回避率の高いアクターやエネミーが回避している様に見えるのは実際には
命中率計算の結果であり、そもそもゲーム内で計算上の回避成功・被回避の状態が
発生していないのが原因でした。

お騒がせして申し訳ありませんでした。
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 【RGSS3】TPチャージ率の細分化

投稿記事by せくもん » 2019年7月20日(土) 21:42

経過報告です。
ぽんぽこねるそんさんのスクリプト内の『スキル/アイテムの効果適用』の部分を

コード: 全て選択

  #--------------------------------------------------------------------------
  # ● スキル/アイテムの効果適用
  #--------------------------------------------------------------------------
  alias org_item_apply item_apply
  def item_apply(user, item)
    org_item_apply(user, item)
    if @result.missed #←改変箇所
      charge_tp_by_evaded(item)
      user.charge_tp_by_missed(item)
    end
  end


と書き換える事で、『成功率-回避率』の計算結果による『攻撃失敗』を
擬似的に『回避成功』と置き換えて処理すれば
スクリプトはそのまま使えるみたいです。

“VX / Ace:質問” へ戻る