Project1

标题: RTAB战斗脚本中伤害分段显示的问题,求教。紧急。。 [打印本页]

作者: Mr.Faint    时间: 2011-1-9 18:52
标题: RTAB战斗脚本中伤害分段显示的问题,求教。紧急。。
本帖最后由 fux2 于 2011-1-9 20:02 编辑

其他的技能,应该说其他的动画都无法多段显示伤害,但是内置的“千裂斩”就可以,实在不知道怎么回事。加上脚本都是日文,根本看不懂。。。
有一个计算脚本和一个显示脚本。给位帮忙看看,或者帮我整合一下彩虹神剑和RTAB战斗脚本。。。两者应该是可以共存的吧?
总之我就是想让伤害多段显示和RTAB战斗模式一起。。。



显示部分:
  1. ==============================================================================
  2. #RTAB观光游第六站,连击效果+连击数显示 (显示部分)
  3. #==============================================================================
  4. # ▼▲▼ XRXS_BP19. コンボ表示+ヒットボーナス ver.3β ▼▲▼ built 201409
  5. # by 桜雅 在土

  6. #==============================================================================
  7. # □ カスタマイズポイント
  8. #==============================================================================
  9. class XRXS_BP19
  10.   #
  11.   # コンボ持続時間[単位:F](40F が 一秒)
  12.   #
  13.   COMBOHIT_DURATION = 90
  14.   #
  15.   # スキン ファイル名
  16.   #
  17.   SKIN_NUMBER = "SixRice_Number.png"
  18.   SKIN_HIT    = "SixRice_HITS.png"
  19. end
  20. class Game_Battler
  21.   #
  22.   # コンボヒットによるダメージ補正力/ヒット数[単位:%]
  23.   #
  24.   DAMAGE_INCREASE_PER_HIT = 1
  25. end
  26. #==============================================================================
  27. # --- XRXS.ナンバースプライト スキン対応!  ---
  28. #==============================================================================
  29. class NumberSprite
  30.   #--------------------------------------------------------------------------
  31.   # ○ オブジェクト初期化
  32.   #--------------------------------------------------------------------------
  33.   def initialize(skin)
  34.     @skin = skin
  35.     @sprites = []
  36.     @width  = skin.width/10
  37.     @height = skin.height
  38.     set_digit(4) # 基本設定値
  39.     set(0)
  40.   end
  41.   #--------------------------------------------------------------------------
  42.   # ○ 桁の設定
  43.   #--------------------------------------------------------------------------
  44.   def set_digit(digit)
  45.     @sprites.each{|sprite| sprite.dispose}
  46.     @sprites.clear
  47.     digit.times do
  48.       sprite = Sprite.new
  49.       sprite.bitmap = @skin
  50.       sprite.z = 999
  51.       sprite.src_rect.set(0, 0, @width, @height)
  52.       @sprites.push(sprite)
  53.     end
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ○ 値の設定
  57.   #--------------------------------------------------------------------------
  58.   def set(number)
  59.     # 例外補正 0.17b更新
  60.     digit = (number ==0) ? 0 : Math.log10(number)
  61.     if digit > @sprites.size
  62.       set_digit(digit)
  63.     end
  64.     # 各桁の適用
  65.     for sprite in @sprites
  66.       sprite.src_rect.x = number%10 * @width
  67.       number /= 10
  68.     end
  69.     # ゼロ表示 上から判定し、一度でも 0 でなければそこから表示
  70.     zero_display = false
  71.     for sprite in @sprites.reverse
  72.       zero_display |= (sprite.src_rect.x != 0)
  73.       sprite.visible = zero_display
  74.     end
  75.   end
  76.   #--------------------------------------------------------------------------
  77.   # ○ 座標などの設定の経由
  78.   #--------------------------------------------------------------------------
  79.   def x=(n)
  80.     @sprites.each{|sprite|
  81.       sprite.x = n
  82.       n -= @width
  83.     }
  84.   end
  85.   def y=(n)
  86.     @sprites.each{|sprite| sprite.y = n }
  87.   end
  88.   def opacity=(n)
  89.     @sprites.each{|sprite| sprite.opacity = n }
  90.   end
  91.   def dispose
  92.     @sprites.each{|sprite| sprite.dispose }
  93.   end
  94. end

  95. #==============================================================================
  96. # □ Window_ComboHit
  97. #------------------------------------------------------------------------------
  98. #     戦闘中にコンボ数を表示する透明なウィンドウです。
  99. #==============================================================================
  100. class Window_ComboHit < Window_Base
  101.   #--------------------------------------------------------------------------
  102.   # ○ オブジェクト初期化
  103.   #--------------------------------------------------------------------------
  104.   def initialize
  105.     @number = NumberSprite.new(RPG::Cache.windowskin(XRXS_BP19::SKIN_NUMBER))
  106.      super(200, 80, 200, 80)
  107.     self.opacity = 0
  108.     self.z = 999
  109.     self.visible = false
  110.     self.contents = RPG::Cache.windowskin(XRXS_BP19::SKIN_HIT).dup
  111.     @active = false
  112.     @show_duration = 0
  113.     @sliding_duration = 0
  114.   end
  115.   #--------------------------------------------------------------------------
  116.   # ○ クリア ほか
  117.   #--------------------------------------------------------------------------
  118.   def clear
  119.     self.visible = false
  120.   end
  121.   def x=(n)
  122.     super
  123.     @number.x = n if @number != nil
  124.   end
  125.   def y=(n)
  126.     super
  127.     @number.y = n if @number != nil
  128.   end
  129.   def contents_opacity=(n)
  130.     super
  131.     @number.opacity = n if @number != nil
  132.   end
  133.   def dispose
  134.     @number.dispose
  135.     super
  136.   end
  137.   #--------------------------------------------------------------------------
  138.   # ○ リフレッシュ
  139.   #--------------------------------------------------------------------------
  140.   def refresh(hit_combo, duration)
  141.     # 可視化
  142.     self.contents_opacity = 255
  143.     self.visible = true
  144.     # 設定
  145.     @show_duration    = duration
  146.     @sliding_duration = 0
  147.     # 描写
  148.     @number.set(hit_combo)
  149.   end
  150.   #--------------------------------------------------------------------------
  151.   # ○ フレーム更新
  152.   #--------------------------------------------------------------------------
  153.   def update
  154.     if @sliding_duration > 0
  155.       @sliding_duration -= 1
  156.       self.contents_opacity -= 32
  157.       self.x += 1
  158.       if @sliding_duration == 0
  159.         self.visible = false
  160.       end
  161.     elsif @show_duration > 0
  162.       @show_duration -= 1
  163.       if @show_duration == 0
  164.         @sliding_duration = 8
  165.       end
  166.     end
  167.   end
  168. end





  169. 计算部分:

  170. #==============================================================================
  171. #RTAB观光游第六站,连击效果+连击数显示 (计算部分)
  172. #==============================================================================
  173. # 連撃 Ver 1.03
  174. # 配布元・サポートURL
  175. # [url]http://members.jcom.home.ne.jp/cogwheel/[/url]

  176. #==============================================================================
  177. # ■ Scene_Battle (分割定義 4)
  178. #------------------------------------------------------------------------------
  179. #  バトル画面の処理を行うクラスです。
  180. #==============================================================================
  181. # アニメに強さ0のフラッシュが存在した場合、
  182. # 赤:倍率 緑:+スキル・アイテムID でダメージ計算を行う。
  183. #
  184. # 连击数,每次伤害比率如何设置,参考动画“千裂斩”

  185. class Scene_Battle
  186. attr_reader :skill#到此一游
  187. #--------------------------------------------------------------------------
  188. # ● ATB基礎セットアップ
  189. #--------------------------------------------------------------------------
  190.   alias :atb_setup_straight :atb_setup
  191.   def atb_setup
  192.     atb_setup_straight
  193.     for battler in $game_party.actors + $game_troop.enemies
  194.       battler.total_damage = {}
  195.     end
  196.   end
  197. #--------------------------------------------------------------------------
  198. # ● アクション更新 (メインフェーズ)
  199. #--------------------------------------------------------------------------
  200.   def action_phase(battler)
  201.     while true
  202.       # action が 1 の場合、バトラーが行動中かどうか確認
  203.       if @action == 1 and battler.phase < 3
  204.         for target in battler.target
  205.           speller = synthe?(target)
  206.           if speller == nil
  207.             # ターゲットが通常行動中の場合
  208.             if @action_battlers.include?(target)
  209.               if target.phase > 2
  210.                 return
  211.               end
  212.             end
  213.           else
  214.             # ターゲットが連携スキル発動中の場合
  215.             for spell in speller
  216.               if @action_battlers.include?(spell)
  217.                 if spell.phase > 2
  218.                   return
  219.                 end
  220.               end
  221.             end
  222.           end
  223.         end
  224.       end
  225.       case battler.phase
  226.       when 1
  227.         update_phase4_step1(battler)
  228.       when 2
  229.         update_phase4_step2(battler)
  230.       when 3
  231.         update_phase4_step3(battler)
  232.       when 4
  233.         update_phase4_step4(battler)
  234.       when 5
  235.         update_phase4_step5(battler)
  236.       when 6
  237.         update_phase4_step6(battler)
  238.       end
  239.       # ウェイトが入った場合
  240.       if battler.wait > 0
  241.         # ウェイトカウントを減らして終了
  242.         battler.wait -= 1
  243.         break
  244.       end
  245.       # 行動終了した場合ループを抜ける
  246.       unless @action_battlers.include?(battler)
  247.         break
  248.       end
  249.     end
  250.   end
  251.   #--------------------------------------------------------------------------
  252.   # ● フレーム更新 (メインフェーズ ステップ 1 : アクション準備)
  253.   #--------------------------------------------------------------------------
  254.   def update_phase4_step1(battler)
  255.     # すでに戦闘から外されている場合
  256.     if battler.index == nil
  257.       @action_battlers.delete(battler)
  258.       anime_wait_return
  259.       battler.wait = 1
  260.       return
  261.     end
  262.     speller = synthe?(battler)
  263.     if speller == nil
  264.       # ダメージ食らい中の場合
  265.       unless battler.damage.empty? or @action > 2
  266.         battler.wait = 1
  267.         return
  268.       end
  269.       # 行動可能かどうか判定
  270.       unless battler.movable?
  271.         battler.phase = 6
  272.         return
  273.       end
  274.     else
  275.       # ダメージ食らい中の場合
  276.       for spell in speller
  277.         unless spell.damage.empty? or @action > 2
  278.           battler.wait = 1
  279.           return
  280.         end
  281.         # 行動可能かどうか判定
  282.         unless spell.movable?
  283.           battler.phase = 6
  284.           return
  285.         end
  286.       end
  287.     end
  288.     # スキル使用時、詠唱時間設定
  289.     # 強制アクションかつ @force が 2 の時はスキルを即時発動
  290.     if battler.current_action.kind == 1 and
  291.       (not battler.current_action.forcing or @force != 2)
  292.       if battler.rtp == 0
  293.         # スキル詠唱中ならば、解除
  294.         skill_reset(battler)
  295.         # スキル詠唱時間設定
  296.         recite_time(battler)
  297.         # 連携技設定
  298.         synthe_spell(battler)
  299.         # スキルを詠唱する場合
  300.         if battler.rtp > 0
  301.           # 強制アクションかつ @force が 1 の時は連携スキルのみ即時発動
  302.           speller = synthe?(battler)
  303.           if battler.current_action.forcing and @force > 0 and speller != nil
  304.             for spell in speller
  305.               spell.rt = spell.rtp
  306.             end
  307.           else
  308.             battler.blink = true
  309.             if battler.current_action.forcing
  310.               $game_temp.forcing_battler = nil
  311.               battler.current_action.forcing = false
  312.             end
  313.             @action_battlers.delete(battler)
  314.             return
  315.           end
  316.         end
  317.       end
  318.     end
  319.     # アクターの明滅エフェクト OFF
  320.     if battler != nil
  321.       battler.blink = false
  322.     end
  323.     speller = synthe?(battler)
  324.     if speller == nil
  325.       @spell_p.delete(battler)
  326.       @spell_e.delete(battler)
  327.     else
  328.       for spell in speller
  329.         spell.blink = false
  330.         @spell_p.delete(spell)
  331.         @spell_e.delete(spell)
  332.       end
  333.     end
  334.     # ステップ 2 に移行
  335.     battler.phase = 2
  336.   end
  337.   #--------------------------------------------------------------------------
  338.   # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  339.   #--------------------------------------------------------------------------
  340.   def update_phase4_step2(battler)
  341.     # 強制アクションでなければ
  342.     unless battler.current_action.forcing
  343.       # 制約が [敵を通常攻撃する] か [味方を通常攻撃する] の場合
  344.       if battler.restriction == 2 or battler.restriction == 3
  345.         # アクションに攻撃を設定
  346.         battler.current_action.kind = 0
  347.         battler.current_action.basic = 0
  348.       end
  349.     end
  350.     # アクションの種別より攻撃アニメーションを取得する
  351.     case battler.current_action.kind
  352.     when 0 # 基本
  353.       if battler.is_a?(Game_Actor)
  354.         base_id = battler.weapon_id
  355.       end
  356.       anime_id = battler.animation2_id
  357.       # 防御など特殊行動の場合は次のステップへ
  358.       unless make_basic_action_preparation(battler)
  359.         return
  360.       end
  361.       # 戦闘が終了した場合は行動をキャンセル
  362.       if fin?
  363.         battler.phase = 6
  364.         return
  365.       end
  366.     when 1 # スキル
  367.       base_id = battler.current_action.skill_id
  368.       anime_id = $data_skills[battler.current_action.skill_id].animation2_id
  369.       # スキルが使用できない場合は行動をキャンセル
  370.       unless make_skill_action_preparation(battler)
  371.         return
  372.       end
  373.       # 戦闘が終了した場合は行動をキャンセル
  374.       if fin? and $data_skills[anime_id].scope == 1..2
  375.         battler.phase = 6
  376.         return
  377.       end
  378.     when 2 # アイテム
  379.       base_id = battler.current_action.item_id
  380.       anime_id = $data_items[battler.current_action.item_id].animation2_id
  381.       # アイテムが使用できない場合は行動をキャンセル
  382.       unless make_item_action_preparation(battler)
  383.         return
  384.       end
  385.       # 戦闘が終了した場合は行動をキャンセル
  386.       if fin? and $data_items[anime_id].scope == 1..2
  387.         battler.phase = 6
  388.         return
  389.       end
  390.     end
  391.     # アニメーションを検索し、連撃性を変数serialに代入する
  392.     serial = []
  393.     frame = 0
  394.     if $data_animations[anime_id] != nil
  395.       for animation in $data_animations[anime_id].timings
  396.         color = animation.flash_color
  397.         # アニメーション・フラッシュの強さが0の場合
  398.         if color.alpha == 0
  399.           serial.push([color.red.to_i, color.green, animation.frame - frame])
  400.           frame = animation.frame
  401.         end
  402.       end
  403.       # 連撃性がない場合単発攻撃
  404.       if serial.empty?
  405.         serial = [[20, 100, $data_animations[anime_id].frame_max - 5]]
  406.       end
  407.     else
  408.       # アニメーションが存在しない場合
  409.       serial = [[20, 100, 0]]
  410.     end
  411.     # ハッシュ total_damage の作成
  412.     total_damage = {}
  413.     for target in battler.target
  414.       total_damage[target] = []
  415.     end
  416.     # 連撃回数分ダメージ計算を行う
  417.     for attack in serial
  418.       # アクションの種別で分岐
  419.       case battler.current_action.kind
  420.       when 0  # 基本
  421.         if battler.is_a?(Game_Actor)
  422.           # バトラーがアクターの場合、攻撃時に武器を変更する
  423.           battler.change_weapon(base_id + attack[1] - 100)
  424.         end
  425.         make_basic_action_result(battler)
  426.       when 1  # スキル
  427.         # 連携スキルのことを考え、スキルIDの変更は内部処理で行う
  428.         make_skill_action_result(battler, attack[1] - 100)
  429.       when 2  # アイテム
  430.         # アイテムIDを設定分変化させる
  431.         battler.current_action.item_id = base_id + attack[1] - 100
  432.         make_item_action_result(battler)
  433.       end
  434.       # total_damage へダメージを代入
  435.       for target in battler.target
  436.         # ダメージがある場合、ダメージをX/20倍する。
  437.         if target.damage[battler].is_a?(Numeric)
  438.           damage = target.damage[battler] * attack[0] / 20
  439.         else
  440.           damage = target.damage[battler]
  441.         end
  442.         # 回復HP量がある場合、回復HP量をX/20倍する。
  443.         if target.recover_hp[battler].is_a?(Numeric)
  444.           recover_hp = target.recover_hp[battler] * attack[0] / 20
  445.         end
  446.         # 回復SP量がある場合、回復SP量をX/20倍する。
  447.         if target.recover_sp[battler].is_a?(Numeric)
  448.           recover_sp = target.recover_sp[battler] * attack[0] / 20
  449.         end
  450.         critical = target.critical[battler]
  451.         # total_damage = [ダメージ, クリティカルフラグ, 回復HP量, 回復SP量,
  452.         #                 ステート変化, ステート回復, 待ちフレーム時間]
  453.         total_damage[target].push([damage, critical, recover_hp, recover_sp,
  454.           target.state_p[battler], target.state_m[battler], attack[2]])
  455.       end
  456.     end
  457.     # トータルダメージを、バトラーのインスタンスに代入
  458.     for target in battler.target
  459.       target.total_damage[battler] = total_damage[target]
  460.     end
  461.     # 武器・スキル・アイテムIDを通常に戻す
  462.     case battler.current_action.kind
  463.     when 0  # 基本
  464.       if battler.is_a?(Game_Actor)
  465.         battler.change_weapon(base_id)
  466.       end
  467.     when 1  # スキル
  468.       battler.current_action.skill_id = base_id
  469.     when 2  # アイテム
  470.       battler.current_action.item_id = base_id
  471.     end
  472.     if battler.phase == 2
  473.       # ステップ 3 に移行
  474.       battler.phase = 3
  475.     end
  476.   end
  477.   #--------------------------------------------------------------------------
  478.   # ● 基本アクション 準備
  479.   #--------------------------------------------------------------------------
  480.   def make_basic_action_preparation(battler)
  481.     # 攻撃の場合
  482.     if battler.current_action.basic == 0
  483.       # アニメーション ID を設定
  484.       battler.anime1 = battler.animation1_id
  485.       battler.anime2 = battler.animation2_id
  486.       # 行動側バトラーがエネミーの場合
  487.       if battler.is_a?(Game_Enemy)
  488.         if battler.restriction == 3
  489.           target = $game_troop.random_target_enemy
  490.         elsif battler.restriction == 2
  491.           target = $game_party.random_target_actor
  492.         else
  493.           index = battler.current_action.target_index
  494.           target = $game_party.smooth_target_actor(index)
  495.         end
  496.       end
  497.       # 行動側バトラーがアクターの場合
  498.       if battler.is_a?(Game_Actor)
  499.         if battler.restriction == 3
  500.           target = $game_party.random_target_actor
  501.         elsif battler.restriction == 2
  502.           target = $game_troop.random_target_enemy
  503.         else
  504.           index = battler.current_action.target_index
  505.           target = $game_troop.smooth_target_enemy(index)
  506.         end
  507.       end
  508.       # 対象側バトラーの配列を設定
  509.       battler.target = [target]
  510.       return true
  511.     end
  512.     # 防御の場合
  513.     if battler.current_action.basic == 1
  514.       # ステップ 3 に移行
  515.       battler.phase = 3
  516.       return false
  517.     end
  518. #===============0.15b(RTAB官方更新)===========================================   
  519.     # 逃げるの場合
  520.     if battler.is_a?(Game_Enemy) and battler.current_action.basic == 2
  521.       # ステップ 3 に移行
  522.       battler.phase = 3
  523.       return false
  524.     end
  525. #=============================================================================
  526.     # 何もしないの場合
  527.     if battler.current_action.basic == 3
  528.       # ステップ 6 に移行
  529.       battler.phase = 6
  530.       return false
  531.     end
  532.   end
  533.   #--------------------------------------------------------------------------
  534.   # ● スキルアクション 準備
  535.   #--------------------------------------------------------------------------
  536.   def make_skill_action_preparation(battler)
  537.     # スキルを取得
  538.     @skill = $data_skills[battler.current_action.skill_id]
  539.     # 連携スキルであるかどうか確認
  540.     speller = synthe?(battler)
  541.     # 強制アクションでなければ
  542.     unless battler.current_action.forcing
  543.       # SP 切れなどで使用できなくなった場合
  544.       if speller == nil
  545.         unless battler.skill_can_use?(@skill.id)
  546.           # ステップ 6 に移行
  547.           battler.phase = 6
  548.          return false
  549.         end
  550.       end
  551.     end
  552.     # SP 消費
  553.     temp = false
  554.     if speller != nil
  555.       for spell in speller
  556.         if spell.current_action.spell_id == 0
  557.           spell.sp -= @skill.sp_cost
  558.         else
  559.           spell.sp -= $data_skills[spell.current_action.spell_id].sp_cost
  560.         end
  561.         # ステータスウィンドウをリフレッシュ
  562.         status_refresh(spell)
  563.       end
  564.     else
  565.       battler.sp -= @skill.sp_cost
  566.       # ステータスウィンドウをリフレッシュ
  567.       status_refresh(battler)
  568.     end
  569.     # アニメーション ID を設定
  570.     battler.anime1 = @skill.animation1_id
  571.     battler.anime2 = @skill.animation2_id
  572.     # コモンイベント ID を設定
  573.     battler.event = @skill.common_event_id
  574.     # 対象側バトラーを設定
  575.     set_target_battlers(@skill.scope, battler)
  576.     return true
  577.   end
  578.   #--------------------------------------------------------------------------
  579.   # ● アイテムアクション 準備
  580.   #--------------------------------------------------------------------------
  581.   def make_item_action_preparation(battler)
  582.     # アイテムを取得
  583.     @item = $data_items[battler.current_action.item_id]
  584.     # アイテム切れなどで使用できなくなった場合
  585.     unless $game_party.item_can_use?(@item.id)
  586.       # ステップ 6 に移行
  587.       battler.phase = 6
  588.       return false
  589.     end
  590.     # 消耗品の場合
  591.     if @item.consumable
  592.       # 使用したアイテムを 1 減らす
  593.       $game_party.lose_item(@item.id, 1)
  594.     end
  595.     # アニメーション ID を設定
  596.     battler.anime1 = @item.animation1_id
  597.     battler.anime2 = @item.animation2_id
  598.     # コモンイベント ID を設定
  599.     battler.event = @item.common_event_id
  600.     # 対象を決定
  601.     index = battler.current_action.target_index
  602.     target = $game_party.smooth_target_actor(index)
  603.     # 対象側バトラーを設定
  604.     set_target_battlers(@item.scope, battler)
  605.     return true
  606.   end
  607.   #--------------------------------------------------------------------------
  608.   # ● 基本アクション 結果作成
  609.   #--------------------------------------------------------------------------
  610.   def make_basic_action_result(battler)
  611.     # 通常攻撃の効果を適用
  612.     for target in battler.target
  613.       target.attack_effect(battler)
  614.     end
  615.   end
  616.   #--------------------------------------------------------------------------
  617.   # ● スキルアクション 結果作成
  618.   #--------------------------------------------------------------------------
  619.   def make_skill_action_result(battler, plus_id)
  620.     # スキルを取得
  621.     @skill = $data_skills[battler.current_action.skill_id + plus_id]
  622.     # 連携スキルであるかどうか確認
  623.     speller = synthe?(battler)
  624.     # スキルの効果を適用
  625.     for target in battler.target
  626.       if speller != nil
  627.         damage = 0
  628.         effective = false
  629.         state_p = []
  630.         state_m = []
  631.         d_result = false
  632.         for spell in speller
  633.           if spell.current_action.spell_id != 0
  634.             @skill = $data_skills[spell.current_action.spell_id + plus_id]
  635.           end
  636.           effective |= target.skill_effect(spell, @skill)
  637.           if target.damage[spell].class != String
  638.             d_result = true
  639.             damage += target.damage[spell]
  640.           elsif effective
  641.             effect = target.damage[spell]
  642.           end
  643.           state_p += target.state_p[spell]
  644.           state_m += target.state_m[spell]
  645.           target.damage.delete(spell)
  646.           target.state_p.delete(spell)
  647.           target.state_m.delete(spell)
  648.         end
  649.         if d_result
  650.           target.damage[battler] = damage
  651.         elsif effective
  652.           target.damage[battler] = effect
  653.         end
  654.         target.state_p[battler] = state_p
  655.         target.state_m[battler] = state_m
  656.       else
  657.         target.skill_effect(battler, @skill)
  658.       end
  659.     end
  660.   end
  661.   #--------------------------------------------------------------------------
  662.   # ● アイテムアクション 結果作成
  663.   #--------------------------------------------------------------------------
  664.   def make_item_action_result(battler)
  665.     # アイテムを取得
  666.     @item = $data_items[battler.current_action.item_id]
  667.     # アイテムの効果を適用
  668.     for target in battler.target
  669.       target.item_effect(@item, battler)
  670.     end
  671.   end
  672.   #--------------------------------------------------------------------------
  673.   # ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション)
  674.   #--------------------------------------------------------------------------
  675.   def update_phase4_step4(battler)
  676.     # カメラ設定
  677.     if battler.target[0].is_a?(Game_Enemy) and battler.anime1 != 0
  678.       camera_set(battler)
  679.     end
  680.     # 対象側アニメーション
  681.     for target in battler.target
  682.       target.animation.push([battler.anime2,
  683.                                           (target.damage[battler] != "Miss")])
  684.       unless battler.anime2 == 0
  685.         battler.wait = 2 * target.total_damage[battler][0][6] - 1 +
  686.           Graphics.frame_count % 2
  687.       end
  688.     end
  689.     # ステップ 5 に移行
  690.     battler.phase = 5
  691.   end
  692.   #--------------------------------------------------------------------------
  693.   # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  694.   #--------------------------------------------------------------------------
  695.   def update_phase4_step5(battler)
  696.     next_step = true
  697.     # ダメージ表示
  698.     for target in battler.target
  699.       # total_damage より全ダメージを算出
  700.       total_damage = target.total_damage[battler].shift
  701.       target.damage[battler] = total_damage[0]
  702.       target.critical[battler] = total_damage[1]
  703.       target.recover_hp[battler] = total_damage[2]
  704.       target.recover_sp[battler] = total_damage[3]
  705.       target.state_p[battler] = total_damage[4]
  706.       target.state_m[battler] = total_damage[5]
  707.       # ダメージ表示フラグをON
  708.       target.damage_pop[battler] = true
  709.       # 恭喜你发现了连击计算的关键一行!
  710.       target.combohit_count if target.damage[battler].to_i > 0 and target.damage[battler] != "Miss"
  711.       # 実際にダメージを与える
  712. #      target.damage_effect(battler, battler.current_action.kind)
  713.       target.damage_effect(battler, battler.current_action.kind,skill)#到此一游
  714.       # 余計なハッシュを削除
  715.       target.recover_hp.delete(battler)
  716.       target.recover_sp.delete(battler)
  717.       target.state_p.delete(battler)
  718.       target.state_m.delete(battler)
  719.       # ダメージを全て与えきった場合
  720.       if target.total_damage[battler].empty?
  721.         # ターゲットへの全ダメージを削除
  722.         target.total_damage.delete(battler)
  723.         # 指定時間ウェイトする
  724.         battler.wait = @damage_wait
  725.       else
  726.         # 指定時間ウェイトする
  727.         next_step = false
  728.         battler.wait = 2 * target.total_damage[battler][0][6]
  729.       end
  730.       # ステータスウィンドウをリフレッシュ
  731.       status_refresh(target)
  732.     end
  733.     if next_step
  734.       # ステップ 6 に移行
  735.       battler.phase = 6
  736.     end
  737.   end
  738.   #--------------------------------------------------------------------------
  739.   # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
  740.   #--------------------------------------------------------------------------
  741.   def update_phase4_step6(battler)
  742.     # カメラを戻す
  743.     if battler.target[0].is_a?(Game_Enemy) and @camera == battler
  744.       @spriteset.screen_target(0, 0, 1)
  745.     end
  746.     # スキルラーニング
  747.     if battler.target[0].is_a?(Game_Actor) and battler.current_action.kind == 1
  748.       for target in battler.target        
  749.         if target.is_a?(Game_Actor)#(0.16)
  750.         skill_learning(target, target.class_id,
  751.                         battler.current_action.skill_id)
  752.         end #(0.16)               
  753.       end
  754.     end
  755.     # アクション強制対象のバトラーをクリア
  756.     if battler.current_action.forcing == true and
  757.         battler.current_action.force_kind == 0 and
  758.         battler.current_action.force_basic == 0 and
  759.         battler.current_action.force_skill_id == 0
  760.       $game_temp.forcing_battler = nil
  761.       battler.current_action.forcing = false
  762.     end
  763.     refresh_phase(battler)
  764.     speller = synthe?(battler)
  765.     if speller != nil
  766.       for spell in speller
  767.         if spell != battler
  768.           refresh_phase(spell)
  769.         end
  770.       end
  771.       synthe_delete(speller)
  772.     end
  773.     # コモンイベント ID が有効の場合
  774.     if battler.event > 0
  775.       # イベントをセットアップ
  776.       common_event = $data_common_events[battler.event]
  777.       $game_system.battle_interpreter.setup(common_event.list, 0)
  778.     end
  779.     act = 0
  780.     for actor in $game_party.actors + $game_troop.enemies
  781.       if actor.movable?
  782.         act += 1
  783.       end
  784.     end
  785.     if @turn_cnt >= act and act > 0
  786.       @turn_cnt %= act
  787.       $game_temp.battle_turn += 1
  788.       # バトルイベントの全ページを検索
  789.       for index in 0...$data_troops[@troop_id].pages.size
  790.         # イベントページを取得
  791.         page = $data_troops[@troop_id].pages[index]
  792.         # このページのスパンが [ターン] の場合
  793.         if page.span == 1
  794.           # 実行済みフラグをクリア
  795.           $game_temp.battle_event_flags[index] = false
  796.         end
  797.       end
  798.     end
  799.     battler.phase = 1
  800.     @action_battlers.delete(battler)
  801.   end
  802. #//////////////////////////////////////////////////////////////////////////////
  803. #连击数计算的基础部分Part1  by 桜雅 在土
  804. #------------------------------------------------------------------------------
  805. # ● メイン処理
  806. #------------------------------------------------------------------------------
  807.   alias xrxs_bp19_main main
  808.   def main
  809.     # コンボヒットウィンドウを作成
  810.     @combohit_window = Window_ComboHit.new
  811.     # 呼び戻す
  812.     xrxs_bp19_main
  813.     # ウィンドウを解放
  814.     @combohit_window.dispose
  815.     # コンボクリア
  816.     $game_party.actors.each {|actor| actor.combohit_clear}
  817.   end
  818. #------------------------------------------------------------------------------
  819. # ● フレーム更新
  820. #------------------------------------------------------------------------------
  821.   alias xrxs_bp19_update update
  822.   def update
  823.     # フレーム更新
  824.     @combohit_window.update
  825.     $game_party.actors.each {|actor| actor.combohit_update}
  826.     $game_troop.enemies.each{|enemy| enemy.combohit_update}
  827.     # 呼び戻す
  828.     xrxs_bp19_update
  829.   end
  830. #------------------------------------------------------------------------------
  831. # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  832. #------------------------------------------------------------------------------
  833.   alias xrxs_bp19_update_phase4_step5 update_phase4_step5
  834.   def update_phase4_step5(battler)
  835.     # 呼び戻す
  836.     xrxs_bp19_update_phase4_step5(battler)
  837.     # コンボ数の最も高いターゲットを探す
  838.     max = 0
  839.     hit_target = nil
  840.     for target in battler.target
  841.       if target.combohit > max
  842.         max = target.combohit
  843.         hit_target = target
  844.       end
  845.     end
  846.     if max >= 2 and !hit_target.nil?
  847.       @combohit_window.x = hit_target.is_a?(Game_Enemy) ? 512 : 512
  848.       @combohit_window.refresh(max, hit_target.combohit_duration)
  849.     end
  850.   end  
  851. end
  852. #//////////////////////////////////////////////////////////////////////////////
  853. #==============================================================================
  854. # ■ Game_Battler (分割定義 1)
  855. #------------------------------------------------------------------------------
  856. #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ
  857. # スのスーパークラスとして使用されます。
  858. #==============================================================================

  859. class Game_Battler
  860.   #--------------------------------------------------------------------------
  861.   # ● 公開インスタンス変数追加
  862.   #--------------------------------------------------------------------------
  863.   attr_accessor :total_damage              # 総ダメージ
  864.   #--------------------------------------------------------------------------
  865.   # ● オブジェクト初期化
  866.   #--------------------------------------------------------------------------
  867.   alias :initialize_straight :initialize
  868.   def initialize
  869.     initialize_straight
  870.     @total_damage = {}
  871.   end
  872.   #--------------------------------------------------------------------------
  873.   # ● 存在判定
  874.   #--------------------------------------------------------------------------
  875.   def exist?
  876.     return (not @hidden and (@hp > 0 or @immortal or not @total_damage.empty?))
  877.   end
  878.   #--------------------------------------------------------------------------
  879.   # ● 残HP予測
  880.   #--------------------------------------------------------------------------
  881.   def rest_hp
  882.     # rest_hp に現HPを代入
  883.     rest_hp = @hp
  884.     # バトラーが受ける全ダメージをrest_hpに反映させる
  885.     for total in @total_damage
  886.       for pre_damage in total[1]
  887.         if pre_damage[0].is_a?(Numeric)
  888.           rest_hp -= pre_damage[0]
  889.         end
  890.         if pre_damage[2].is_a?(Numeric)
  891.           rest_hp += pre_damage[2]
  892.         end
  893.       end
  894.     end
  895.     return rest_hp
  896.   end
  897. end
  898. #//////////////////////////////////////////////////////////////////////////////
  899. #连击数计算的基础部分Part2  by 桜雅 在土
  900. #------------------------------------------------------------------------------
  901. # ● 公開インスタンス変数
  902. #------------------------------------------------------------------------------
  903.   def combohit
  904.     @combohit = 0 if @combohit.nil?
  905.     return @combohit
  906.   end
  907.   def combohit_duration
  908.     @combohit_duration = 0 if @combohit_duration.nil?
  909.     return @combohit_duration
  910.   end
  911. #------------------------------------------------------------------------------
  912. # ○ コンボヒットを更新
  913. #------------------------------------------------------------------------------  
  914.   def combohit_update
  915.     # 例外補正
  916.     @combohit_duration = 0 if @combohit_duration.nil?
  917.     # カウント
  918.     if @combohit_duration > 0
  919.       @combohit_duration -= 1
  920.       # のけぞり時間終了時、コンボ数をリセット
  921.       @combohit = 0 if @combohit_duration == 0
  922.     end
  923.   end
  924. #------------------------------------------------------------------------------
  925. # ○ コンボヒットをカウント
  926. #------------------------------------------------------------------------------
  927.   def combohit_count
  928.     # 例外補正
  929.     @combohit = 0 if @combohit.nil?  
  930.     # カウント
  931.     @combohit += 1
  932.     @combohit_duration = XRXS_BP19::COMBOHIT_DURATION
  933.   end
  934. #------------------------------------------------------------------------------
  935. # ○ コンボヒットをクリア
  936. #------------------------------------------------------------------------------  
  937.   def combohit_clear
  938.     @combohit = nil
  939.     @combohit_duration = nil
  940.   end

  941. #//////////////////////////////////////////////////////////////////////////////
  942. #==============================================================================
  943. # ■ Game_Actor
  944. #------------------------------------------------------------------------------
  945. #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
  946. # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
  947. #==============================================================================

  948. class Game_Actor < Game_Battler
  949.   #--------------------------------------------------------------------------
  950.   # ● 公開インスタンス変数
  951.   #--------------------------------------------------------------------------
  952.   def change_weapon(id)
  953.     @weapon_id = id
  954.   end
  955. end

  956. #==============================================================================
  957. # ■ Sprite_Battler
  958. #------------------------------------------------------------------------------
  959. #  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、
  960. # スプライトの状態を自動的に変化させます。
  961. #==============================================================================

  962. class Sprite_Battler < RPG::Sprite
  963.   #--------------------------------------------------------------------------
  964.   # ● フレーム更新
  965.   #--------------------------------------------------------------------------
  966.   def update
  967.     super
  968.     # バトラーが nil の場合
  969.     if @battler == nil
  970.       self.bitmap = nil
  971.       loop_animation(nil)
  972.       return
  973.     end
  974.     # ファイル名か色相が現在のものと異なる場合
  975.     if @battler.battler_name != @battler_name or
  976.        @battler.battler_hue != @battler_hue
  977.       # ビットマップを取得、設定
  978.       @battler_name = @battler.battler_name
  979.       @battler_hue = @battler.battler_hue
  980.       self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
  981.       @width = bitmap.width
  982.       @height = bitmap.height
  983.       self.ox = @width / 2
  984.       self.oy = @height
  985.       if @battler.is_a?(Game_Enemy)
  986.         @battler.height = @height
  987.       end
  988.       # 戦闘不能または隠れ状態なら不透明度を 0 にする
  989.       if @battler.dead? or @battler.hidden
  990.         self.opacity = 0
  991.       end
  992.     end
  993.     # アニメーション ID が現在のものと異なる場合
  994.     if @battler.state_animation_id != @state_animation_id
  995.       @state_animation_id = @battler.state_animation_id
  996.       loop_animation($data_animations[@state_animation_id])
  997.     end
  998.     # 表示されるべきアクターの場合
  999.     if @battler.is_a?(Game_Actor) and @battler_visible
  1000.       # メインフェーズでないときは不透明度をやや下げる
  1001.       if $game_temp.battle_main_phase
  1002.         self.opacity += 3 if self.opacity < 255
  1003.       else
  1004.         self.opacity -= 3 if self.opacity > 207
  1005.       end
  1006.     end
  1007.     # 明滅
  1008.     if @battler.blink
  1009.       blink_on
  1010.     else
  1011.       blink_off
  1012.     end
  1013.     # 不可視の場合
  1014.     unless @battler_visible
  1015.       # 出現
  1016.       if not @battler.hidden and not @battler.dead? and
  1017.          (@battler.damage.size < 2 or @battler.damage_pop.size < 2)
  1018.         appear
  1019.         @battler_visible = true
  1020.       end
  1021.     end
  1022.     # ダメージ
  1023.     for battler in @battler.damage_pop
  1024.       if battler[0].class == Array
  1025.         if battler[0][1] >= 0
  1026.           $scene.skill_se
  1027.         else
  1028.           $scene.levelup_se
  1029.         end
  1030.         damage(@battler.damage[battler[0]], false, 2)
  1031.       else
  1032.         damage(@battler.damage[battler[0]], @battler.critical[battler[0]])
  1033.       end
  1034.       if @battler.damage_sp.include?(battler[0])
  1035.         damage(@battler.damage_sp[battler[0]],
  1036.                 @battler.critical[battler[0]], 1)
  1037.         @battler.damage_sp.delete(battler[0])
  1038.       end
  1039.       @battler.damage_pop.delete(battler[0])
  1040.       @battler.damage.delete(battler[0])
  1041.       @battler.critical.delete(battler[0])
  1042.     end
  1043.     # 可視の場合
  1044.     if @battler_visible
  1045.       # 逃走
  1046.       if @battler.hidden
  1047.         $game_system.se_play($data_system.escape_se)
  1048.         escape
  1049.         @battler_visible = false
  1050.       end
  1051.       # 白フラッシュ
  1052.       if @battler.white_flash
  1053.         whiten
  1054.         @battler.white_flash = false
  1055.       end
  1056.       # アニメーション
  1057.       unless @battler.animation.empty?
  1058.         for animation in @battler.animation.reverse
  1059.           animation($data_animations[animation[0]], animation[1])
  1060.           @battler.animation.delete(animation)
  1061.         end
  1062.       end
  1063.       # コラプス
  1064.       if @battler.total_damage.empty? and @battler.dead?
  1065.         if $scene.dead_ok?(@battler)
  1066.           if @battler.is_a?(Game_Enemy)
  1067.             $game_system.se_play($data_system.enemy_collapse_se)
  1068.           else
  1069.             $game_system.se_play($data_system.actor_collapse_se)
  1070.           end
  1071.           collapse
  1072.           @battler_visible = false
  1073.         end
  1074.       end
  1075.     end
  1076.     # スプライトの座標を設定
  1077.     self.x = @battler.screen_x
  1078.     self.y = @battler.screen_y
  1079.     self.z = @battler.screen_z
  1080.     if @battler.is_a?(Game_Enemy)
  1081.       self.zoom_x = @battler.real_zoom * @battler.zoom
  1082.       self.zoom_y = @battler.real_zoom * @battler.zoom
  1083.     end
  1084.   end
  1085. end
复制代码

作者: 白鬼    时间: 2011-1-10 10:46
不用看脚本。如果内置的技能可以做到某个效果,那就说明任何技能都能做到这个效果。但是要设置正确。
我没见过这个工程,所以不知道具体效果。
如果是彩虹神剑(听技能名字——千裂斩——应该差不多)那样的效果,你需要设置闪烁。闪烁一次显示一次伤害数据。
如果不是这样的话,发工程上来。
作者: Mr.Faint    时间: 2011-1-10 17:16
工程是下载来的。如果把【千裂斩】的动画换掉,比如换成【短剑技4】就不能显示多段伤害。但是动画中目标的闪烁应该是差不多的。另外还有角色的其他一些技能,如果动画换掉也无法显示多段伤害。

RTAB_sixRice_017b.rar

955.89 KB, 下载次数: 270


作者: pigsss    时间: 2011-1-10 20:29
表示本人整合过RTAB和彩虹,但是……目前还不完美
作者: 永江衣玖    时间: 2011-1-10 20:43
本帖最后由 永江衣玖 于 2011-1-10 20:43 编辑

路过~
这个不用整合其他的脚本,RTAB默认的连击可是相当华丽的呀~
设置方法是在动画里需要蹦血的帧处插入类似这样的闪烁:

  1. 对像 (5,100,0,0),@1
复制代码
其中第一个数字是控制这一帧蹦血的数量,数值越大蹦的血越多,像千裂斩那样最后一击的伤害最高的效果可以通过修改这个数字来实现,具体可以参考千裂斩动画“SE与闪烁效果”部分的第42帧~
作者: Mr.Faint    时间: 2011-1-11 17:56
应该是解决了,多谢楼上。
不过输不管输入多少数值,总伤害还是根据【技能】的数据而定的,对吧?
也就是说这种对于闪烁的设置时不会决定技能总体威力的,对吧?


Mr.Faint于2011-1-11 18:02补充以下内容:
ps:不过能不能设置一下在多段伤害之后显示总伤害呢?




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