设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1112|回复: 3
打印 上一主题 下一主题

[已经解决] 關於回血變成扣寫狀態的另一個問題

[复制链接]

Lv2.观梦者

梦石
0
星屑
362
在线时间
296 小时
注册时间
2013-6-1
帖子
121
跳转到指定楼层
1
发表于 2013-9-2 15:34:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
前幾天我問的回血變成扣寫狀態
雖然說放在Main上面會有效果 可是放在我自己找到的"技能熟練度"的下面就沒效果了

首先我先放原本的回寫變成扣寫的腳本:
RUBY 代码复制
  1. #==============================================================================
  2. # 回血变扣血的状态 ID
  3. DEDUCT_HP_STATE = 49
  4. #==============================================================================
  5. class Game_Battler
  6.   #--------------------------------------------------------------------------
  7.   def skill_effect(user, skill)
  8.     # 清除会心一击标志
  9.     self.critical = false
  10.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  11.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  12.     if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  13.        ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  14.       # 过程结束
  15.       return false
  16.     end
  17.     # 清除有效标志
  18.     effective = false
  19.     # 公共事件 ID 是有效的情况下,设置为有效标志
  20.     effective |= skill.common_event_id > 0
  21.     # 第一命中判定
  22.     hit = skill.hit
  23.     if skill.atk_f > 0
  24.       hit *= user.hit / 100
  25.     end
  26.     hit_result = (rand(100) < hit)
  27.     # 不确定的特技的情况下设置为有效标志
  28.     effective |= hit < 100
  29.     # 命中的情况下
  30.     if hit_result == true
  31.       # 计算威力
  32.       power = skill.power + user.atk * skill.atk_f / 100
  33.       if power > 0
  34.         power -= self.pdef * skill.pdef_f / 200
  35.         power -= self.mdef * skill.mdef_f / 200
  36.         power = [power, 0].max
  37.       end
  38.       # 计算倍率
  39.       rate = 20
  40.       rate += (user.str * skill.str_f / 100)
  41.       rate += (user.dex * skill.dex_f / 100)
  42.       rate += (user.agi * skill.agi_f / 100)
  43.       rate += (user.int * skill.int_f / 100)
  44.       # 计算基本伤害
  45.       self.damage = power * rate / 20
  46.       # 属性修正
  47.       self.damage *= elements_correct(skill.element_set)
  48.       self.damage /= 100
  49.       # 伤害符号正确的情况下
  50.       if self.damage > 0
  51.         # 防御修正
  52.         if self.guarding?
  53.           self.damage /= 2
  54.         end
  55.       end
  56.       # 分散
  57.       if skill.variance > 0 and self.damage.abs > 0
  58.         amp = [self.damage.abs * skill.variance / 100, 1].max
  59.         self.damage += rand(amp+1) + rand(amp+1) - amp
  60.       end
  61.       # 第二命中判定
  62.       eva = 8 * self.agi / user.dex + self.eva
  63.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  64.       hit = self.cant_evade? ? 100 : hit
  65.       hit_result = (rand(100) < hit)
  66.       # 不确定的特技的情况下设置为有效标志
  67.       effective |= hit < 100
  68.     end
  69.     # 命中的情况下
  70.     if hit_result == true
  71.       # 威力 0 以外的物理攻击的情况下
  72.       if skill.power != 0 and skill.atk_f > 0
  73.         # 状态冲击解除
  74.         remove_states_shock
  75.         # 设置有效标志
  76.         effective = true
  77.       end
  78.       # HP 的伤害减法运算
  79.       last_hp = self.hp
  80.       #########################################################################
  81.       if self.state?(DEDUCT_HP_STATE) and self.damage < 0
  82.         self.damage = -self.damage
  83.       end
  84.       #########################################################################
  85.       self.hp -= self.damage
  86.       effective |= self.hp != last_hp
  87.       # 状态变化
  88.       @state_changed = false
  89.       effective |= states_plus(skill.plus_state_set)
  90.       effective |= states_minus(skill.minus_state_set)
  91.       # 威力为 0 的场合
  92.       if skill.power == 0
  93.         # 伤害设置为空的字串
  94.         self.damage = ""
  95.         # 状态没有变化的情况下
  96.         unless @state_changed
  97.           # 伤害设置为 "Miss"
  98.           self.damage = "Miss"
  99.         end
  100.       end
  101.     # Miss 的情况下
  102.     else
  103.       # 伤害设置为 "Miss"
  104.       self.damage = "Miss"
  105.     end
  106.     # 不在战斗中的情况下
  107.     unless $game_temp.in_battle
  108.       # 伤害设置为 nil
  109.       self.damage = nil
  110.     end
  111.     # 过程结束
  112.     return effective
  113.   end
  114.   #--------------------------------------------------------------------------
  115.   def item_effect(item)
  116.     # 清除会心一击标志
  117.     self.critical = false
  118.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  119.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  120.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  121.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  122.       # 过程结束
  123.       return false
  124.     end
  125.     # 清除有效标志
  126.     effective = false
  127.     # 公共事件 ID 是有效的情况下,设置为有效标志
  128.     effective |= item.common_event_id > 0
  129.     # 命中判定
  130.     hit_result = (rand(100) < item.hit)
  131.     # 不确定的特技的情况下设置为有效标志
  132.     effective |= item.hit < 100
  133.     # 命中的情况
  134.     if hit_result == true
  135.       # 计算回复量
  136.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  137.       recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
  138.       if recover_hp < 0
  139.         recover_hp += self.pdef * item.pdef_f / 20
  140.         recover_hp += self.mdef * item.mdef_f / 20
  141.         recover_hp = [recover_hp, 0].min
  142.       end
  143.       # 属性修正
  144.       recover_hp *= elements_correct(item.element_set)
  145.       recover_hp /= 100
  146.       recover_sp *= elements_correct(item.element_set)
  147.       recover_sp /= 100
  148.       # 分散
  149.       if item.variance > 0 and recover_hp.abs > 0
  150.         amp = [recover_hp.abs * item.variance / 100, 1].max
  151.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  152.       end
  153.       if item.variance > 0 and recover_sp.abs > 0
  154.         amp = [recover_sp.abs * item.variance / 100, 1].max
  155.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  156.       end
  157.       # 回复量符号为负的情况下
  158.       if recover_hp < 0
  159.         # 防御修正
  160.         if self.guarding?
  161.           recover_hp /= 2
  162.         end
  163.       end
  164.       # HP 回复量符号的反转、设置伤害值
  165.       self.damage = -recover_hp
  166.       # HP 以及 SP 的回复
  167.       last_hp = self.hp
  168.       last_sp = self.sp
  169.       ######################################################################
  170.       if self.state?(DEDUCT_HP_STATE) and recover_hp > 0
  171.         recover_hp = -recover_hp
  172.       end
  173.       ######################################################################
  174.       self.hp += recover_hp
  175.       self.sp += recover_sp
  176.       effective |= self.hp != last_hp
  177.       effective |= self.sp != last_sp
  178.       # 状态变化
  179.       @state_changed = false
  180.       effective |= states_plus(item.plus_state_set)
  181.       effective |= states_minus(item.minus_state_set)
  182.       # 能力上升值有效的情况下
  183.       if item.parameter_type > 0 and item.parameter_points != 0
  184.         # 能力值的分支
  185.         case item.parameter_type
  186.         when 1  # MaxHP
  187.           @maxhp_plus += item.parameter_points
  188.         when 2  # MaxSP
  189.           @maxsp_plus += item.parameter_points
  190.         when 3  # 力量
  191.           @str_plus += item.parameter_points
  192.         when 4  # 灵巧
  193.           @dex_plus += item.parameter_points
  194.         when 5  # 速度
  195.           @agi_plus += item.parameter_points
  196.         when 6  # 魔力
  197.           @int_plus += item.parameter_points
  198.         end
  199.         # 设置有效标志
  200.         effective = true
  201.       end
  202.       # HP 回复率与回复量为 0 的情况下
  203.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  204.         # 设置伤害为空的字符串
  205.         self.damage = ""
  206.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  207.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  208.            (item.parameter_type == 0 or item.parameter_points == 0)
  209.           # 状态没有变化的情况下
  210.           unless @state_changed
  211.             # 伤害设置为 "Miss"
  212.             self.damage = "Miss"
  213.           end
  214.         end
  215.       end
  216.     # Miss 的情况下
  217.     else
  218.       # 伤害设置为 "Miss"
  219.       self.damage = "Miss"
  220.     end
  221.     # 不在战斗中的情况下
  222.     unless $game_temp.in_battle
  223.       # 伤害设置为 nil
  224.       self.damage = nil
  225.     end
  226.     # 过程结束
  227.     return effective
  228.   end
  229. end


再來"技能熟練度"腳本:
RUBY 代码复制
  1. #==============================================================================
  2. # ★★★★★★★★ 技能等級設定腳本 BY:愚零鬥武多 ★★★★★★★★
  3. # ■想要用別客氣就直接拿去吧,腳本這種東西哪有版權可言=.=|||
  4. #==============================================================================
  5. # 此腳本可實現技能累積使用次數增加熟練度藉以提升技能等級的功能
  6. # 每位角色會自動在程式中建立專屬技能熟練與等級的資料庫,跟隨存檔
  7. # 適合想脫離常規技能製作的製作者,難度中等
  8. # 目前只有攻擊和回復技能威力會受等級影響,其他狀態添加類或地圖技能
  9. # 有興趣者可自行在def skill_effect(user, skill)添加功能
  10. # ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
  11. # 技能的設定法:
  12. # SKILL_EXP_LIST =
  13. # {
  14. # 技能ID=>[等級2累積熟練度,等級3累積熟練度,等級4累積熟練度..],
  15. # "END"=>0}
  16. # ◆範例:
  17. # SKILL_EXP_LIST =
  18. # {
  19. # 1=>[2,4,6],
  20. # 2=>[4,8],
  21. # 10=>[12,18,22,38],
  22. # "END"=>0}
  23. # ◆說明:
  24. #1號技能=>[LV2熟練度須達2,LV3熟練度須達4,LV4熟練度須達6],
  25. #2號技能=>[LV2熟練度須達4,LV3熟練度須達8],
  26. #10號技能=>[LV2熟練度須達12,LV3熟練度須達18,LV4熟練度須達22,LV4熟練度須達38],
  27. #[ ]裏的內容數量+1就是該技能的最高等級
  28. #末尾要加"END"=>0}沒啥意義,方便設定而已
  29. #沒有設定到的技能ID不受影響就照正常顯示
  30. #有設定到的技能在技能名稱後面會自動顯示其等級,說明後面會自動出現熟練度
  31. # ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
  32. # 技能熟練度的增加:
  33. # 只要傷害或回復值不為Miss成功使用的狀態下熟練度就+1
  34. # ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
  35. # 技能的威力設定:
  36. # 內建為技能威力+技能威力*技能等級*倍率
  37. # 倍率可以在腳本中搜尋S_PLUS = {}請自行修改,值越大等級影響威力越顯著
  38. # 修改法S_PLUS[技能ID] = 倍率
  39. # 沒有設定到的技能ID是以倍率0設定,也就是技能威力不受技能等級影響
  40. # ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
  41. # 技能經驗值與等級用語設定:
  42. # 請在腳本中搜尋
  43. # S_EXP = "熟練度:"
  44. # S_LV = "LV"
  45. # 請自行修改用語
  46. # ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  47. #==============================================================================
  48. # ■ 所有技能升級所需list列表設定
  49. #==============================================================================
  50. SKILL_EXP_LIST =
  51. {
  52. 1=>[5,10,15,20,25,30,35,40,45,50],
  53. "END"=>0}
  54. #==============================================================================
  55. # ■ 技能經驗值與等級用語設定
  56. #==============================================================================
  57. S_EXP = "熟練度:"
  58. S_LV = "-LV"
  59. #==============================================================================
  60. # ■ 每提升1級等級的技能威力倍率(自行添加設定)
  61. #==============================================================================
  62. S_PLUS = {}
  63. S_PLUS[1] = 0.2
  64. #==============================================================================
  65. # ■ Game_Actor添加可存取的技能等級與熟練度資料
  66. #==============================================================================
  67. class Game_Actor < Game_Battler
  68. #--------------------------------------------------------------------------
  69. # ● 讀取技能附加威力
  70. #--------------------------------------------------------------------------
  71. def skill_power_plus(skill)
  72. plus = S_PLUS[skill.id] != nil ? S_PLUS[skill.id] : 0
  73. # 技能威力*角色對應該技能等級*倍率
  74. return Integer(skill.power*self.skill_lv[skill.id]*plus)
  75. end
  76. #--------------------------------------------------------------------------
  77. # ● 讀取技能經驗值資料
  78. #--------------------------------------------------------------------------
  79. def skill_exps
  80. # 初始化@skill_exps
  81. @skill_exps = [] if @skill_exps == nil
  82. # 生成技能經驗值資料
  83. for i in 1...$data_skills.size
  84. if @skill_exps[i] == nil
  85. @skill_exps[i] = 0
  86. end
  87. end
  88. return @skill_exps
  89. end
  90. #--------------------------------------------------------------------------
  91. # ● 寫入技能經驗值資料
  92. #--------------------------------------------------------------------------
  93. def push_skill_exps(id,exp)
  94. self.skill_exps
  95. if SKILL_EXP_LIST[id] != nil
  96. t_max = SKILL_EXP_LIST[id][SKILL_EXP_LIST[id].size-1]
  97. @skill_exps[id] = [@skill_exps[id]+exp,t_max].min
  98. end
  99. end
  100. #--------------------------------------------------------------------------
  101. # ● 讀取技能等級
  102. #--------------------------------------------------------------------------
  103. def skill_lv
  104. # 初始化@skill_lv
  105. @skill_lv = [] if @skill_lv == nil
  106. # 生成並計算技能等級資料
  107. for i in 1...$data_skills.size
  108. list = SKILL_EXP_LIST[i]
  109. # 沒有被規劃到的技能list就設為[0]
  110. list = [0] if list == nil
  111. exp = skill_exps[i]
  112. # 計算對應熟練度的等級
  113. @skill_lv[i] = 0
  114. for index in 0...list.size
  115. if exp >= list[index]
  116. @skill_lv[i] = [@skill_lv[i]+1,list.size].min
  117. end
  118. end
  119. end
  120. return @skill_lv
  121. end
  122. end
  123. #==============================================================================
  124. # ■ Window_Skill技能help窗口說明增設exp與lv字串
  125. #==============================================================================
  126. class Window_Skill < Window_Selectable
  127. #--------------------------------------------------------------------------
  128. # ● 描繪項目
  129. #--------------------------------------------------------------------------
  130. def draw_item(index)
  131. skill = @data[index]
  132. if @actor.skill_can_use?(skill.id)
  133. self.contents.font.color = normal_color
  134. else
  135. self.contents.font.color = disabled_color
  136. end
  137. # 技能熟練list存在時,技能名稱添加等級字串
  138. if SKILL_EXP_LIST[skill.id] != nil
  139. id = skill.id
  140. lv = @actor.skill_lv[id]
  141. list = SKILL_EXP_LIST
  142. t_lv = lv >= list[id].size ? "MAX" : (lv+1).to_s
  143. text = S_LV+t_lv
  144. else
  145. text = ""
  146. end
  147. x = 4 + index % 2 * (288 + 32)
  148. y = index / 2 * 32
  149. rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  150. self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  151. bitmap = RPG::Cache.icon(skill.icon_name)
  152. opacity = self.contents.font.color == normal_color ? 255 : 128
  153. self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  154. self.contents.draw_text(x + 28, y, 204, 32, skill.name+text, 0)
  155. self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2)
  156. end
  157. #--------------------------------------------------------------------------
  158. # ● 更新提示內容
  159. #--------------------------------------------------------------------------
  160. def update_help
  161. # 有按下按鈕的情形才update
  162. if Input.dir4 != 0 or Input.press?(Input::C) or Input.press?(Input::B)
  163. # 技能為空的情況,說明設為空
  164. if self.skill == nil
  165. text = ""
  166. else
  167. # 技能熟練list存在時,說明添加熟練度字串
  168. if SKILL_EXP_LIST[self.skill.id] != nil
  169. id = self.skill.id
  170. lv = @actor.skill_lv[id]
  171. list = SKILL_EXP_LIST
  172. m_exp = list[id][[lv,list[id].size-1].min].to_s
  173. exp = S_EXP+@actor.skill_exps[id].to_s+"/"+m_exp
  174. text = self.skill.description+"("+exp+")"
  175. else
  176. text = self.skill.description
  177. end
  178. end
  179. # 設定help窗口
  180. @help_window.set_text(text)
  181. end
  182. end
  183. end
  184. #==============================================================================
  185. # ■ Game_Battler
  186. #==============================================================================
  187. class Game_Battler
  188. #--------------------------------------------------------------------------
  189. # ● 應用特技效果
  190. #--------------------------------------------------------------------------
  191. def skill_effect(user, skill)
  192. # 清除會心一擊標誌
  193. self.critical = false
  194. # 特技的效果範圍是 HP 1 以上的我方、自己的 HP 為 0、
  195. # 或者特技的效果範圍是 HP 0 的我方、自己的 HP 為 1 以上的情況下
  196. if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  197. ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  198. # 過程結束
  199. return false
  200. end
  201. # 清除有效標誌
  202. effective = false
  203. # 共通事件 ID 是有效的情況下,設定為有效標誌
  204. effective |= skill.common_event_id > 0
  205. # 第一命中判斷
  206. hit = skill.hit
  207. if skill.atk_f > 0
  208. hit *= user.hit / 100
  209. end
  210. hit_result = (rand(100) < hit)
  211. # 不確定特技的情況下設定為有效標誌
  212. effective |= hit < 100
  213. # 命中的情況下
  214. if hit_result == true
  215. # 計算威力
  216. power = skill.power + user.atk * skill.atk_f / 100
  217. # 我方使用的情形
  218. if user.is_a?(Game_Actor)
  219. # 計算技能等級的附加威力
  220. power += user.skill_power_plus(skill)
  221. end
  222. if power > 0
  223. power -= self.pdef * skill.pdef_f / 200
  224. power -= self.mdef * skill.mdef_f / 200
  225. power = [power, 0].max
  226. end
  227. # 計算倍率
  228. rate = 20
  229. rate += (user.str * skill.str_f / 100)
  230. rate += (user.dex * skill.dex_f / 100)
  231. rate += (user.agi * skill.agi_f / 100)
  232. rate += (user.int * skill.int_f / 100)
  233. # 計算基本傷害
  234. self.damage = power * rate / 20
  235. # 屬性修正
  236. self.damage *= elements_correct(skill.element_set)
  237. self.damage /= 100
  238. # 傷害符號正確的情況下
  239. if self.damage > 0
  240. # 防禦修正
  241. if self.guarding?
  242. self.damage /= 2
  243. end
  244. end
  245. # 分散
  246. if skill.variance > 0 and self.damage.abs > 0
  247. amp = [self.damage.abs * skill.variance / 100, 1].max
  248. self.damage += rand(amp+1) + rand(amp+1) - amp
  249. end
  250. # 第二命中判斷
  251. eva = 8 * self.agi / user.dex + self.eva
  252. hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  253. hit = self.cant_evade? ? 100 : hit
  254. hit_result = (rand(100) < hit)
  255. # 不確定特技的情況下設定為有效標誌
  256. effective |= hit < 100
  257. end
  258. # 命中的情況下
  259. if hit_result == true
  260. # 威力 0 以外的物理攻擊的情況下
  261. if skill.power != 0 and skill.atk_f > 0
  262. # 狀態衝擊解除
  263. remove_states_shock
  264. # 設定有效標誌
  265. effective = true
  266. end
  267. # HP 的傷害減法運算
  268. last_hp = self.hp
  269. self.hp -= self.damage
  270. effective |= self.hp != last_hp
  271. # 狀態變化
  272. @state_changed = false
  273. effective |= states_plus(skill.plus_state_set)
  274. effective |= states_minus(skill.minus_state_set)
  275. # 威力為 0 的場合
  276. if skill.power == 0
  277. # 傷害設定為空的字串
  278. self.damage = ""
  279. # 狀態沒有變化的情況下
  280. unless @state_changed
  281. # 傷害設定為 "Miss"
  282. self.damage = "Miss"
  283. end
  284. end
  285. # Miss 的情況下
  286. else
  287. # 傷害設定為 "Miss"
  288. self.damage = "Miss"
  289. end
  290. # 不在戰鬥中的情況下
  291. unless $game_temp.in_battle
  292. # 傷害設定為 nil
  293. self.damage = nil
  294. end
  295. # 使用者是我方的情形
  296. if user.is_a?(Game_Actor)
  297. # 有效使用的情況,熟練度+1
  298. if effective && self.damage != "Miss"
  299. user.push_skill_exps(skill.id,1)
  300. end
  301. end
  302. # 過程結束
  303. return effective
  304. end
  305. end


請問有沒有辦法把這2個腳本整合成既有特殊狀態也會有技能熟練度的效果
((雖然說我在插入腳本時候才發現到這個問題...

Lv2.观梦者

梦石
0
星屑
362
在线时间
296 小时
注册时间
2013-6-1
帖子
121
3
 楼主| 发表于 2013-9-2 22:11:13 | 只看该作者
棕熊匠仙 发表于 2013-9-2 19:31
@Person

DEDUCT_HP_STATE = 49

剛剛測試成功  謝謝你給的腳本  
((雖然說再補藥水時候沒有扣  不過這樣就足夠了^^
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
24 小时
注册时间
2013-8-10
帖子
25
2
发表于 2013-9-2 19:31:04 | 只看该作者
本帖最后由 棕熊匠仙 于 2013-9-2 19:32 编辑

@Person
RUBY 代码复制
  1. DEDUCT_HP_STATE = 49
  2. #==============================================================================
  3. # ★★★★★★★★ 技能等級設定腳本 BY:愚零鬥武多 ★★★★★★★★
  4. # ■想要用別客氣就直接拿去吧,腳本這種東西哪有版權可言=.=|||
  5. #==============================================================================
  6. # 此腳本可實現技能累積使用次數增加熟練度藉以提升技能等級的功能
  7. # 每位角色會自動在程式中建立專屬技能熟練與等級的資料庫,跟隨存檔
  8. # 適合想脫離常規技能製作的製作者,難度中等
  9. # 目前只有攻擊和回復技能威力會受等級影響,其他狀態添加類或地圖技能
  10. # 有興趣者可自行在def skill_effect(user, skill)添加功能
  11. # ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
  12. # 技能的設定法:
  13. # SKILL_EXP_LIST =
  14. # {
  15. # 技能ID=>[等級2累積熟練度,等級3累積熟練度,等級4累積熟練度..],
  16. # "END"=>0}
  17. # ◆範例:
  18. # SKILL_EXP_LIST =
  19. # {
  20. # 1=>[2,4,6],
  21. # 2=>[4,8],
  22. # 10=>[12,18,22,38],
  23. # "END"=>0}
  24. # ◆說明:
  25. #1號技能=>[LV2熟練度須達2,LV3熟練度須達4,LV4熟練度須達6],
  26. #2號技能=>[LV2熟練度須達4,LV3熟練度須達8],
  27. #10號技能=>[LV2熟練度須達12,LV3熟練度須達18,LV4熟練度須達22,LV4熟練度須達38],
  28. #[ ]裏的內容數量+1就是該技能的最高等級
  29. #末尾要加"END"=>0}沒啥意義,方便設定而已
  30. #沒有設定到的技能ID不受影響就照正常顯示
  31. #有設定到的技能在技能名稱後面會自動顯示其等級,說明後面會自動出現熟練度
  32. # ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
  33. # 技能熟練度的增加:
  34. # 只要傷害或回復值不為Miss成功使用的狀態下熟練度就+1
  35. # ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
  36. # 技能的威力設定:
  37. # 內建為技能威力+技能威力*技能等級*倍率
  38. # 倍率可以在腳本中搜尋S_PLUS = {}請自行修改,值越大等級影響威力越顯著
  39. # 修改法S_PLUS[技能ID] = 倍率
  40. # 沒有設定到的技能ID是以倍率0設定,也就是技能威力不受技能等級影響
  41. # ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
  42. # 技能經驗值與等級用語設定:
  43. # 請在腳本中搜尋
  44. # S_EXP = "熟練度:"
  45. # S_LV = "LV"
  46. # 請自行修改用語
  47. # ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  48. #==============================================================================
  49. # ■ 所有技能升級所需list列表設定
  50. #==============================================================================
  51. SKILL_EXP_LIST =
  52. {
  53. 1=>[5,10,15,20,25,30,35,40,45,50],
  54. "END"=>0}
  55. #==============================================================================
  56. # ■ 技能經驗值與等級用語設定
  57. #==============================================================================
  58. S_EXP = "熟練度:"
  59. S_LV = "-LV"
  60. #==============================================================================
  61. # ■ 每提升1級等級的技能威力倍率(自行添加設定)
  62. #==============================================================================
  63. S_PLUS = {}
  64. S_PLUS[1] = 0.2
  65. #==============================================================================
  66. # ■ Game_Actor添加可存取的技能等級與熟練度資料
  67. #==============================================================================
  68. class Game_Actor < Game_Battler
  69. #--------------------------------------------------------------------------
  70. # ● 讀取技能附加威力
  71. #--------------------------------------------------------------------------
  72. def skill_power_plus(skill)
  73. plus = S_PLUS[skill.id] != nil ? S_PLUS[skill.id] : 0
  74. # 技能威力*角色對應該技能等級*倍率
  75. return Integer(skill.power*self.skill_lv[skill.id]*plus)
  76. end
  77. #--------------------------------------------------------------------------
  78. # ● 讀取技能經驗值資料
  79. #--------------------------------------------------------------------------
  80. def skill_exps
  81. # 初始化@skill_exps
  82. @skill_exps = [] if @skill_exps == nil
  83. # 生成技能經驗值資料
  84. for i in 1...$data_skills.size
  85. if @skill_exps[i] == nil
  86. @skill_exps[i] = 0
  87. end
  88. end
  89. return @skill_exps
  90. end
  91. #--------------------------------------------------------------------------
  92. # ● 寫入技能經驗值資料
  93. #--------------------------------------------------------------------------
  94. def push_skill_exps(id,exp)
  95. self.skill_exps
  96. if SKILL_EXP_LIST[id] != nil
  97. t_max = SKILL_EXP_LIST[id][SKILL_EXP_LIST[id].size-1]
  98. @skill_exps[id] = [@skill_exps[id]+exp,t_max].min
  99. end
  100. end
  101. #--------------------------------------------------------------------------
  102. # ● 讀取技能等級
  103. #--------------------------------------------------------------------------
  104. def skill_lv
  105. # 初始化@skill_lv
  106. @skill_lv = [] if @skill_lv == nil
  107. # 生成並計算技能等級資料
  108. for i in 1...$data_skills.size
  109. list = SKILL_EXP_LIST[i]
  110. # 沒有被規劃到的技能list就設為[0]
  111. list = [0] if list == nil
  112. exp = skill_exps[i]
  113. # 計算對應熟練度的等級
  114. @skill_lv[i] = 0
  115. for index in 0...list.size
  116. if exp >= list[index]
  117. @skill_lv[i] = [@skill_lv[i]+1,list.size].min
  118. end
  119. end
  120. end
  121. return @skill_lv
  122. end
  123. end
  124. #==============================================================================
  125. # ■ Window_Skill技能help窗口說明增設exp與lv字串
  126. #==============================================================================
  127. class Window_Skill < Window_Selectable
  128. #--------------------------------------------------------------------------
  129. # ● 描繪項目
  130. #--------------------------------------------------------------------------
  131. def draw_item(index)
  132. skill = @data[index]
  133. if @actor.skill_can_use?(skill.id)
  134. self.contents.font.color = normal_color
  135. else
  136. self.contents.font.color = disabled_color
  137. end
  138. # 技能熟練list存在時,技能名稱添加等級字串
  139. if SKILL_EXP_LIST[skill.id] != nil
  140. id = skill.id
  141. lv = @actor.skill_lv[id]
  142. list = SKILL_EXP_LIST
  143. t_lv = lv >= list[id].size ? "MAX" : (lv+1).to_s
  144. text = S_LV+t_lv
  145. else
  146. text = ""
  147. end
  148. x = 4 + index % 2 * (288 + 32)
  149. y = index / 2 * 32
  150. rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  151. self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  152. bitmap = RPG::Cache.icon(skill.icon_name)
  153. opacity = self.contents.font.color == normal_color ? 255 : 128
  154. self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  155. self.contents.draw_text(x + 28, y, 204, 32, skill.name+text, 0)
  156. self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2)
  157. end
  158. #--------------------------------------------------------------------------
  159. # ● 更新提示內容
  160. #--------------------------------------------------------------------------
  161. def update_help
  162. # 有按下按鈕的情形才update
  163. if Input.dir4 != 0 or Input.press?(Input::C) or Input.press?(Input::B)
  164. # 技能為空的情況,說明設為空
  165. if self.skill == nil
  166. text = ""
  167. else
  168. # 技能熟練list存在時,說明添加熟練度字串
  169. if SKILL_EXP_LIST[self.skill.id] != nil
  170. id = self.skill.id
  171. lv = @actor.skill_lv[id]
  172. list = SKILL_EXP_LIST
  173. m_exp = list[id][[lv,list[id].size-1].min].to_s
  174. exp = S_EXP+@actor.skill_exps[id].to_s+"/"+m_exp
  175. text = self.skill.description+"("+exp+")"
  176. else
  177. text = self.skill.description
  178. end
  179. end
  180. # 設定help窗口
  181. @help_window.set_text(text)
  182. end
  183. end
  184. end
  185. #==============================================================================
  186. # ■ Game_Battler
  187. #==============================================================================
  188. class Game_Battler
  189. #--------------------------------------------------------------------------
  190. # ● 應用特技效果
  191. #--------------------------------------------------------------------------
  192. def skill_effect(user, skill)
  193. # 清除會心一擊標誌
  194. self.critical = false
  195. # 特技的效果範圍是 HP 1 以上的我方、自己的 HP 為 0、
  196. # 或者特技的效果範圍是 HP 0 的我方、自己的 HP 為 1 以上的情況下
  197. if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  198. ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  199. # 過程結束
  200. return false
  201. end
  202. # 清除有效標誌
  203. effective = false
  204. # 共通事件 ID 是有效的情況下,設定為有效標誌
  205. effective |= skill.common_event_id > 0
  206. # 第一命中判斷
  207. hit = skill.hit
  208. if skill.atk_f > 0
  209. hit *= user.hit / 100
  210. end
  211. hit_result = (rand(100) < hit)
  212. # 不確定特技的情況下設定為有效標誌
  213. effective |= hit < 100
  214. # 命中的情況下
  215. if hit_result == true
  216. # 計算威力
  217. power = skill.power + user.atk * skill.atk_f / 100
  218. # 我方使用的情形
  219. if user.is_a?(Game_Actor)
  220. # 計算技能等級的附加威力
  221. power += user.skill_power_plus(skill)
  222. end
  223. if power > 0
  224. power -= self.pdef * skill.pdef_f / 200
  225. power -= self.mdef * skill.mdef_f / 200
  226. power = [power, 0].max
  227. end
  228. # 計算倍率
  229. rate = 20
  230. rate += (user.str * skill.str_f / 100)
  231. rate += (user.dex * skill.dex_f / 100)
  232. rate += (user.agi * skill.agi_f / 100)
  233. rate += (user.int * skill.int_f / 100)
  234. # 計算基本傷害
  235. self.damage = power * rate / 20
  236. # 屬性修正
  237. self.damage *= elements_correct(skill.element_set)
  238. self.damage /= 100
  239. # 傷害符號正確的情況下
  240. if self.damage > 0
  241. # 防禦修正
  242. if self.guarding?
  243. self.damage /= 2
  244. end
  245. end
  246. # 分散
  247. if skill.variance > 0 and self.damage.abs > 0
  248. amp = [self.damage.abs * skill.variance / 100, 1].max
  249. self.damage += rand(amp+1) + rand(amp+1) - amp
  250. end
  251. # 第二命中判斷
  252. eva = 8 * self.agi / user.dex + self.eva
  253. hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  254. hit = self.cant_evade? ? 100 : hit
  255. hit_result = (rand(100) < hit)
  256. # 不確定特技的情況下設定為有效標誌
  257. effective |= hit < 100
  258. end
  259. # 命中的情況下
  260. if hit_result == true
  261. # 威力 0 以外的物理攻擊的情況下
  262. if skill.power != 0 and skill.atk_f > 0
  263. # 狀態衝擊解除
  264. remove_states_shock
  265. # 設定有效標誌
  266. effective = true
  267. end
  268. # HP 的傷害減法運算
  269. last_hp = self.hp
  270. #########################################################################
  271. if self.state?(DEDUCT_HP_STATE) and self.damage <0
  272.   self.damage = -self.damage
  273. end   
  274. #########################################################################
  275. self.hp -= self.damage
  276. effective |= self.hp != last_hp
  277. # 狀態變化
  278. @state_changed = false
  279. effective |= states_plus(skill.plus_state_set)
  280. effective |= states_minus(skill.minus_state_set)
  281. # 威力為 0 的場合
  282. if skill.power == 0
  283. # 傷害設定為空的字串
  284. self.damage = ""
  285. # 狀態沒有變化的情況下
  286. unless @state_changed
  287. # 傷害設定為 "Miss"
  288. self.damage = "Miss"
  289. end
  290. end
  291. # Miss 的情況下
  292. else
  293. # 傷害設定為 "Miss"
  294. self.damage = "Miss"
  295. end
  296. # 不在戰鬥中的情況下
  297. unless $game_temp.in_battle
  298. # 傷害設定為 nil
  299. self.damage = nil
  300. end
  301. # 使用者是我方的情形
  302. if user.is_a?(Game_Actor)
  303. # 有效使用的情況,熟練度+1
  304. if effective && self.damage != "Miss"
  305. user.push_skill_exps(skill.id,1)
  306. end
  307. end
  308. # 過程結束
  309. return effective
  310. end
  311. end


替换原有的熟练度,未测试,请先备份

评分

参与人数 1星屑 +84 收起 理由
弗雷德 + 84 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-2 11:52

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表