查看: 2358|回复: 7

[已经解决] 请问如何读取特性的备注栏中的公式得到数字?

[复制链接]
梦石
0
星屑
2920
在线时间
713 小时
注册时间
2010-7-25
回帖
659

开拓者

发表于 2017-12-2 13:41:48 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 jianyulei 于 2017-12-2 14:08 编辑

例如我在某特性栏里备注 <伤害 $game_actors[1].atk*0.2> 然后在回合结束阶段调取这个计算公式让其作为回合损伤,请问我在脚本里该如何调取这个公式最终得到准确的数字?
我只会用调取准确的数字,如<伤害 50>,但看别人的脚本里似乎能使用公式,自己又研究不出来,特来请教。
别人的脚本A
[pre lang="ruby"]# ■ RGSS3 反撃無効率設定 Ver1.01 by 星潟
# 反撃を無効化する確率と反撃を無効にできる属性を設定します。
# なお、反撃無効率は全て加算されます。
# ★特徴の反撃無視率設定例
#(特徴を有する項目のメモ欄に設定します。
#  PS_AVがtrueの場合、スキルのメモ欄に書き込むことで
#  行動後反撃率を有するパッシブスキルとして有効となります)
#  複数の項目に設定されている場合、全て加算されます。
#------------------------------------------------------------------------------
# <反撃無効パッシブ:50>
#
# この場合、全ての行動に反撃無効率50%を付与。
#------------------------------------------------------------------------------
# <反撃無効パッシブ:a.tp>
#
# この場合、TP分の値の反撃無効率を付与。
#------------------------------------------------------------------------------
# <反撃無効パッシブ:a.hp_rate*100>
#
# この場合、HP割合分の反撃無効率を付与。
#------------------------------------------------------------------------------
# <反撃無効パッシブ:a.agi-b.agi>
#
# この場合、相手と自分の敏捷性の差分分の反撃無効率を付与。
#==============================================================================
# ★アイテム/スキルの反撃無視率設定例
# アイテム・スキルのメモ欄に以下のように記入
# <反撃無効率:100>
# この場合、このアイテム・スキルに反撃無効率100%を付与。
#------------------------------------------------------------------------------
# <反撃無効率:a.tp>
#
# この場合、このアイテム・スキルにTP分の値の反撃無効率を付与。
#------------------------------------------------------------------------------
# <反撃無効率:a.hp_rate*100>
#
# この場合、このアイテム・スキルにHP割合分の反撃無効率を付与。
#------------------------------------------------------------------------------
# <反撃無効率:a.agi-b.agi>
#
# この場合、このアイテム・スキルに相手と自分の敏捷性の差分分の反撃無効率を付与。
#==============================================================================
# Ver1.01 キャッシュ化による軽量化を施しました。
#         また、無効率判定に計算式を使えるようになりました。
#==============================================================================

module CNT_BREAK
  
  #反撃無視属性(設定しない場合は ELEMENT  = nil とする)
  
  ELEMENT  = [nil]
  
  #反撃無視確率を付与するパッシブスキルを作成するか(true→作成する/false→作成しない)
  
  PS_AV    = false
  
  #特徴もしくはパッシブスキルのメモ欄に反撃無効率を記入する為のキーワード
  #(パッシブスキルはアクターのみ有効)
  
  WORD1    = "反撃無効パッシブ"
  
  #攻撃スキルのメモ欄に反撃無効率を記入する為のキーワード
  
  WORD2    = "反撃無効率"
  
end
class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● パッシブスキル特徴判定
  #--------------------------------------------------------------------------
  def cntb_feature_objects
    feature_objects
  end
  #--------------------------------------------------------------------------
  # ● 反撃無視率計算
  #--------------------------------------------------------------------------
  def cntb_rate(target, item)
    a = self
    b = target
    cntb_feature_objects.inject(0) {|r, f| r += eval(f.cntb_rate1)}
  end
end
class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● スキル/アイテムの反撃率計算
  #--------------------------------------------------------------------------
  alias item_cnt_cntb item_cnt
  def item_cnt(user, item)
    if item.damage.element_id < 0
      user.atk_elements.each {|i| return 0 if CNT_BREAK::ELEMENT.include?(i)} if CNT_BREAK::ELEMENT != nil && !CNT_BREAK::ELEMENT.empty?
    else
      return 0 if CNT_BREAK::ELEMENT != nil && !CNT_BREAK::ELEMENT.empty? && CNT_BREAK::ELEMENT.include?(item.damage.element_id)
    end
    a = user
    b = self
    return 0 if rand(100) < eval(item.cntb_rate2) + user.cntb_rate(self, item)
    item_cnt_cntb(user, item)
  end
end
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● パッシブスキル特徴判定
  #--------------------------------------------------------------------------
  def cntb_feature_objects
    CNT_BREAK::PS_AV ? super + skills : super
  end
end
class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● 反撃無視率計算
  #--------------------------------------------------------------------------
  def cntb_rate1
    return @cntb_rate1 if @cntb_rate1 != nil
    memo = self.note.scan(/<#{CNT_BREAK::WORD1}[::](\S+)>/).flatten
    @cntb_rate1 = memo != nil && !memo.empty? ? memo[0] : "0"
    @cntb_rate1
  end
end
class RPG::UsableItem < RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● 反撃無視率計算
  #--------------------------------------------------------------------------
  def cntb_rate2
    return @cntb_rate2 if @cntb_rate2 != nil
    memo = self.note.scan(/<#{CNT_BREAK::WORD2}[::](\S+)>/).flatten
    @cntb_rate2 = memo != nil && !memo.empty? ? memo[0] : "0"
    @cntb_rate2
  end
end[/pre]


别人的脚本B[pre lang="ruby"]
#==============================================================================
# ■ RGSS3 スキル・アイテムへの追加属性 Ver1.00 by 星潟
#------------------------------------------------------------------------------
# 一定確率で指定したスキル・アイテム使用時のダメージ属性が
# 本来エディタ上で指定された物から更に追加されるようにします。
# 使い方によっては特定スキル・アイテムに
# 一定確率で他の属性を追加する特徴が作成できるようにもなります。
#
# 例.スキルのメモ欄に
# <追加属性:3>
# 100%の確率でそのスキル・アイテムに
# 属性ID3の属性が追加される。
#
# <追加属性:4,50>
# 50%の確率でそのスキル・アイテムに
# 属性ID4の属性が追加される。
#
# <追加属性:5,user.element_rate(17)*100-100>
# 使用者の属性ID17の属性有効度から100を引いた確率で
# そのスキル・アイテムに属性ID5の属性が追加される。
#------------------------------------------------------------------------------
# ももまるLabs様のXPスタイルバトルと併用される場合
# XPスタイルバトルより上に配置して下さい。
# そうする事で、弱点/耐性ダメージ表示が正常に稼働します。
#
# 数値指定の2番目は確率処理ですが、evalを用いているので
# 上のuser.element_rate(17)*100-100等のように、計算式を用いる事が可能です。
# 装備品等で追加属性を設定する際は、これをうまく利用して下さい。
#==============================================================================
module EX_ELEM
  
  #追加属性で弱点や耐性が発生した時の属性計算方法の指定
  #0……各属性で最も高い有効度を属性有効度として扱う。
  #1……全属性の有効度の乗算を属性有効度として扱う。
  #2……基本有効度を0とし、全属性の有効度から100を引いた値を
  #     基本有効度に加算した値を属性有効度として扱う。
  
  TYPE = 0
  
  
  #追加属性として同じ属性が多重付与された場合の処理
  #true……全て有効にする。
  #false……一回分のみ有効とする。
  #なお、TYPEが0の場合は、強制的にfalseになります。
  
  DUAL1 = false
  
  
  #スキル・アイテムと同じ属性が多重付与された場合の処理
  #true……有効にする。
  #false……無効とする。
  #なお、TYPEが0の場合は、強制的にfalseになります。
  
  DUAL2 = false
  
  
  #属性有効度下限
  #(負の値も指定可能。
  #  ただし、TYPEを2にしない限り、通常環境下では0以下にはならない。
  #  設定しない場合、nilを指定)
  
  BTM  = 0
  
  
  #属性有効度上限
  #(設定しない場合、nilを指定)
  
  TOP  = 10000
  
  
  #設定用キーワード(変更不要)
  
  WORD = "追加属性"
  
end
class Game_Battler < Game_BattlerBase
  alias item_element_rate_extra_element item_element_rate
  def item_element_rate(user, item)
    @exelem = []
    data = item_element_rate_extra_element(user, item)
    #追加属性がない時は処理を飛ばす
    if !item.extra_element.empty?
      #追加属性を確率で判定
      for i in 0...item.extra_element.size
        next unless eval(item.extra_element[1]) > rand(100)
        @exelem.push(item.extra_element[0].to_i)
      end
      #多重付与された追加属性を削除(設定による)
      @exelem.uniq! if !EX_ELEM::DUAL1 or EX_ELEM::TYPE == 0
      #追加属性内から、元々スキル・アイテム内にある属性を削除(設定による)
      if !EX_ELEM::DUAL2 or EX_ELEM::TYPE == 0
        if item.damage.element_id < 0 && !user.atk_elements.empty?
          user.atk_elements.each do |i|
            @exelem.delete(i) if @exelem.include?(i)
          end
        else
          @exelem.delete(item.damage.element_id) if @exelem.include?(item.damage.element_id)
        end
      end
      #追加属性がある場合、タイプ別に属性有効度計算処理
      if !@exelem.empty?
        for i in @exelem
          data2 = element_rate(i)
          if EX_ELEM::TYPE == 0
            data = data2 if data < data2
          elsif EX_ELEM::TYPE == 1
            data *= data2
          elsif EX_ELEM::TYPE == 2
            data += data2 - 1.0
          end
        end
      end
    end
    #属性有効度最大値チェック
    data = [data, EX_ELEM::TOP / 100.0].min if EX_ELEM::TOP != nil
    #属性有効度最低値チェック
    data = [data, EX_ELEM::BTM / 100.0].max if EX_ELEM::BTM != nil
    return data
  end
end
class RPG::UsableItem < RPG::BaseItem
  def extra_element
    #キャッシュがある場合は読み込み処理を飛ばす
    return @extra_element if @extra_element != nil
    data = []
    #メモ欄から読み込み
    self.note.each_line { |line|
    memo = line.scan(/<#{EX_ELEM::WORD}[::](\S+)>/)
    memo = memo.flatten
    if memo != nil and not memo.empty?
      memo = memo[0].split(/\s*,\s*/)
      #2番目の値がない場合は100%追加
      memo.push("100") if memo[1] == nil
      data.push(memo)
    end
    }
    @extra_element = data
    return @extra_element
  end
end
[/pre]



梦石
0
星屑
644
在线时间
830 小时
注册时间
2016-7-24
回帖
644

开拓者

发表于 2017-12-2 14:06:21 | 显示全部楼层
使用字符串內嵌表達式#{}
和eval方法

点评

请问能给个范例吗?这么说我完全不懂……  发表于 2017-12-2 14:12
2016/07/17 加入RPG製作,勿忘初衷!
回复

使用道具 举报

梦石
0
星屑
644
在线时间
830 小时
注册时间
2016-7-24
回帖
644

开拓者

发表于 2017-12-2 14:20:47 | 显示全部楼层
內嵌表達式可以得到字符串的計算結果

a="50-10"
p a
50-10
p #{a}
40

2016/07/17 加入RPG製作,勿忘初衷!
回复

使用道具 举报

梦石
0
星屑
644
在线时间
830 小时
注册时间
2016-7-24
回帖
644

开拓者

发表于 2017-12-2 14:25:49 | 显示全部楼层
https://rpg.blue/thread-398047-1-1.html
請看第一部第一章第二節第三項
有關字符串內嵌表達式的部分
以及第一部第一章第七節第七項
有關eval方法

评分

参与人数 1赞 +1 收起 理由
jianyulei + 1 做出来了,谢谢

查看全部评分

2016/07/17 加入RPG製作,勿忘初衷!
回复

使用道具 举报

梦石
0
星屑
34460
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2017-12-2 16:05:40 | 显示全部楼层
如果备注是 note
计算结果 = note.match(/<伤害 (\S*)>/) ? eval($1) : 0

点评

评分的对话栏不够长……  发表于 2017-12-2 16:33

评分

参与人数 2赞 +2 收起 理由
jianyulei + 1 你这个公式比我的更好用,不仅更短它还会自.
chd114 + 1 认可答案

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2017-12-2 16:32:24 | 显示全部楼层
用eval方法可以把字符串转换为可以运行的脚本
用begin-end把可以运行的脚本转换为注释文本
···比如说这样···

  1. %w(Item Skill).each do |type| eval %{
  2. class RPG::#{type}
  3.   def target_type
  4.     t=$data_#{type.downcase}s[self.id].is_a?(RPG::Item)? -1:1
  5.     return Target::SCOPE[self.id*t][:scopetype] if Target::SCOPE[self.id*t][:scopetype]
  6.     return "o" if Array(1..6).include?(scope)
  7.     #return "f" if Array(7..11).include?(scope)
  8.     return "f" if [7,8].include?(scope)#所有队友
  9.     return "f_d" if [9,10].include?(scope)#阵亡队友
  10.     return "f_a" if [12,13].include?(scope)#存活队友
  11.     return "u" if scope==11#使用者
  12.     return nil if scope==0
  13.     return "fo" if scope==14#任意单体
  14.     return "fo_a" if scope==15#友存活单体|敌单体
  15.     return "fo_d" if scope==16#友阵亡单体|敌单体
  16.     return "a" if scope==17#任意全体
  17.     return "a_a" if scope==18#友存活全体|敌全体
  18.     return "a_d" if scope==19#友阵亡全体|敌全体
  19.     return "aa" if scope==20#全体
  20.     return "aa_a" if scope==21#友存活全体&敌全体
  21.     return "aa_d" if scope==22#友阵亡全体&敌全体
  22.   end
  23.   def target_num
  24.     t=$data_#{type.downcase}s[self.id].is_a?(RPG::Item)? -1:1
  25.     return Target::SCOPE[self.id*t][:rdn]? Target::SCOPE[self.id*t][:rdn] : 1
  26.   end
  27. end
  28. }
复制代码


在物品/技能的公式计算也用了这样的方法

  1.     value = item.damage.eval(user, self, $game_variables)
复制代码
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部