查看: 2036|回复: 0

[已经解决] 关于敌人仇恨脚本和MOG的技能范围脚本的冲突

[复制链接]
梦石
0
星屑
173
在线时间
192 小时
注册时间
2011-3-13
回帖
31
发表于 2015-4-9 01:34:45 | 显示全部楼层 |阅读模式

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

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

×
这两个脚本因为都引用了Game Action的targets_for_opponents所以放在一起会有一个无效
脚本盲表示不知道该从哪里改
把脚本放上来求修改
  1. #==============================================================================
  2. # +++ MOG - Scope EX (v1.5) +++
  3. #==============================================================================
  4. # By Moghunter
  5. # https://atelierrgss.wordpress.com/
  6. #==============================================================================
  7. # Adiciona a característica de área de impacto da ação baseado na posição
  8. # e o tamanho do sprite do alvo.
  9. # Por exemplo, uma habilidade de explosão vai acertar apenas os inimigos que
  10. # estiverem em volta do alvo inicial.
  11. # O script adiciona também a função de incluir todos os alvos da tela, aliados
  12. # e inimigos juntos.
  13. #==============================================================================
  14. # Adicione a Tag abaixo na caixa de comentários de notas para definir a área de
  15. # impacto da habilidade.
  16. #
  17. # <Scope Range = X1 - X2 - Y1 - Y2>
  18. #
  19. #            Y1
  20. #            
  21. #       X1        X2
  22. #            
  23. #            Y2
  24. #
  25. # Ex ->      <Scope Range = 100 - 32 - 64 - 32>
  26. #
  27. #==============================================================================
  28. # Incluir todos os alvos da tela. (Inimigos e Aliados)
  29. #==============================================================================
  30. #
  31. # <All Targets>
  32. #
  33. #==============================================================================
  34. # Histórico
  35. #==============================================================================
  36. # v1.5 Correção de ativar o sistema sem fazer comentário na caixa de notas.
  37. # v1.4 Compatibilidade com MOG Sprite Actor.
  38. # v1.3 Melhoria no cálculo de área em alvos únicos.
  39. # v1.2 Melhoria no sistema de calculo baseado no tamanho do sprite.
  40. # v1.1 Possibilidade de definir a área específica para cada lado.
  41. #   
  42. #==============================================================================

  43. $imported = {} if $imported.nil?
  44. $imported[:mog_scope_ex] = true

  45. module MOG_SCOPE_EX
  46.   #============================================================================
  47.   # Definição do modo que vai ser calculado a área do alvo.
  48.   #
  49.   # 0 - Baseado apenas na posição X e Y. (ignorando o tamanho do sprite)
  50.   # 1 - Baseado na posição X e Y + o tamanho do sprite do alvo.
  51.   #     (Alvos grandes tem maior area de impacto)
  52.   #
  53.   #============================================================================
  54.   SCOPE_TYPE = 1
  55.   #============================================================================
  56.   # Definição da porcentágem total do tamanho sprite, para ser efetuado o
  57.   # calculo. (Apenas se o valor do SCOPE_TYPE estiver no 1)
  58.   # Por exemplo, definindo o valor de 100% o sistema vai considerar 100% do
  59.   # tamanho do sprite para fazer o calculo.
  60.   #============================================================================
  61.   # SPRITE_SIZE_RANGE = [WIDTH %, HEIGHT %]  
  62.   #============================================================================
  63.   SPRITE_SIZE_RANGE = [80,70]  
  64. end

  65. #==============================================================================
  66. # ■ Game Battler
  67. #==============================================================================
  68. class Game_Battler < Game_BattlerBase
  69.   attr_accessor :sprite_size
  70.   
  71.   #--------------------------------------------------------------------------
  72.   # * Initialize
  73.   #--------------------------------------------------------------------------
  74.   alias mog_scope_ex_initialize initialize
  75.   def initialize
  76.       @sprite_size = [0,0,true]
  77.       mog_scope_ex_initialize
  78.   end

  79. end

  80. #==============================================================================
  81. # ■ Sprite Battler
  82. #==============================================================================
  83. class Sprite_Battler < Sprite_Base

  84.   #--------------------------------------------------------------------------
  85.   # * Update Bitmap
  86.   #--------------------------------------------------------------------------
  87.   alias mog_scope_ex_update_bitmap update_bitmap
  88.   def update_bitmap
  89.       @battler.sprite_size = [bitmap.width,bitmap.height,true] if bitmap
  90.       mog_scope_ex_update_bitmap
  91.   end

  92. end

  93. #==============================================================================
  94. # ■ Scene Battle
  95. #==============================================================================
  96. class Scene_Battle < Scene_Base

  97.   #--------------------------------------------------------------------------
  98.   # * Show Normal Animation
  99.   #--------------------------------------------------------------------------
  100.   alias mog_scope_ex_show_normal_animation show_normal_animation
  101.   def show_normal_animation(targets, animation_id, mirror = false)
  102.       new_targets = []
  103.       targets.each do |t| new_targets.push(t) if t.sprite_size[2] end
  104.       targets = new_targets
  105.       mog_scope_ex_show_normal_animation(targets, animation_id, mirror)
  106.       targets.each do |t| t.sprite_size[2] = true end
  107.   end  
  108.   
  109. end

  110. #==============================================================================
  111. # ■ Game Action
  112. #==============================================================================
  113. class Game_Action
  114.   include MOG_SCOPE_EX
  115.   #--------------------------------------------------------------------------
  116.   # * Make Targets
  117.   #--------------------------------------------------------------------------
  118.   def make_targets
  119.       if $imported[:mog_battler_motion] != nil and $imported[:mog_sprite_actor] != nil
  120.          return @subject.pre_target if @subject != nil and @subject.pre_target != nil
  121.       end
  122.       if !forcing && subject.confusion?
  123.          confusion_target
  124.       elsif item.for_opponent?
  125.          targets_for_opponents
  126.       elsif item.for_friend?
  127.          targets_for_friends
  128.       else
  129.         []
  130.       end
  131.   end  
  132.   
  133.   #--------------------------------------------------------------------------
  134.   # * Confusion Target
  135.   #--------------------------------------------------------------------------
  136.   def confusion_target
  137.       case subject.confusion_level
  138.       when 1 ; new_targets = make_new_targets([opponents_unit.random_target],0)
  139.       when 2
  140.           if rand(2) == 0
  141.             new_targets = make_new_targets([opponents_unit.random_target],0)
  142.           else
  143.             new_targets = make_new_targets([friends_unit.random_target],1)
  144.           end
  145.       else
  146.            new_targets = make_new_targets([friends_unit.random_target],1)  
  147.       end
  148.   end
  149.   
  150.   #--------------------------------------------------------------------------
  151.   # * Targets for Opponents
  152.   #--------------------------------------------------------------------------
  153.   def targets_for_opponents
  154.       if item.for_random?
  155.          org_target = Array.new(item.number_of_targets) { opponents_unit.random_target }
  156.          new_targets = make_new_targets(org_target,0)
  157.       elsif item.for_one?
  158.          num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
  159.          if @target_index < 0
  160.             org_target = [opponents_unit.random_target] * num
  161.             new_targets = make_new_targets(org_target,0)
  162.          else
  163.             org_target = [opponents_unit.smooth_target(@target_index)] * num
  164.             new_targets = make_new_targets(org_target,0)
  165.          end
  166.        else
  167.           return (opponents_unit.alive_members + friends_unit.alive_members) if all_targets
  168.           return opponents_unit.alive_members
  169.       end
  170.   end
  171.   
  172.   #--------------------------------------------------------------------------
  173.   # * All Targets
  174.   #--------------------------------------------------------------------------
  175.   def all_targets
  176.       return true if @item.object.note =~ /<All Targets>/
  177.       return false
  178.   end
  179.   
  180.   #--------------------------------------------------------------------------
  181.   # * Targets for Allies
  182.   #--------------------------------------------------------------------------
  183.   def targets_for_friends
  184.     if item.for_user?
  185.        new_targets = make_new_targets([subject],1)      
  186.     elsif item.for_dead_friend?
  187.         if item.for_one?
  188.            org_target = [friends_unit.smooth_dead_target(@target_index)]
  189.            new_targets = make_new_targets(org_target,2)   
  190.         else
  191.            org_target = friends_unit.dead_members
  192.            new_targets = make_new_targets(org_target,2)           
  193.         end
  194.     elsif item.for_friend?
  195.          if item.for_one?
  196.             org_target = [friends_unit.smooth_target(@target_index)]
  197.             new_targets = make_new_targets(org_target,1)   
  198.          else
  199.             return (opponents_unit.alive_members + friends_unit.alive_members) if all_targets
  200.             return friends_unit.alive_members
  201.          end
  202.     end
  203.   end
  204.   
  205.   #--------------------------------------------------------------------------
  206.   # * Make New Targets
  207.   #--------------------------------------------------------------------------
  208.   def make_new_targets(target,type = 0)
  209.       targets = []
  210.       if all_targets
  211.         members = (opponents_unit.alive_members + friends_unit.alive_members) if type <= 1
  212.         members = friends_unit.dead_members if type == 2      
  213.       else
  214.         members = opponents_unit.alive_members if type == 0
  215.         members = friends_unit.alive_members if type == 1
  216.         members = friends_unit.dead_members if type == 2
  217.       end
  218.       for t in target
  219.           for m in members
  220.               targets.push(m) if t == m
  221.               next if t == m
  222.              (targets.push(m); m.sprite_size[2] = false) if scope_range?(t,m)            
  223.           end
  224.       end
  225.       return targets
  226.   end
  227.   
  228.   #--------------------------------------------------------------------------
  229.   # * Scope Range
  230.   #--------------------------------------------------------------------------
  231.   def scope_range?(user,target)
  232.       t_r2 = [user.screen_x, user.screen_y] rescue nil
  233.       t_r3 = [target.screen_x, target.screen_y] rescue nil
  234.       return false if t_r2 == nil or t_r3 == nil
  235.       s_r = [0,0,0,0] ; s_p = [0,0]
  236.       s_r = [$1.to_i,$2.to_i,$3.to_i,$4.to_i] if @item.object.note =~ /<Scope Range = (\d+) - (\d+) - (\d+) - (\d+)>/
  237.       return false if s_r == [0,0,0,0]
  238.       if SCOPE_TYPE > 0
  239.          s_p = [target.sprite_size[0] / 2, target.sprite_size[1]]
  240.          s_p[0] = s_p[0] * SPRITE_SIZE_RANGE[0] / 100
  241.          s_p[1] = s_p[1] * SPRITE_SIZE_RANGE[1] / 100
  242.       end
  243.       return false if !t_r3[0].between?(t_r2[0] - (s_r[0] + s_p[0]), t_r2[0] + (s_r[1] + s_p[0]))
  244.       return false if !t_r3[1].between?(t_r2[1] - s_r[2], t_r2[1] + s_r[3] + s_p[1])
  245.       return true
  246.   end  
  247.   
  248. end
复制代码
[pre lang="ruby"]#==============================================================================
# ■ 敵對心腳本@ネ実ツクールスレ
#------------------------------------------------------------------------------
#   VX ACE敵対心設定。
#    (可通過HP變動設定累積仇恨。)
#------------------------------------------------------------------------------
#  ■ 規格
#    ・給予損害,將HP恢復等增加敵對。
#      ※100傷害 or HP100回復時敵対心100増加。
#    ・受到傷害時,會降低敵對心。
#    ・[敵對]×的[狙撃率]值最大的角色將是敵人的目標。
#    ・若[敵對]×的[狙撃率]值最大的結果是多個時,靠前的角色會成為目標。
#   ・如果影響範圍是隨機的,會忽略敵意,狙撃率。
#    ・若隊員全員的敵対心都是0時、會和原本乱数決定目標。
#   ・戦闘不能時敵対心歸0。
#------------------------------------------------------------------------------
#  ■ 使用方法 -一-
#   ◆制作産生敵對値但無傷害的技能。
#   ・在技能的備註中設定敵對値。
#      例)増加敵對値100。
#          <敵対心 100>
#   ◆制作減少敵對値害的技能。
#    ・在技能的備註中現設定敵對値。
#      ※敵対心減少以数値百分比計算。
#      例)減少敵対心50%。
#          <敵対心 -50>
#   ◆可在傷害中計算式中使用敵対心。
#     ・計算式用“a.hat”書式、來參照現在的敵対心。
#       例)ロイエ的傷害計算式
#           a.hat * a.tp * 0.001
#------------------------------------------------------------------------------
#  ■ 使用方法 -二-
#   ◆制作將自方隊員的敵對値轉移到自己身上。
#   ①在資料庫中制作一個状態。
#     a.任意制作一個状態名。
#        例)敵意減、敵対心下降等
#      b.状態解除条件設定最短解除。
#        例)自動解除時間:回合完結時
#            継続回合数:0 ~ 0
#      c.把信息設定自方隊員得到這状態。
#        例)から敵対心を盗んだ。
#   ②在資料庫制作以下的轉移敵対心的技能。
#      a.効果範囲:設定成自方隊員単体。
#      b.使用可能時:設定成戦鬥時。
#      c.使用効果設定成付加①所作成状態。
#     d.附註成盗取敵対心。数値為盗取敵対心的比例(%)。
#         例)盗取敵対心50%。
#             <盗む敵対心 50>
#------------------------------------------------------------------------------
#  ■ 使用方法 -三-
#   ◆目の前のパーティメンバーに敵対心をなすり付けるスキルを作る。
#     ※並び順にて使用者の直前の生存メンバーが対象になります。
#   ①データベースでステートを以下のように作成します。
#     a.名前に“だまし討ち”が含まれるステートを作成します。
#      b.ステートの解除条件を以下のように設定します。
#        例)自動解除のタイミング:行動終了時
#            継続ターン数:1 ~ 1
#      c.この状態jaが解除されたときのメッセージを設定します。
#        例)は、だまし討ちの効果がきれた。
#   ②データベースでだまし討ちステートを付加するスキルを作成します。
#      a.効果範囲:使用者 に設定します。
#      b.使用可能時:バトルのみ に設定します。
#      c.使用効果に①で作ったステート付加を設定します。
#------------------------------------------------------------------------------
#  ■ 使用方法 -四-
#   ◆設定被傷害時敵対心下降的特徴。
#   ・装備、状態等的附註進行以下的設定。
#      例)敵対心減少量10%下降。
#          <敵対心減少量-10>
#       ※各装備、技能効果可累積。
#   ◆設定技能/道具使用時敵対心上升量減小的特徴。
#   ・装備、状態等的附註進行以下的設定。
#      例)敵対心上昇量50%低下(半減)。
#          <敵対心上昇量-50>
#       ※各装備、技能効果可累積。
#==============================================================================

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 敵対心の上限の設定
  #--------------------------------------------------------------------------
  # 累積ヘイトの上限
  MAX_HATE = 99999999

  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :hat                      # ヘイト
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化 ※エイリアス
  #--------------------------------------------------------------------------
  alias enmity_initialize initialize
  def initialize
    enmity_initialize
    @hat = 0
  end
  #--------------------------------------------------------------------------
  # ● だまし討ちのステート ID を取得
  #--------------------------------------------------------------------------
  def damashi_state_id
    $data_states.find {|state| return state.id if state.name.include?("だまし討ち") if state != nil}
  end
end

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● 敵対心減少量を取得
  #--------------------------------------------------------------------------
  def hate_down_depth
    /<敵対心減少量-(\d+)>/ =~ note ? $1.to_i * 0.01 : 0
  end
  #--------------------------------------------------------------------------
  # ● 敵対心上昇量を取得
  #--------------------------------------------------------------------------
  def hate_up_depth
    /<敵対心上昇量-(\d+)>/ =~ note ? $1.to_i * 0.01 : 0
  end
end

class RPG::UsableItem
  #--------------------------------------------------------------------------
  # ● メモから敵対心を取得
  #--------------------------------------------------------------------------
  def add_hate
    /<敵対心\s*(\S+)>/ =~ note ? $1.to_i : 0
  end
  #--------------------------------------------------------------------------
  # ● メモから盗む敵対心を取得
  #--------------------------------------------------------------------------
  def steal_hate
    /<盗む敵対心\s*(\d+)>/ =~ note ? $1.to_i : 0
  end
end

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● ヘイトのクリア
  #--------------------------------------------------------------------------
  def clear_hate
    self.hat = 0
  end
  #--------------------------------------------------------------------------
  # ● 戦闘不能になる ※エイリアス
  #--------------------------------------------------------------------------
  alias enmity_die die
  def die
    enmity_die
    clear_hate
  end
  #--------------------------------------------------------------------------
  # ● ヘイトの処理
  #--------------------------------------------------------------------------
  def execute_enmity(user, item)
    item.add_hate < 0 ? user.hat *= (item.add_hate * -0.01) : user.hat += item.add_hate
    if user.state?(damashi_state_id)
      ta_target = $game_party.alive_members.index(user) -1
      ta_target = 0 if ta_target < 1
      $game_party.alive_members[ta_target].hat += @result.hp_damage.abs
    else
      user.hat += @result.hp_damage.abs * (1 - user.hate_up_plus)
    end
    self.hat -= @result.hp_damage * (1 - self.hate_down_plus) if @result.hp_damage > 0
    if item.steal_hate > 0
      steal_hates = self.hat * (item.steal_hate * 0.01)
      user.hat += steal_hates
      self.hat -= steal_hates
    end
    user.hat = MAX_HATE if user.hat > MAX_HATE
    self.hat = 0 if self.hat < 0
  end
  #--------------------------------------------------------------------------
  # ● スキル/アイテムの使用者側への効果 ※エイリアス
  #--------------------------------------------------------------------------
  alias enmity_item_user_effect item_user_effect
  def item_user_effect(user, item)
    enmity_item_user_effect(user, item)
    execute_enmity(user, item)
  end
  #--------------------------------------------------------------------------
  # ● 戦闘開始処理 ※エイリアス
  #--------------------------------------------------------------------------
  alias enmity_on_battle_start on_battle_start
  def on_battle_start
    enmity_on_battle_start
    clear_hate
  end
  #--------------------------------------------------------------------------
  # ● 敵対心減少量の合計
  #--------------------------------------------------------------------------
  def hate_down_plus
    feature_objects.inject(0.0){|r,i| r + i.hate_down_depth}
  end
  #--------------------------------------------------------------------------
  # ● 敵対心上昇量の合計
  #--------------------------------------------------------------------------
  def hate_up_plus
    feature_objects.inject(0.0){|r,i| r + i.hate_up_depth}
  end
end

class Game_Unit
  #--------------------------------------------------------------------------
  # ● タゲを取得
  #--------------------------------------------------------------------------
  def top_hat
    if hat_sum > 0
      alive_members.sort {|a,b| b.hat * b.tgr - a.hat * a.tgr}[0]
    else
      random_target
    end
  end
  #--------------------------------------------------------------------------
  # ● ヘイトの合計を計算
  #--------------------------------------------------------------------------
  def hat_sum
    alive_members.inject(0) {|r, member| r + member.hat }
  end
  #--------------------------------------------------------------------------
  # ● ターゲットのランダムな決定(敵対心無視)
  #--------------------------------------------------------------------------
  def random_target_true
    return alive_members[rand(alive_members.size)]
  end
end

class Game_Action
  #--------------------------------------------------------------------------
  # ● 敵に対するターゲット ※再定義
  #--------------------------------------------------------------------------
  def targets_for_opponents
    if item.for_random?
      Array.new(item.number_of_targets) { opponents_unit.random_target_true }
    elsif item.for_one?
      num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
      if @target_index < 0
        [opponents_unit.top_hat] * num
      else
        [opponents_unit.smooth_target(@target_index)] * num
      end
    else
      opponents_unit.alive_members
    end
  end
end
[/pre]

球帮忙看看这两个脚本是哪里冲突了.zip

1.44 MB, 下载次数: 73

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

本版积分规则

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

在本版发帖返回顶部