| 赞 | 0 |
| VIP | |
| 好人卡 | |
| 积分 | 4 |
| 经验 | |
| 最后登录 | 2018-7-17 |
| 在线时间 | 127 小时 |
- 梦石
- 0
- 星屑
- 354
- 在线时间
- 127 小时
- 注册时间
- 2016-10-8
- 回帖
- 54
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 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 |
|