查看: 1908|回复: 1

[已经过期] 武器熟練度腳本問題

[复制链接]
梦石
0
星屑
354
在线时间
127 小时
注册时间
2016-10-8
回帖
54
发表于 2017-7-31 21:50:27 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 elemmy72 于 2017-7-31 21:54 编辑

腳本[pre lang="ruby"]#==============================================================================
# ■熟練度システム for RGSS3 Ver1.00-β
# □作成者 kure
# □網址:http://blog.livedoor.jp/kurement ... hives/41626110.html
#
# 導入位置
# 併用化ベーススクリプトと同時に使用する場合は本体及びオプションスクリプトより下
#
=begin

概要
 武器とスキルに対して熟練度の概念を導入します。

Ver1.00-β
 ●統合ベーススクリプトの動作に対応しました。

Ver0.90-α
 ●スキル画面を開いた時に発生するエラーの修正

◎熟練度の仕様について
  スキルを使用するごとに、スキルの熟練度が1上昇します。(通常攻撃も同等です)
  攻撃属性が通常攻撃である場合は、武器と武器タイプの熟練度が1上昇
  それ以外の属性である場合は 属性の熟練度が1上昇 します。

★翻譯:每次使用技能時,技能熟練度+1(普通攻擊也算在內)
    若攻擊屬性是普通攻擊,武器、武器類型的熟練度+1
    若是其他屬性,該屬性的熟練度+1。

  スキル使用時はスキルの熟練度補正は全てのスキルに
  通常攻撃属性のスキルは 武器と武器タイプの熟練度補正
  それ以外の属性は 属性の熟練度補正 が適用されます。
  (看不大懂,感覺不是很重要?)

◎メモ欄の設定
 ●必要属性熟練度
  スキルのメモ欄に「<必要属性熟練度 3,100>」等と書いて設定します。
  例の場合、スキルを使用するためには属性ID2の熟練度が100必要となります。

★翻譯:技能備註欄輸入 <必要属性熟練度 3,100>
    即屬性ID 3的熟練度100時可“使用”該技能
    (若屬性ID 3為火,則使用火屬性的技能即可。)

 ●必要装備熟練度
  スキルのメモ欄に「<必要武器熟練度 400>」等と書いて設定します。
  例の場合、スキルを使用するためには現在使用の装備全てについて
  熟練度が400必要となります。

★翻譯:技能備註欄輸入 <必要武器熟練度 400>
    即所有裝備的熟練度總和計算達400時可習得該技能

 ●必要装備タイプ熟練度
  スキルのメモ欄に「<必要武器タイプ熟練度 5,60>」等と書いて設定します。
  例の場合、スキルを使用するためには武器タイプID5の熟練度が60必要となります。
  (この場合、ID5の装備を装備している必要はありません)

★翻譯:技能備註欄輸入 <必要武器タイプ熟練度 5,60>
    即裝備類形ID 5的熟練度60可習得該技能
    (無須裝備著武器類型ID 5的裝備,只要熟練度達成就行)

◎イベントコマンドの設定
  actor_add_mastery(actor_id, type, id, value)
  指定IDのアクターの熟練度を valueの値増加 させる
  typeの値によって上昇させる熟練度が異なる

★翻譯:actor_add_mastery(角色ID, 類型, 對象ID, 增加值)
    角色ID 的 類型 裡的 對象ID 增加所設定的 增加值。
    例:actor_add_mastery(1, 2,1, 10)
      即 1號角色的 1號武器熟練度(中間2為指定武器) 增加 10
  
類型:0 → 技能 熟練度
    1 → 屬性 熟練度
    2 → 武器 熟練度
    3 → 武器類形 熟練度

=end
#===============================================================================


$kure_base_script = {} if $kure_base_script == nil
$kure_integrate_script = {} if $kure_integrate_script == nil
$kure_base_script[:Mastery] = 100
$kure_integrate_script[:Mastery] = 100
p "熟練度システム"
module KURE
  module Mastery
    #技能熟練度設定---------------------------------------------------------
      #熟練度最大値
      SKILL_MAX_MASTERY = 50
      
      #技能威力影響
      #該技能熟練度 1時,傷害的%數將增加所設定的值
      SM_DAMAGE_EFFECT = 0.1
   
    #屬性熟練度設定-----------------------------------------------------------
      #熟練度最大値
      ELEMENT_MAX_MASTERY = 50
      
      #屬性的技能威力影響
      #該屬性熟練度 1時,傷害的%數將增加所設定的值
      EM_DAMAGE_EFFECT = 0.1
      
    #武器熟練度設定-----------------------------------------------------------
      #熟練度最大値
      WEAPON_MAX_MASTERY = 50
      
      #武器的技能威力影響
      #該武器熟練度 1時,傷害的%數將增加所設定的值
      WM_DAMAGE_EFFECT = 0.1
      
    #武器類形熟練度設定-----------------------------------------------------
      #熟練度最大値
      WEAPON_TYPE_MAX_MASTERY = 50
      
      #武器類形的技能威力影響
      #該武器類形熟練度 1時,傷害的%數將增加所設定的值
      TM_DAMAGE_EFFECT = 0.1
   
  end
end

#==============================================================================
# ■ RPG::Skill(再定義)
#==============================================================================
class RPG::Skill < RPG::UsableItem
  #--------------------------------------------------------------------------
  # ☆ 必要属性熟練度の定義(追加定義)
  #--------------------------------------------------------------------------  
  def need_skill_element_mastery
    need = [] ; cheak_note = @note
    while cheak_note do
      cheak_note.match(/<必要属性熟練度\s?(\d+)\s?,\s?(\d+)\s?>/)
      need.push([$1.to_i, $2.to_i]) if $1 && $2
      cheak_note = $'
    end
    return need
  end
  #--------------------------------------------------------------------------
  # ☆ 必要武器熟練度の定義(追加定義)
  #--------------------------------------------------------------------------  
  def need_skill_weapon_mastery
    return 0 unless @note
    @note.match(/<必要武器熟練度\s?(\d+)\s?>/)
    return 0 unless $1
    return $1.to_i
  end
  #--------------------------------------------------------------------------
  # ☆ 必要武器タイプ熟練度の定義(追加定義)
  #--------------------------------------------------------------------------  
  def need_skill_weapon_type_mastery
    need = [] ; cheak_note = @note
    while cheak_note do
      cheak_note.match(/<必要武器タイプ熟練度\s?(\d+)\s?,\s?(\d+)\s?>/)
      need.push([$1.to_i, $2.to_i]) if $1 && $2
      cheak_note = $'
    end
    return need
  end
end

#==============================================================================
# ■ RPG::BaseItem
#==============================================================================
class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● データベースのidを返す(装備品個別管理より引き継ぎ)
  #--------------------------------------------------------------------------
  def database_id
    return @id
  end
end

#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 熟練度の初期設定(追加定義)
  #--------------------------------------------------------------------------
  def init_mastery_list
    @mastery_skill_list ||= []
    @mastery_element_list ||= []
    @mastery_weapon_list ||= []
    @mastery_weapon_type_list ||= []
  end
  #--------------------------------------------------------------------------
  # ● 熟練度の加算処理(追加定義)
  #--------------------------------------------------------------------------
  def add_mastery(item)
    init_mastery_list
    return unless item.is_a?(RPG::Skill)
    id = item.id
    element = [item.damage.element_id]
    element = apply_elements(self, item) if $kure_base_script[:base_A]
    element = basic_element_list(self, item) if $kure_integrate_script[:integrate]
   
    skill_data = [id, element]
   
    weapon_id_list = weapons.compact.collect{|obj| obj.database_id}
    weapon_type_list = weapons.compact.collect{|obj| obj.wtype_id}
    weapon_data = [weapon_id_list, weapon_type_list]
   
    add_weapon_mastery(item, weapon_data)
    add_skill_mastery(item, skill_data)
  end
  #--------------------------------------------------------------------------
  # ● スキル熟練度の加算(追加定義)
  #--------------------------------------------------------------------------
  def add_skill_mastery(item, data)
    add_mastery_value(0, data[0], 1)
    if item.damage.element_id >= 0
      data[1].each{|id| add_mastery_value(1, id, 1)}
    end
  end
  #--------------------------------------------------------------------------
  # ● 武器の熟練度の加算(追加定義)
  #--------------------------------------------------------------------------
  def add_weapon_mastery(item, data)
    return if item.damage.element_id >= 0
    data[0].each{|id| add_mastery_value(2, id, 1)}
    data[1].each{|id| add_mastery_value(3, id, 1)}
  end
  #--------------------------------------------------------------------------
  # ● 熟練度の定数加算(追加定義)
  #--------------------------------------------------------------------------
  def add_mastery_value(type, id, value)
    init_mastery_list
    case type
    when 0
      skill_id = @mastery_skill_list.find{|obj| obj[0] == id}
      @mastery_skill_list.push([id, value]) unless skill_id
      if skill_id
        skill_id[1] = [skill_id[1] + value, max_mastery_value(0, id)].min
        skill_id[1] = [skill_id[1],0].max
      end
    when 1
      element_id = @mastery_element_list.find{|obj| obj[0] == id}
      @mastery_element_list.push([id, value]) unless element_id
      if element_id
        element_id[1] = [element_id[1] + value, max_mastery_value(1, id)].min
        element_id[1] = [element_id[1],0].max
      end
    when 2
      weapon_id = @mastery_weapon_list.find{|obj| obj[0] == id}
      @mastery_weapon_list.push([id, value]) unless weapon_id
      if weapon_id
        weapon_id[1] = [weapon_id[1] + value, max_mastery_value(2, id)].min
        weapon_id[1] = [weapon_id[1],0].max
      end
    when 3
      type_id = @mastery_weapon_type_list.find{|obj| obj[0] == id}
      @mastery_weapon_type_list.push([id, value]) unless type_id
      if type_id
        type_id[1] = [type_id[1] + value, max_mastery_value(3, id)].min
        type_id[1] = [type_id[1],0].max
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 熟練度の最大値の取得(追加定義)
  #--------------------------------------------------------------------------
  def max_mastery_value(type, id)
    init_mastery_list
    case type
    when 0
      return KURE::Mastery::SKILL_MAX_MASTERY
    when 1
      return KURE::Mastery::ELEMENT_MAX_MASTERY
    when 2
      return KURE::Mastery::WEAPON_MAX_MASTERY
    when 3
      return KURE::Mastery::WEAPON_TYPE_MAX_MASTERY
    end
  end
  #--------------------------------------------------------------------------
  # ● 熟練度の取得(追加定義)
  #--------------------------------------------------------------------------
  def mastery_value(type, id)
    init_mastery_list
    case type
    when 0
      #該当スキルIDの熟練度を返す
      result = @mastery_skill_list.find{|obj| obj[0] == id}
      value = result ? result[1] : 0
      return value
    when 1
      #該当属性IDの熟練度を返す
      result = @mastery_element_list.find{|obj| obj[0] == id}
      value = result ? result[1] : 0
      return value
    when 2
      #該当IDの武器熟練度を返す
      result = @mastery_weapon_list.find{|obj| obj[0] == id}
      value = result ? result[1] : 0
      return value
    when 3
      #該当武器タイプIDの熟練度を返す
      result = @mastery_weapon_type_list.find{|obj| obj[0] == id}
      value = result ? result[1] : 0
      return value
    end
  end
  #--------------------------------------------------------------------------
  # ● 熟練度を満たしているか?(追加定義)
  #--------------------------------------------------------------------------
  def enough_mastery?(skill)
    init_mastery_list
    weapon_id_list = weapons.compact.collect{|obj| obj.database_id}
    weapon_type_list = weapons.compact.collect{|obj| obj.wtype_id}
   
    #必要装備熟練度
    if skill.need_skill_weapon_mastery != 0
      weapon_id_list.each do |id|
        weapon_id = @mastery_weapon_list.find{|obj| obj[0] == id}
        return false unless weapon_id
        return false if weapon_id[1] < skill.need_skill_weapon_mastery
      end
    end
   
    #必要装備タイプ熟練度
    skill.need_skill_weapon_type_mastery.each do |data|
      type_id = @mastery_weapon_type_list.find{|obj| obj[0] == data[0]}
      return false unless type_id
      return false if type_id[1] < data[1]
    end
   
    #必要属性熟練度
    skill.need_skill_element_mastery.each do |data|
      element = @mastery_element_list.find{|obj| obj[0] == data[0]}
      return false unless element
      return false if element[1] < data[1]
    end
   
    return true
  end
end

#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 熟練度補正の取得(追加定義)
  #--------------------------------------------------------------------------
  def mastery_rate(user, item)
    return 1 unless user.actor?
    value = 1
    element = $kure_base_script[:base_A] ? apply_elements(self, item) : [item.damage.element_id]
    #スキルの熟練度の適用
    value += (user.mastery_value(0, item.id) * KURE::Mastery::SM_DAMAGE_EFFECT).to_f / 100
   
    #属性攻撃(属性熟練度を適用)
    if item.damage.element_id >= 0
      element.each do |id|
        value += (user.mastery_value(1, id) * KURE::Mastery::EM_DAMAGE_EFFECT).to_f / 100
      end
    end
   
    #通常攻撃(武器熟練度、タイプ熟練度を適用)
    if item.damage.element_id < 0
      weapon_id_list = user.weapons.compact.collect{|obj| obj.database_id}
      weapon_type_list = user.weapons.compact.collect{|obj| obj.wtype_id}
      
      weapon_id_list.each do |w_id|
        value += (user.mastery_value(2, w_id) * KURE::Mastery::WM_DAMAGE_EFFECT).to_f / 100
      end
      
      weapon_type_list.each do |t_id|
        value += (user.mastery_value(3, t_id) * KURE::Mastery::TM_DAMAGE_EFFECT).to_f / 100
      end
    end
      
    return value
  end
  #--------------------------------------------------------------------------
  # ☆ スキル使用コストの支払い可能判定(エイリアス再定義)
  #--------------------------------------------------------------------------
  alias k_mastery_before_skill_cost_payable? skill_cost_payable?
  def skill_cost_payable?(skill)
    return false if actor? && !enough_mastery?(skill)
    k_mastery_before_skill_cost_payable?(skill)
  end
  #--------------------------------------------------------------------------
  # ● スキル/アイテムの使用(エイリアス再定義)
  #--------------------------------------------------------------------------
  alias k_mastery_before_use_item use_item
  def use_item(item)
    add_mastery(item) if actor?
    k_mastery_before_use_item(item)
  end
  #--------------------------------------------------------------------------
  # ☆ スキル/アイテムの属性修正値を取得(エイリアス再定義)
  #--------------------------------------------------------------------------
  alias k_mastery_before_item_element_rate item_element_rate
  def item_element_rate(user, item)
    k_mastery_before_item_element_rate(user, item) * mastery_rate(user, item)
  end
end

#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ☆ 熟練度を増加(追加定義)
  #--------------------------------------------------------------------------
  def actor_add_mastery(actor_id, type, id, value)  
    $game_actors[actor_id].add_mastery_value(type, id, value)
  end
end

#==============================================================================
# ■ Window_Base
#==============================================================================
class Window_Base < Window
  #--------------------------------------------------------------------------
  # ● アイテム名の描画(エイリアス再定義)
  #--------------------------------------------------------------------------
  alias k_mastery_before_draw_item_name draw_item_name
  def draw_item_name(item, x, y, enabled = true, width = 172)
    draw_item_mastery_value(item, x, y, enabled, width)

   
    k_mastery_before_draw_item_name(item, x, y, enabled, width)
  end
  #--------------------------------------------------------------------------
  # ● 熟練度の描画(エイリアス再定義)
  #--------------------------------------------------------------------------
  def draw_item_mastery_value(item, x, y, enabled = true, width = 172)
    return if !item.is_a?(RPG::Weapon) && !item.is_a?(RPG::Skill)
    if SceneManager.scene_is?(Scene_Equip) or SceneManager.scene_is?(Scene_Skill)
      actor = $game_party.menu_actor
      return unless actor
      type = 0 if item.is_a?(RPG::Skill)
      type = 2 if item.is_a?(RPG::Weapon)
      rate = actor.mastery_value(type, item.database_id).to_f / actor.max_mastery_value(type, item.database_id)
      draw_gauge(x, y, width, rate, mp_gauge_color1, mp_gauge_color2)
    end
  end
end[/pre]


我想將屬性熟練度和武器類型熟練度存入變量裡,藉以查看當前熟練度,
不過我怎麼試都不行 QQ,找了一堆關鍵字來試試看,
例如 actor.mastery_value(2, 1.1) ... 或是 $game_actor.weapon_mastery(1,2, 1)
(使用武器測試只是為了方便查看有無存取進變量)
試了很多,有的會報錯,有的則無反應,就是試不到正確的

另外,想詢問有無熟練度最大值的自定義方法,
希望每把武器或每個技能的最大值皆不同!
我是有看到這個:
[pre lang="ruby"]  #--------------------------------------------------------------------------
  # ● 熟練度の初期設定(追加定義)
  #--------------------------------------------------------------------------
  def init_mastery_list
    @mastery_skill_list ||= []
    @mastery_element_list ||= []
    @mastery_weapon_list ||= []
    @mastery_weapon_type_list ||= [][/pre]

不曉得是不是?A_A,可是又不敢動它…怕會癱瘓

請教有無大大能幫個忙指導一下 QQ
(´_ゝ`)...仍未命名的遊戲製作進度:0%
梦石
0
星屑
354
在线时间
127 小时
注册时间
2016-10-8
回帖
54
 楼主| 发表于 2017-8-3 02:35:54 | 显示全部楼层
自己頂上來………

有沒有人能幫幫忙?
(´_ゝ`)...仍未命名的遊戲製作進度:0%
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部