Project1

标题: 回血之後反而會扣寫的狀態設定問題 [打印本页]

作者: e900003    时间: 2013-8-31 10:09
标题: 回血之後反而會扣寫的狀態設定問題
本帖最后由 e900003 于 2013-8-31 10:40 编辑

如題
我想設置一個狀態
這個狀態的效果是  重了這個狀態之後
只要用藥水或是技能回血  血量反而會扣要回復的血量
然後等到一定的回合的時候就會解除
請問這種狀態腳本要怎改

雖然說我有找到類似這種的狀態腳本
只是只要用了技能或是藥水回復  扣血之後就會直接解除狀態....
作者: myownroc    时间: 2013-8-31 11:23
在脚本中找到"扣血后解除状态"的代码删掉就好了
作者: e900003    时间: 2013-8-31 13:31
本帖最后由 e900003 于 2013-8-31 13:37 编辑

我有試過刪除掉那一行   結果角色死亡後無法復活
在角色復活之後有機率會出現錯誤
給個原本的腳本好了
  1. class Scene_Battle
  2. #--------------------------------------------------------------------------
  3. # ● 製作特技行動結果
  4. #--------------------------------------------------------------------------
  5. def make_skill_action_result
  6. # 取得特技
  7. [url=home.php?mod=space&uid=260100]@skill[/url] = $data_skills[@active_battler.current_action.skill_id]
  8. # 如果不是強制行動
  9. unless @active_battler.current_action.forcing
  10. # 因為SP耗盡而無法使用的情況下
  11. unless @active_battler.skill_can_use?(@skill.id)
  12. # 清除強制行動目標的戰鬥者
  13. $game_temp.forcing_battler = nil
  14. # 移至步驟1
  15. @phase4_step = 1
  16. return
  17. end
  18. end
  19. # 消耗SP
  20. @active_battler.sp -= @skill.sp_cost
  21. # 更新狀態視窗
  22. @status_window.refresh
  23. # 在提示視窗顯示特技名稱
  24. @help_window.set_text(@skill.name, 1)
  25. # 設定動畫 ID
  26. @animation1_id = @skill.animation1_id
  27. @animation2_id = @skill.animation2_id
  28. # 設定共通事件 ID
  29. @common_event_id = @skill.common_event_id
  30. # 設定目標側戰鬥者
  31. set_target_battlers(@skill.scope)
  32. # 設置新暫存參數
  33. @temp_skill_tagret = {} if @temp_skill_tagret == nil
  34. # 應用特技效果
  35. for target in @target_battlers
  36. # 符合回復反而扣血的條件目標時
  37. if @skill.power < 0 && target.states.include?(49)
  38. @temp_skill_tagret[target] = [email protected] * (@skill.atk_f + @skill.str_f + @skill.agi_f + @skill.dex_f + @skill.int_f / 2)
  39. # 正常狀況
  40. else
  41. target.skill_effect(@active_battler, @skill)
  42. end
  43. end
  44. end
  45. #--------------------------------------------------------------------------
  46. # ● 製作物品行動結果
  47. #--------------------------------------------------------------------------
  48. def make_item_action_result
  49. # 取得物品
  50. @item = $data_items[@active_battler.current_action.item_id]
  51. # 因為物品耗盡而無法使用的情況下
  52. unless $game_party.item_can_use?(@item.id)
  53. # 移至步驟1
  54. @phase4_step = 1
  55. return
  56. end
  57. # 消耗品的情況下
  58. if @item.consumable
  59. # 使用的物品減1
  60. $game_party.lose_item(@item.id, 1)
  61. end
  62. # 在提示視窗顯示物品名稱
  63. @help_window.set_text(@item.name, 1)
  64. # 設定動畫 ID
  65. @animation1_id = @item.animation1_id
  66. @animation2_id = @item.animation2_id
  67. # 設定共通事件 ID
  68. @common_event_id = @item.common_event_id
  69. # 確定目標
  70. index = @active_battler.current_action.target_index
  71. target = $game_party.smooth_target_actor(index)
  72. # 設定目標側戰鬥者
  73. set_target_battlers(@item.scope)
  74. # 設置新暫存參數
  75. @temp_item_tagret = {} if @temp_item_tagret == nil
  76. # 應用物品效果
  77. for target in @target_battlers
  78. # 符合回復反而扣血的條件目標時
  79. if @item.recover_hp > 0 && target.states.include?(49)
  80. @temp_item_tagret[target] = @item.recover_hp
  81. # 正常狀況
  82. else
  83. target.item_effect(@item)
  84. end
  85. end
  86. end
  87. #--------------------------------------------------------------------------
  88. # ● 更新畫面 (主回合步驟 4 : 對像方動畫)
  89. #--------------------------------------------------------------------------
  90. def update_phase4_step4
  91. # 設置新暫存參數
  92. @temp_skill_tagret = {} if @temp_skill_tagret == nil
  93. @temp_item_tagret = {} if @temp_item_tagret == nil
  94. # 執行技能具回復扣血的目標損傷數值寫入
  95. if @temp_skill_tagret != {}
  96. for i in @temp_skill_tagret.keys
  97. i.hp -= @temp_skill_tagret[i]
  98. i.damage = @temp_skill_tagret[i]
  99. # 移除狀態
  100. i.remove_state(49)
  101. end
  102. @temp_skill_tagret = {}
  103. end
  104. # 執行道具回復扣血的目標損傷數值寫入
  105. if @temp_item_tagret != {}
  106. for i in @temp_item_tagret.keys
  107. i.hp -= @temp_item_tagret[i]
  108. i.damage = @temp_item_tagret[i]
  109. # 移除狀態
  110. i.remove_state(49)
  111. end
  112. @temp_item_tagret = {}
  113. end
  114. # 目標方動畫
  115. for target in @target_battlers
  116. target.animation_id = @animation2_id
  117. target.animation_hit = (target.damage != "Miss")
  118. end
  119. # 限制動畫長度、最低8幅畫面
  120. @wait_count = 8
  121. # 移至步驟5
  122. @phase4_step = 5
  123. end
  124. end
复制代码

作者: myownroc    时间: 2013-8-31 14:01
e900003 发表于 2013-8-31 13:31
我有試過刪除掉那一行   結果角色死亡後無法復活
在角色復活之後有機率會出現錯誤
給個原本的腳本好了 ...

。。。表示手机看不到脚本
作者: wingzeroplus    时间: 2013-8-31 14:06
本帖最后由 wingzeroplus 于 2013-8-31 14:08 编辑

其实很简单 不需要用到额外的脚本

去Game_Battler 3下面● 应用特技效果  # HP 的伤害减法运算上面插入
     if  self.state?(20)  #比如20号状态
      self.damage = self.damage.abs
     end   
● 应用物品效果下面# HP 以及 SP 的回复这样改
      last_hp = self.hp
      last_sp = self.sp
  #    self.hp += recover_hp
  #    self.sp += recover_sp
      ########################
    if  self.state?(20)
      self.hp -= recover_hp
      self.sp -= recover_sp
    else
      self.hp += recover_hp
      self.sp += recover_sp
    end
    #########################

就完了,然后去数据可以设置好20号状态的解除回合数即可
作者: e900003    时间: 2013-8-31 14:31
本帖最后由 e900003 于 2013-8-31 14:35 编辑

回5樓的:
其实很简单 不需要用到额外的脚本

去Game_Battler 3下面● 应用特技效果  # HP 的伤害减法运算上面插入
     if  self.state?(20)  #比如20号状态
      self.damage = self.damage.abs
     end   
● 应用物品效果下面# HP 以及 SP 的回复这样改
      last_hp = self.hp
      last_sp = self.sp
  #    self.hp += recover_hp
  #    self.sp += recover_sp
      ########################
    if  self.state?(20)
      self.hp -= recover_hp
      self.sp -= recover_sp
    else
      self.hp += recover_hp
      self.sp += recover_sp
    end
    #########################

就完了,然后去数据可以设置好20号状态的解除回合数即可


我用過了只有物品有效果  技能沒效果  
作者: qdqlloxe    时间: 2013-8-31 16:10
公共事件吧,每次战斗都调用,条件分歧 生命恢复的场合 角色处于特殊状态的场合 减少hp就行了  用脚本作判断
作者: 芯☆淡茹水    时间: 2013-9-2 05:05
复制下面的脚本,插入到 main 前,
也可仿照脚本里插入的两段,插在自己的工程脚本里。
  1. #==============================================================================
  2. # 回血变扣血的状态 ID
  3. DEDUCT_HP_STATE = 10
  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
复制代码

作者: e900003    时间: 2013-9-2 11:31
本帖最后由 e900003 于 2013-9-2 11:33 编辑
芯☆淡茹水 发表于 2013-9-2 05:05
复制下面的脚本,插入到 main 前,
也可仿照脚本里插入的两段,插在自己的工程脚本里。 ...


謝謝妳給的腳本   這比我原本的腳本還要好太多了~~~
((雖然我原本的腳本沒有做到用%數恢復的藥水  反而會恢復= =




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1