Project1

标题: 请教如何扩展攻击范围 [打印本页]

作者: morningboo    时间: 2014-10-7 19:46
标题: 请教如何扩展攻击范围
原版里的攻击范围如何通过备注来达到指定攻击对象的效果,比如敌人有6人,排成两排,此攻击范围可以通过备注来达到只攻击1,2号或者只攻击1,2,3号敌人?
作者: taroxd    时间: 2014-10-7 20:17
思路如下。忙着暴走没空写代码出来了= =

  1. class Game_Action
  2.   # 给原来的 targets_for_opponents 一个别名
  3.   alias tfo_20141007 targets_for_opponents
  4.   # 覆盖定义
  5.   def targets_for_opponents
  6.     if item.备注上指定了攻击对象?
  7.       指定的攻击对象
  8.     else
  9.       tfo_20141007 # 返回原来的攻击对象
  10.     end
  11.   end
  12. end
复制代码

作者: morningboo    时间: 2014-10-7 21:13
taroxd 发表于 2014-10-7 20:17
思路如下。忙着暴走没空写代码出来了= =

本人是脚本新新新新手,思路明白可是写不出来,还是请大神空了写个完整代码出来吧
唉,天资愚笨,还请见谅

作者: 3106345123    时间: 2014-10-8 16:11
让攻击有范围的脚本
作者: morningboo    时间: 2014-10-8 20:57
本帖最后由 morningboo 于 2014-10-8 21:24 编辑
3106345123 发表于 2014-10-8 16:11
让攻击有范围的脚本


大神好牛,这个好华丽,感谢大神,谢谢!先仔细研究下,其实我只是想要其中的攻击范围的部分,请问是不是MOG_Scope_EX这个脚本?
作者: tseyik    时间: 2014-10-8 23:00
本帖最后由 tseyik 于 2014-10-8 23:03 编辑

前後列システム導入スクリプト ver0.52
  1. #--------------------------------------------------------------------------
  2. # ★ 前後列システム導入スクリプト ver0.52 - 解像度640x480対応版 (Jun.A)
  3. #--------------------------------------------------------------------------
  4. =begin

  5.   戦闘に前列・後列の概念を与えるスクリプトです。
  6.   設定した位置によって物理攻撃のダメージが変動します。
  7.   
  8.   メニューの並び替え中に、隊列を変更せずにもう一度決定ボタンを押すと、
  9.   前列なら後列、後列なら前列に切り替わります。
  10.   
  11.   色々上書きして使用しますので、競合確率が高めです。
  12.   なるべく最後の方にコピペしてご利用ください。
  13.   
  14.   <BATTLER_RANKSモジュールについて>
  15.   
  16.     DAMAGE_BACK_ROW_NUMBER:指定値として使用します。(説明は後述)、
  17.     ADD_STATE_CHECK       :隊列変更時にステートを付着するかどうかです。
  18.                             デフォルトはfalseです。付着しません。
  19.     ROW_STATE_NUMBER      :上記をtrueにした際に付着させるステートIDの値です。
  20.                 デフォルト値は即死です。
  21.     DEBUG                 :コンソールに状態を表示。制作用なので利用は非推奨です。
  22.   
  23.    
  24.   □ 前列

  25.     ・敵の後列に物理攻撃する際、ダメージ/指定値されます。
  26.    
  27.    ・敵の後列からの物理攻撃を、ダメージ/指定値されます。
  28.   
  29.   □ 後列
  30.   
  31.    ・敵の前列に物理攻撃する際、ダメージ/指定値されます。
  32.    ・敵の後列に物理攻撃する際、ダメージ/指定値/指定値されます。
  33.   
  34.    ・敵の前列からの物理攻撃を、ダメージ/指定値されます。
  35.    ・敵の後列からの物理攻撃を、ダメージ/指定値/指定値されます。
  36.   
  37.   □ 前列・後列無視攻撃
  38.   
  39.    武器、スキル、クラスのメモ欄に <貫通> と書くと、個別に効果を発揮します。
  40.    優先順位は クラス>スキル>武器 です。
  41.   
  42.    武器はequip[0]のみ認識します。
  43.    敵の場合、使用するスキルに <貫通> と書けばそのスキル毎に無視攻撃になります。
  44.   
  45.   <注意>
  46.   
  47.    ・ゲームの戦闘に参加可能な最大パーティ人数を、
  48.       モジュールのPARTY_NUMBERに入力してください。
  49.     ・必中、魔法、回復ダメージは上記の計算を無視します。
  50.     ・混乱ステートが付着している場合、上記の計算を無視します。
  51.    ・上記の計算はクリティカル等全ての計算を行った後に実行されます。
  52.   
  53.    ・現在の状況は下記のスクリプトを打ち込むと呼び出すことが可能です。
  54.       アクセサで管理しているので、自由に書き換える事が可能です。
  55.       falseが前列、trueが後列です。
  56.   
  57.     $game_party.members[index].row  //indexは整数0より開始、0が隊列1番目
  58.   
  59.     例) $game_party.members[0].row = true //隊列1番目のアクターを後列にします
  60.       $game_party.members[0].row    //現状の値を取得します。
  61.   
  62.   ・現状(ver0.50現在)、敵側にも隊列の概念が含まれていますが、
  63.    戦闘で使用する設定を付けていませんので、未実装です。

  64. =end

  65. module BATTLER_RANKS
  66.   PARTY_NUMBER           = 4      # パーティ最大人数設定(デフォルト:4)
  67.   DAMAGE_BACK_ROW_NUMBER = 2      # 後列時に除算するための指定値 (デフォルト:2)
  68.   ADD_STATE_CHECK        = false  # 前列/後列 変更時、ステートを付着するか
  69.   ROW_STATE_NUMBER       = 1      # 上記で付着する指定ステート
  70.   DEBUG                  = false  # デバッグ用フラグ
  71. end

  72. class Game_BattlerBase
  73.   #--------------------------------------------------------------------------
  74.   # ● 公開インスタンス変数
  75.   #--------------------------------------------------------------------------
  76.   attr_accessor :row  #前列(false)か、後列(true)か
  77.   #--------------------------------------------------------------------------
  78.   # ● オブジェクト初期化(エイリアス)
  79.   #--------------------------------------------------------------------------
  80.   alias sss01_old_initialize initialize
  81.   def initialize
  82.     sss01_old_initialize
  83.     @row = false  #隊列の初期化(前列にする)
  84.   end
  85. end

  86. #====================================================
  87. # 混乱しておらず・物理攻撃である場合、
  88. # 敵・味方別処理で後列ダメージを指定値 除算する
  89. class Game_Battler
  90.   #--------------------------------------------------------------------------
  91.   # ● ダメージ計算(上書き)
  92.   #--------------------------------------------------------------------------
  93.   def make_damage_value(user, item)
  94.     penetration = false # 貫通フラグの初期化
  95.    
  96.     # 使い手がアクターなら装備・スキル・クラスのメモに<貫通>と書いてあれば、
  97.     # penetration(貫通)をtrueにする。クラス・スキル・装備の順に優先される。  
  98.     if user.actor? && user.equips[0] != nil
  99.       penetration = true if user.equips[0].note.include?("<貫通>")
  100.       penetration = true if item.note.include?("<貫通>")
  101.       penetration = true if user.class.note.include?("<貫通>")
  102.     else
  103.     # 使い手が敵ならスキルのメモに<貫通>と書いてあれば、貫通をtrueにする。
  104.       penetration = true if item.note.include?("<貫通>")
  105.     end
  106.     #-オリジナルの計算式------------------------------------
  107.     value = item.damage.eval(user, self, $game_variables)
  108.     value *= item_element_rate(user, item)
  109.     value *= pdr if item.physical?
  110.     value *= mdr if item.magical?
  111.     value *= rec if item.damage.recover?
  112.     value = apply_critical(value) if @result.critical
  113.     value = apply_variance(value, item.damage.variance)
  114.     value = apply_guard(value)
  115.     #-------------------------------------------------------
  116.    
  117.     # 物理攻撃?(魔法と回復は無視) または混乱しているなら、物理でも処理を無視
  118.     unless user.confusion?
  119.       if item.physical?
  120.         unless penetration  # 貫通フラグがfalseなら最終計算を行う
  121.           # 使い手が後列なら、計算結果を指定した値で割る
  122.           value /= BATTLER_RANKS::DAMAGE_BACK_ROW_NUMBER if user.row
  123.           # 使い手がアクターか?
  124.           if user.actor?
  125.             # 目標の敵が後列なら、計算結果を指定した値で割る
  126.             value /= BATTLER_RANKS::DAMAGE_BACK_ROW_NUMBER if $game_troop.members[@index].row
  127.           elsif user.enemy? # 敵
  128.             # indexにダメージを食らう味方と適合するパーティID(0~3)を入れる
  129.             index = target_actor_index(@actor_id)
  130.             p "敵" if BATTLER_RANKS::DEBUG
  131.             p index if BATTLER_RANKS::DEBUG
  132.             p $game_party.members[index].name if BATTLER_RANKS::DEBUG
  133.             #p $game_party.members[@last_target_index].name
  134.             # 目標のアクターが後列なら、計算結果を指定した値で割る
  135.             value /= BATTLER_RANKS::DAMAGE_BACK_ROW_NUMBER if $game_party.members[index].row
  136.           end
  137.         end
  138.       end
  139.     end
  140.    
  141.     #-オリジナルの計算結果----------------------------------
  142.     @result.make_damage(value.to_i, item)
  143.     #-------------------------------------------------------
  144.   end
  145.   
  146.   #--------------------------------------------------------------------------
  147.   # ○ 敵の攻撃のターゲットになっているアクターIDから、
  148.   #  ターゲットのアクターを割り出す(新規)
  149.   #--------------------------------------------------------------------------
  150.   def target_actor_index(actor_id)
  151.     p actor_id if BATTLER_RANKS::DEBUG
  152.     n = 0
  153.     target_actor = 0  #パーティメンバー番号初期化
  154.     for n in 0..BATTLER_RANKS::PARTY_NUMBER #サーチ
  155.       next if $game_party.members[n] == nil
  156.       p $game_party.members[n].name if BATTLER_RANKS::DEBUG
  157.       p $game_party.members[n].id   if BATTLER_RANKS::DEBUG
  158.       # ターゲットのアクターIDとパーティに参加しているアクターのIDが同じなら、
  159.       # nの値をパーティメンバー番号に。(補足:アクターID ≠ パーティメンバー番号)
  160.       target_actor = n if $game_party.members[n].id == actor_id
  161.     end
  162.     p target_actor if BATTLER_RANKS::DEBUG
  163.     return target_actor
  164.   end
  165. end

  166. #========================================================================
  167. # パーティ並び替え時、キャラそのままで決定すると前列/後列が切り替えられる
  168. class Scene_Menu
  169.   #--------------------------------------------------------------------------
  170.   # ● 並び替え[決定]@states(上書き)
  171.   #--------------------------------------------------------------------------
  172.   def on_formation_ok
  173.     # デバッグ用
  174.     p $game_party.members[@status_window.index].name if BATTLER_RANKS::DEBUG
  175.     p $game_party.members[@status_window.pending_index].name if BATTLER_RANKS::DEBUG

  176.     if @status_window.pending_index >= 0
  177.       $game_party.swap_order(@status_window.index,
  178.                              @status_window.pending_index)
  179.       
  180.       formation_state_check #新規追加 // 並び替え [決定]時のステートチェック
  181.       @status_window.pending_index = -1
  182.       @status_window.redraw_item(@status_window.index)
  183.     else
  184.       @status_window.pending_index = @status_window.index
  185.     end
  186.     @status_window.activate
  187.   end
  188.   #--------------------------------------------------------------------------
  189.   # ● 並び替え [決定]時のステートチェック(新規)
  190.   #    trueならステート解除、falseならステート不可。
  191.   #--------------------------------------------------------------------------
  192.   def formation_state_check
  193.     if @status_window.index == @status_window.pending_index
  194.       if $game_party.members[@status_window.index].row
  195.         $game_party.members[@status_window.index].row = false
  196.         if BATTLER_RANKS::ADD_STATE_CHECK
  197.           $game_party.members[@status_window.index].remove_state(BATTLER_RANKS::ROW_STATE_NUMBER)
  198.         end
  199.       else
  200.         $game_party.members[@status_window.index].row = true
  201.         if BATTLER_RANKS::ADD_STATE_CHECK
  202.           $game_party.members[@status_window.index].add_new_state(BATTLER_RANKS::ROW_STATE_NUMBER)
  203.         end
  204.       end
  205.       # デバッグ//rowの状態を出力
  206.       p $game_party.members[@status_window.index].row if BATTLER_RANKS::DEBUG
  207.     end
  208.   end
  209. end

  210. #====================================================
  211. # メニューのステータス部の顔グラフィックを、
  212. # 指定アクターが前列・後列かどうかによって前後させる
  213. class Window_MenuStatus
  214.   #--------------------------------------------------------------------------
  215.   # ● 項目の描画 (メニュー・ステータス部 名前以降の位置調整、上書き)
  216.   #--------------------------------------------------------------------------
  217.   def draw_item(index)
  218.     actor = $game_party.members[index]
  219.     enabled = $game_party.battle_members.include?(actor)
  220.     rect = item_rect(index)
  221.     draw_item_background(index)
  222.     # 前列ならデフォルト配置、後列ならxを15右にずらす。
  223.     if actor.row
  224.       #デフォルトは  rect.x + 1、rect.y + 1。顔グラフィックの座標をずらす。
  225.       draw_actor_face(actor, rect.x + 4 + 15, rect.y + 8, actor.alive?)#enabled)
  226.     else
  227.       draw_actor_face(actor, rect.x + 4, rect.y + 8, actor.alive?)
  228.     end
  229.     draw_actor_simple_status(actor, rect.x + 108, rect.y + line_height / 4)
  230.   end
  231. end
复制代码
敵方未實裝
作者: morningboo    时间: 2014-10-9 21:46
tseyik 发表于 2014-10-8 23:00
前後列システム導入スクリプト ver0.52敵方未實裝

感谢指点,仔细研究中!




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