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

Project1

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

[已经解决] RTAB的连击效果该怎么做?

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-8-9
帖子
5
跳转到指定楼层
1
发表于 2009-8-9 11:48:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

Lv1.梦旅人

梦石
0
星屑
50
在线时间
4 小时
注册时间
2008-8-24
帖子
49
2
发表于 2009-8-9 11:55:28 | 只看该作者
本帖最后由 sadsqw1 于 2009-8-9 11:57 编辑

第一部分
  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

复制代码
第2部分
  1. #==============================================================================
  2. #RTAB观光游第六站,连击效果+连击数显示 (计算部分)
  3. #==============================================================================
  4. # 連撃 Ver 1.03
  5. # 配布元・サポートURL
  6. # http://members.jcom.home.ne.jp/cogwheel/

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

  16. class Scene_Battle
  17. attr_reader :skill#到此一游
  18. #--------------------------------------------------------------------------
  19. # ● ATB基礎セットアップ
  20. #--------------------------------------------------------------------------
  21.   alias :atb_setup_straight :atb_setup
  22.   def atb_setup
  23.     atb_setup_straight
  24.     for battler in $game_party.actors + $game_troop.enemies
  25.       battler.total_damage = {}
  26.     end
  27.   end
  28. #--------------------------------------------------------------------------
  29. # ● アクション更新 (メインフェーズ)
  30. #--------------------------------------------------------------------------
  31.   def action_phase(battler)
  32.     while true
  33.       # action が 1 の場合、バトラーが行動中かどうか確認
  34.       if @action == 1 and battler.phase < 3
  35.         for target in battler.target
  36.           speller = synthe?(target)
  37.           if speller == nil
  38.             # ターゲットが通常行動中の場合
  39.             if @action_battlers.include?(target)
  40.               if target.phase > 2
  41.                 return
  42.               end
  43.             end
  44.           else
  45.             # ターゲットが連携スキル発動中の場合
  46.             for spell in speller
  47.               if @action_battlers.include?(spell)
  48.                 if spell.phase > 2
  49.                   return
  50.                 end
  51.               end
  52.             end
  53.           end
  54.         end
  55.       end
  56.       case battler.phase
  57.       when 1
  58.         update_phase4_step1(battler)
  59.       when 2
  60.         update_phase4_step2(battler)
  61.       when 3
  62.         update_phase4_step3(battler)
  63.       when 4
  64.         update_phase4_step4(battler)
  65.       when 5
  66.         update_phase4_step5(battler)
  67.       when 6
  68.         update_phase4_step6(battler)
  69.       end
  70.       # ウェイトが入った場合
  71.       if battler.wait > 0
  72.         # ウェイトカウントを減らして終了
  73.         battler.wait -= 1
  74.         break
  75.       end
  76.       # 行動終了した場合ループを抜ける
  77.       unless @action_battlers.include?(battler)
  78.         break
  79.       end
  80.     end
  81.   end
  82.   #--------------------------------------------------------------------------
  83.   # ● フレーム更新 (メインフェーズ ステップ 1 : アクション準備)
  84.   #--------------------------------------------------------------------------
  85.   def update_phase4_step1(battler)
  86.     # すでに戦闘から外されている場合
  87.     if battler.index == nil
  88.       @action_battlers.delete(battler)
  89.       anime_wait_return
  90.       battler.wait = 1
  91.       return
  92.     end
  93.     speller = synthe?(battler)
  94.     if speller == nil
  95.       # ダメージ食らい中の場合
  96.       unless battler.damage.empty? or @action > 2
  97.         battler.wait = 1
  98.         return
  99.       end
  100.       # 行動可能かどうか判定
  101.       unless battler.movable?
  102.         battler.phase = 6
  103.         return
  104.       end
  105.     else
  106.       # ダメージ食らい中の場合
  107.       for spell in speller
  108.         unless spell.damage.empty? or @action > 2
  109.           battler.wait = 1
  110.           return
  111.         end
  112.         # 行動可能かどうか判定
  113.         unless spell.movable?
  114.           battler.phase = 6
  115.           return
  116.         end
  117.       end
  118.     end
  119.     # スキル使用時、詠唱時間設定
  120.     # 強制アクションかつ @force が 2 の時はスキルを即時発動
  121.     if battler.current_action.kind == 1 and
  122.       (not battler.current_action.forcing or @force != 2)
  123.       if battler.rtp == 0
  124.         # スキル詠唱中ならば、解除
  125.         skill_reset(battler)
  126.         # スキル詠唱時間設定
  127.         recite_time(battler)
  128.         # 連携技設定
  129.         synthe_spell(battler)
  130.         # スキルを詠唱する場合
  131.         if battler.rtp > 0
  132.           # 強制アクションかつ @force が 1 の時は連携スキルのみ即時発動
  133.           speller = synthe?(battler)
  134.           if battler.current_action.forcing and @force > 0 and speller != nil
  135.             for spell in speller
  136.               spell.rt = spell.rtp
  137.             end
  138.           else
  139.             battler.blink = true
  140.             if battler.current_action.forcing
  141.               $game_temp.forcing_battler = nil
  142.               battler.current_action.forcing = false
  143.             end
  144.             @action_battlers.delete(battler)
  145.             return
  146.           end
  147.         end
  148.       end
  149.     end
  150.     # アクターの明滅エフェクト OFF
  151.     if battler != nil
  152.       battler.blink = false
  153.     end
  154.     speller = synthe?(battler)
  155.     if speller == nil
  156.       @spell_p.delete(battler)
  157.       @spell_e.delete(battler)
  158.     else
  159.       for spell in speller
  160.         spell.blink = false
  161.         @spell_p.delete(spell)
  162.         @spell_e.delete(spell)
  163.       end
  164.     end
  165.     # ステップ 2 に移行
  166.     battler.phase = 2
  167.   end
  168.   #--------------------------------------------------------------------------
  169.   # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  170.   #--------------------------------------------------------------------------
  171.   def update_phase4_step2(battler)
  172.     # 強制アクションでなければ
  173.     unless battler.current_action.forcing
  174.       # 制約が [敵を通常攻撃する] か [味方を通常攻撃する] の場合
  175.       if battler.restriction == 2 or battler.restriction == 3
  176.         # アクションに攻撃を設定
  177.         battler.current_action.kind = 0
  178.         battler.current_action.basic = 0
  179.       end
  180.     end
  181.     # アクションの種別より攻撃アニメーションを取得する
  182.     case battler.current_action.kind
  183.     when 0 # 基本
  184.       if battler.is_a?(Game_Actor)
  185.         base_id = battler.weapon_id
  186.       end
  187.       anime_id = battler.animation2_id
  188.       # 防御など特殊行動の場合は次のステップへ
  189.       unless make_basic_action_preparation(battler)
  190.         return
  191.       end
  192.       # 戦闘が終了した場合は行動をキャンセル
  193.       if fin?
  194.         battler.phase = 6
  195.         return
  196.       end
  197.     when 1 # スキル
  198.       base_id = battler.current_action.skill_id
  199.       anime_id = $data_skills[battler.current_action.skill_id].animation2_id
  200.       # スキルが使用できない場合は行動をキャンセル
  201.       unless make_skill_action_preparation(battler)
  202.         return
  203.       end
  204.       # 戦闘が終了した場合は行動をキャンセル
  205.       if fin? and $data_skills[anime_id].scope == 1..2
  206.         battler.phase = 6
  207.         return
  208.       end
  209.     when 2 # アイテム
  210.       base_id = battler.current_action.item_id
  211.       anime_id = $data_items[battler.current_action.item_id].animation2_id
  212.       # アイテムが使用できない場合は行動をキャンセル
  213.       unless make_item_action_preparation(battler)
  214.         return
  215.       end
  216.       # 戦闘が終了した場合は行動をキャンセル
  217.       if fin? and $data_items[anime_id].scope == 1..2
  218.         battler.phase = 6
  219.         return
  220.       end
  221.     end
  222.     # アニメーションを検索し、連撃性を変数serialに代入する
  223.     serial = []
  224.     frame = 0
  225.     if $data_animations[anime_id] != nil
  226.       for animation in $data_animations[anime_id].timings
  227.         color = animation.flash_color
  228.         # アニメーション・フラッシュの強さが0の場合
  229.         if color.alpha == 0
  230.           serial.push([color.red.to_i, color.green, animation.frame - frame])
  231.           frame = animation.frame
  232.         end
  233.       end
  234.       # 連撃性がない場合単発攻撃
  235.       if serial.empty?
  236.         serial = [[20, 100, $data_animations[anime_id].frame_max - 5]]
  237.       end
  238.     else
  239.       # アニメーションが存在しない場合
  240.       serial = [[20, 100, 0]]
  241.     end
  242.     # ハッシュ total_damage の作成
  243.     total_damage = {}
  244.     for target in battler.target
  245.       total_damage[target] = []
  246.     end
  247.     # 連撃回数分ダメージ計算を行う
  248.     for attack in serial
  249.       # アクションの種別で分岐
  250.       case battler.current_action.kind
  251.       when 0  # 基本
  252.         if battler.is_a?(Game_Actor)
  253.           # バトラーがアクターの場合、攻撃時に武器を変更する
  254.           battler.change_weapon(base_id + attack[1] - 100)
  255.         end
  256.         make_basic_action_result(battler)
  257.       when 1  # スキル
  258.         # 連携スキルのことを考え、スキルIDの変更は内部処理で行う
  259.         make_skill_action_result(battler, attack[1] - 100)
  260.       when 2  # アイテム
  261.         # アイテムIDを設定分変化させる
  262.         battler.current_action.item_id = base_id + attack[1] - 100
  263.         make_item_action_result(battler)
  264.       end
  265.       # total_damage へダメージを代入
  266.       for target in battler.target
  267.         # ダメージがある場合、ダメージをX/20倍する。
  268.         if target.damage[battler].is_a?(Numeric)
  269.           damage = target.damage[battler] * attack[0] / 20
  270.         else
  271.           damage = target.damage[battler]
  272.         end
  273.         # 回復HP量がある場合、回復HP量をX/20倍する。
  274.         if target.recover_hp[battler].is_a?(Numeric)
  275.           recover_hp = target.recover_hp[battler] * attack[0] / 20
  276.         end
  277.         # 回復SP量がある場合、回復SP量をX/20倍する。
  278.         if target.recover_sp[battler].is_a?(Numeric)
  279.           recover_sp = target.recover_sp[battler] * attack[0] / 20
  280.         end
  281.         critical = target.critical[battler]
  282.         # total_damage = [ダメージ, クリティカルフラグ, 回復HP量, 回復SP量,
  283.         #                 ステート変化, ステート回復, 待ちフレーム時間]
  284.         total_damage[target].push([damage, critical, recover_hp, recover_sp,
  285.           target.state_p[battler], target.state_m[battler], attack[2]])
  286.       end
  287.     end
  288.     # トータルダメージを、バトラーのインスタンスに代入
  289.     for target in battler.target
  290.       target.total_damage[battler] = total_damage[target]
  291.     end
  292.     # 武器・スキル・アイテムIDを通常に戻す
  293.     case battler.current_action.kind
  294.     when 0  # 基本
  295.       if battler.is_a?(Game_Actor)
  296.         battler.change_weapon(base_id)
  297.       end
  298.     when 1  # スキル
  299.       battler.current_action.skill_id = base_id
  300.     when 2  # アイテム
  301.       battler.current_action.item_id = base_id
  302.     end
  303.     if battler.phase == 2
  304.       # ステップ 3 に移行
  305.       battler.phase = 3
  306.     end
  307.   end
  308.   #--------------------------------------------------------------------------
  309.   # ● 基本アクション 準備
  310.   #--------------------------------------------------------------------------
  311.   def make_basic_action_preparation(battler)
  312.     # 攻撃の場合
  313.     if battler.current_action.basic == 0
  314.       # アニメーション ID を設定
  315.       battler.anime1 = battler.animation1_id
  316.       battler.anime2 = battler.animation2_id
  317.       # 行動側バトラーがエネミーの場合
  318.       if battler.is_a?(Game_Enemy)
  319.         if battler.restriction == 3
  320.           target = $game_troop.random_target_enemy
  321.         elsif battler.restriction == 2
  322.           target = $game_party.random_target_actor
  323.         else
  324.           index = battler.current_action.target_index
  325.           target = $game_party.smooth_target_actor(index)
  326.         end
  327.       end
  328.       # 行動側バトラーがアクターの場合
  329.       if battler.is_a?(Game_Actor)
  330.         if battler.restriction == 3
  331.           target = $game_party.random_target_actor
  332.         elsif battler.restriction == 2
  333.           target = $game_troop.random_target_enemy
  334.         else
  335.           index = battler.current_action.target_index
  336.           target = $game_troop.smooth_target_enemy(index)
  337.         end
  338.       end
  339.       # 対象側バトラーの配列を設定
  340.       battler.target = [target]
  341.       return true
  342.     end
  343.     # 防御の場合
  344.     if battler.current_action.basic == 1
  345.       # ステップ 3 に移行
  346.       battler.phase = 3
  347.       return false
  348.     end
  349. #===============0.15b(RTAB官方更新)===========================================   
  350.     # 逃げるの場合
  351.     if battler.is_a?(Game_Enemy) and battler.current_action.basic == 2
  352.       # ステップ 3 に移行
  353.       battler.phase = 3
  354.       return false
  355.     end
  356. #=============================================================================
  357.     # 何もしないの場合
  358.     if battler.current_action.basic == 3
  359.       # ステップ 6 に移行
  360.       battler.phase = 6
  361.       return false
  362.     end
  363.   end
  364.   #--------------------------------------------------------------------------
  365.   # ● スキルアクション 準備
  366.   #--------------------------------------------------------------------------
  367.   def make_skill_action_preparation(battler)
  368.     # スキルを取得
  369.     @skill = $data_skills[battler.current_action.skill_id]
  370.     # 連携スキルであるかどうか確認
  371.     speller = synthe?(battler)
  372.     # 強制アクションでなければ
  373.     unless battler.current_action.forcing
  374.       # SP 切れなどで使用できなくなった場合
  375.       if speller == nil
  376.         unless battler.skill_can_use?(@skill.id)
  377.           # ステップ 6 に移行
  378.           battler.phase = 6
  379.          return false
  380.         end
  381.       end
  382.     end
  383.     # SP 消費
  384.     temp = false
  385.     if speller != nil
  386.       for spell in speller
  387.         if spell.current_action.spell_id == 0
  388.           spell.sp -= @skill.sp_cost
  389.         else
  390.           spell.sp -= $data_skills[spell.current_action.spell_id].sp_cost
  391.         end
  392.         # ステータスウィンドウをリフレッシュ
  393.         status_refresh(spell)
  394.       end
  395.     else
  396.       battler.sp -= @skill.sp_cost
  397.       # ステータスウィンドウをリフレッシュ
  398.       status_refresh(battler)
  399.     end
  400.     # アニメーション ID を設定
  401.     battler.anime1 = @skill.animation1_id
  402.     battler.anime2 = @skill.animation2_id
  403.     # コモンイベント ID を設定
  404.     battler.event = @skill.common_event_id
  405.     # 対象側バトラーを設定
  406.     set_target_battlers(@skill.scope, battler)
  407.     return true
  408.   end
  409.   #--------------------------------------------------------------------------
  410.   # ● アイテムアクション 準備
  411.   #--------------------------------------------------------------------------
  412.   def make_item_action_preparation(battler)
  413.     # アイテムを取得
  414.     @item = $data_items[battler.current_action.item_id]
  415.     # アイテム切れなどで使用できなくなった場合
  416.     unless $game_party.item_can_use?(@item.id)
  417.       # ステップ 6 に移行
  418.       battler.phase = 6
  419.       return false
  420.     end
  421.     # 消耗品の場合
  422.     if @item.consumable
  423.       # 使用したアイテムを 1 減らす
  424.       $game_party.lose_item(@item.id, 1)
  425.     end
  426.     # アニメーション ID を設定
  427.     battler.anime1 = @item.animation1_id
  428.     battler.anime2 = @item.animation2_id
  429.     # コモンイベント ID を設定
  430.     battler.event = @item.common_event_id
  431.     # 対象を決定
  432.     index = battler.current_action.target_index
  433.     target = $game_party.smooth_target_actor(index)
  434.     # 対象側バトラーを設定
  435.     set_target_battlers(@item.scope, battler)
  436.     return true
  437.   end
  438.   #--------------------------------------------------------------------------
  439.   # ● 基本アクション 結果作成
  440.   #--------------------------------------------------------------------------
  441.   def make_basic_action_result(battler)
  442.     # 通常攻撃の効果を適用
  443.     for target in battler.target
  444.       target.attack_effect(battler)
  445.     end
  446.   end
  447.   #--------------------------------------------------------------------------
  448.   # ● スキルアクション 結果作成
  449.   #--------------------------------------------------------------------------
  450.   def make_skill_action_result(battler, plus_id)
  451.     # スキルを取得
  452.     @skill = $data_skills[battler.current_action.skill_id + plus_id]
  453.     # 連携スキルであるかどうか確認
  454.     speller = synthe?(battler)
  455.     # スキルの効果を適用
  456.     for target in battler.target
  457.       if speller != nil
  458.         damage = 0
  459.         effective = false
  460.         state_p = []
  461.         state_m = []
  462.         d_result = false
  463.         for spell in speller
  464.           if spell.current_action.spell_id != 0
  465.             @skill = $data_skills[spell.current_action.spell_id + plus_id]
  466.           end
  467.           effective |= target.skill_effect(spell, @skill)
  468.           if target.damage[spell].class != String
  469.             d_result = true
  470.             damage += target.damage[spell]
  471.           elsif effective
  472.             effect = target.damage[spell]
  473.           end
  474.           state_p += target.state_p[spell]
  475.           state_m += target.state_m[spell]
  476.           target.damage.delete(spell)
  477.           target.state_p.delete(spell)
  478.           target.state_m.delete(spell)
  479.         end
  480.         if d_result
  481.           target.damage[battler] = damage
  482.         elsif effective
  483.           target.damage[battler] = effect
  484.         end
  485.         target.state_p[battler] = state_p
  486.         target.state_m[battler] = state_m
  487.       else
  488.         target.skill_effect(battler, @skill)
  489.       end
  490.     end
  491.   end
  492.   #--------------------------------------------------------------------------
  493.   # ● アイテムアクション 結果作成
  494.   #--------------------------------------------------------------------------
  495.   def make_item_action_result(battler)
  496.     # アイテムを取得
  497.     @item = $data_items[battler.current_action.item_id]
  498.     # アイテムの効果を適用
  499.     for target in battler.target
  500.       target.item_effect(@item, battler)
  501.     end
  502.   end
  503.   #--------------------------------------------------------------------------
  504.   # ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション)
  505.   #--------------------------------------------------------------------------
  506.   def update_phase4_step4(battler)
  507.     # カメラ設定
  508.     if battler.target[0].is_a?(Game_Enemy) and battler.anime1 != 0
  509.       camera_set(battler)
  510.     end
  511.     # 対象側アニメーション
  512.     for target in battler.target
  513.       target.animation.push([battler.anime2,
  514.                                           (target.damage[battler] != "Miss")])
  515.       unless battler.anime2 == 0
  516.         battler.wait = 2 * target.total_damage[battler][0][6] - 1 +
  517.           Graphics.frame_count % 2
  518.       end
  519.     end
  520.     # ステップ 5 に移行
  521.     battler.phase = 5
  522.   end
  523.   #--------------------------------------------------------------------------
  524.   # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  525.   #--------------------------------------------------------------------------
  526.   def update_phase4_step5(battler)
  527.     next_step = true
  528.     # ダメージ表示
  529.     for target in battler.target
  530.       # total_damage より全ダメージを算出
  531.       total_damage = target.total_damage[battler].shift
  532.       target.damage[battler] = total_damage[0]
  533.       target.critical[battler] = total_damage[1]
  534.       target.recover_hp[battler] = total_damage[2]
  535.       target.recover_sp[battler] = total_damage[3]
  536.       target.state_p[battler] = total_damage[4]
  537.       target.state_m[battler] = total_damage[5]
  538.       # ダメージ表示フラグをON
  539.       target.damage_pop[battler] = true
  540.       # 恭喜你发现了连击计算的关键一行!
  541.       target.combohit_count if target.damage[battler].to_i > 0 and target.damage[battler] != "Miss"
  542.       # 実際にダメージを与える
  543. #      target.damage_effect(battler, battler.current_action.kind)
  544.       target.damage_effect(battler, battler.current_action.kind,skill)#到此一游
  545.       # 余計なハッシュを削除
  546.       target.recover_hp.delete(battler)
  547.       target.recover_sp.delete(battler)
  548.       target.state_p.delete(battler)
  549.       target.state_m.delete(battler)
  550.       # ダメージを全て与えきった場合
  551.       if target.total_damage[battler].empty?
  552.         # ターゲットへの全ダメージを削除
  553.         target.total_damage.delete(battler)
  554.         # 指定時間ウェイトする
  555.         battler.wait = @damage_wait
  556.       else
  557.         # 指定時間ウェイトする
  558.         next_step = false
  559.         battler.wait = 2 * target.total_damage[battler][0][6]
  560.       end
  561.       # ステータスウィンドウをリフレッシュ
  562.       status_refresh(target)
  563.     end
  564.     if next_step
  565.       # ステップ 6 に移行
  566.       battler.phase = 6
  567.     end
  568.   end
  569.   
  570.   #--------------------------------------------------------------------------
  571.   # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
  572.   #--------------------------------------------------------------------------
  573.   def update_phase4_step6(battler)
  574.     # カメラを戻す
  575.     if battler.target[0].is_a?(Game_Enemy) and @camera == battler
  576.       @spriteset.screen_target(0, 0, 1)
  577.     end
  578.     # スキルラーニング
  579.     if battler.target[0].is_a?(Game_Actor) and battler.current_action.kind == 1
  580.       for target in battler.target        
  581.         if target.is_a?(Game_Actor)#(0.16)
  582.         skill_learning(target, target.class_id,
  583.                         battler.current_action.skill_id)
  584.         end #(0.16)               
  585.       end
  586.     end
  587.     # アクション強制対象のバトラーをクリア
  588.     if battler.current_action.forcing == true and
  589.         battler.current_action.force_kind == 0 and
  590.         battler.current_action.force_basic == 0 and
  591.         battler.current_action.force_skill_id == 0
  592.       $game_temp.forcing_battler = nil
  593.       battler.current_action.forcing = false
  594.     end
  595.     refresh_phase(battler)
  596.     speller = synthe?(battler)
  597.     if speller != nil
  598.       for spell in speller
  599.         if spell != battler
  600.           refresh_phase(spell)
  601.         end
  602.       end
  603.       synthe_delete(speller)
  604.     end
  605.     # コモンイベント ID が有効の場合
  606.   #  if battler.event > 0
  607.       # イベントをセットアップ
  608.   #    common_event = $data_common_events[battler.event]
  609.   #    $game_system.battle_interpreter.setup(common_event.list, 0)
  610.   #  end
  611.     act = 0
  612.     for actor in $game_party.actors + $game_troop.enemies
  613.       if actor.movable?
  614.         act += 1
  615.       end
  616.     end
  617.     if @turn_cnt >= act and act > 0
  618.       @turn_cnt %= act
  619.       $game_temp.battle_turn += 1
  620.       # バトルイベントの全ページを検索
  621.       for index in 0...$data_troops[@troop_id].pages.size
  622.         # イベントページを取得
  623.         page = $data_troops[@troop_id].pages[index]
  624.         # このページのスパンが [ターン] の場合
  625.         if page.span == 1
  626.           # 実行済みフラグをクリア
  627.           $game_temp.battle_event_flags[index] = false
  628.         end
  629.       end
  630.     end
  631.     battler.phase = 1
  632.     @action_battlers.delete(battler)
  633.   end
  634. #//////////////////////////////////////////////////////////////////////////////
  635. #连击数计算的基础部分Part1  by 桜雅 在土
  636. #------------------------------------------------------------------------------
  637. # ● メイン処理
  638. #------------------------------------------------------------------------------
  639.   alias xrxs_bp19_main main
  640.   def main
  641.     # コンボヒットウィンドウを作成
  642.     @combohit_window = Window_ComboHit.new
  643.     # 呼び戻す
  644.     xrxs_bp19_main
  645.     # ウィンドウを解放
  646.     @combohit_window.dispose
  647.     # コンボクリア
  648.     $game_party.actors.each {|actor| actor.combohit_clear}
  649.   end
  650. #------------------------------------------------------------------------------
  651. # ● フレーム更新
  652. #------------------------------------------------------------------------------
  653.   alias xrxs_bp19_update update
  654.   def update
  655.     # フレーム更新
  656.     @combohit_window.update
  657.     $game_party.actors.each {|actor| actor.combohit_update}
  658.     $game_troop.enemies.each{|enemy| enemy.combohit_update}
  659.     # 呼び戻す
  660.     xrxs_bp19_update
  661.   end
  662. #------------------------------------------------------------------------------
  663. # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  664. #------------------------------------------------------------------------------
  665.   alias xrxs_bp19_update_phase4_step5 update_phase4_step5
  666.   def update_phase4_step5(battler)
  667.     # 呼び戻す
  668.     xrxs_bp19_update_phase4_step5(battler)
  669.     # コンボ数の最も高いターゲットを探す
  670.     max = 0
  671.     hit_target = nil
  672.     for target in battler.target
  673.       if target.combohit > max
  674.         max = target.combohit
  675.         hit_target = target
  676.       end
  677.     end
  678.     if max >= 2 and !hit_target.nil?
  679.       @combohit_window.x = hit_target.is_a?(Game_Enemy) ? 512 : 512
  680.       @combohit_window.refresh(max, hit_target.combohit_duration)
  681.     end
  682.   end  
  683. end
  684. #//////////////////////////////////////////////////////////////////////////////
  685. #==============================================================================
  686. # ■ Game_Battler (分割定義 1)
  687. #------------------------------------------------------------------------------
  688. #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ
  689. # スのスーパークラスとして使用されます。
  690. #==============================================================================

  691. class Game_Battler
  692.   #--------------------------------------------------------------------------
  693.   # ● 公開インスタンス変数追加
  694.   #--------------------------------------------------------------------------
  695.   attr_accessor :total_damage              # 総ダメージ
  696.   #--------------------------------------------------------------------------
  697.   # ● オブジェクト初期化
  698.   #--------------------------------------------------------------------------
  699.   alias :initialize_straight :initialize
  700.   def initialize
  701.     initialize_straight
  702.     @total_damage = {}
  703.   end
  704.   #--------------------------------------------------------------------------
  705.   # ● 存在判定
  706.   #--------------------------------------------------------------------------
  707.   def exist?
  708.     return (not @hidden and (@hp > 0 or @immortal or not @total_damage.empty?))
  709.   end
  710.   #--------------------------------------------------------------------------
  711.   # ● 残HP予測
  712.   #--------------------------------------------------------------------------
  713.   def rest_hp
  714.     # rest_hp に現HPを代入
  715.     rest_hp = @hp
  716.     # バトラーが受ける全ダメージをrest_hpに反映させる
  717.     for total in @total_damage
  718.       for pre_damage in total[1]
  719.         if pre_damage[0].is_a?(Numeric)
  720.           rest_hp -= pre_damage[0]
  721.         end
  722.         if pre_damage[2].is_a?(Numeric)
  723.           rest_hp += pre_damage[2]
  724.         end
  725.       end
  726.     end
  727.     return rest_hp
  728.   end
  729. end
  730. #//////////////////////////////////////////////////////////////////////////////
  731. #连击数计算的基础部分Part2  by 桜雅 在土
  732. #------------------------------------------------------------------------------
  733. # ● 公開インスタンス変数
  734. #------------------------------------------------------------------------------
  735.   def combohit
  736.     @combohit = 0 if @combohit.nil?
  737.     return @combohit
  738.   end
  739.   def combohit_duration
  740.     @combohit_duration = 0 if @combohit_duration.nil?
  741.     return @combohit_duration
  742.   end
  743. #------------------------------------------------------------------------------
  744. # ○ コンボヒットを更新
  745. #------------------------------------------------------------------------------  
  746.   def combohit_update
  747.     # 例外補正
  748.     @combohit_duration = 0 if @combohit_duration.nil?
  749.     # カウント
  750.     if @combohit_duration > 0
  751.       @combohit_duration -= 1
  752.       # のけぞり時間終了時、コンボ数をリセット
  753.       @combohit = 0 if @combohit_duration == 0
  754.     end
  755.   end
  756. #------------------------------------------------------------------------------
  757. # ○ コンボヒットをカウント
  758. #------------------------------------------------------------------------------
  759.   def combohit_count
  760.     # 例外補正
  761.     @combohit = 0 if @combohit.nil?  
  762.     # カウント
  763.     @combohit += 1
  764.     @combohit_duration = XRXS_BP19::COMBOHIT_DURATION
  765.   end
  766. #------------------------------------------------------------------------------
  767. # ○ コンボヒットをクリア
  768. #------------------------------------------------------------------------------  
  769.   def combohit_clear
  770.     @combohit = nil
  771.     @combohit_duration = nil
  772.   end

  773. #//////////////////////////////////////////////////////////////////////////////
  774. #==============================================================================
  775. # ■ Game_Actor
  776. #------------------------------------------------------------------------------
  777. #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
  778. # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
  779. #==============================================================================

  780. class Game_Actor < Game_Battler
  781.   #--------------------------------------------------------------------------
  782.   # ● 公開インスタンス変数
  783.   #--------------------------------------------------------------------------
  784.   def change_weapon(id)
  785.     @weapon_id = id
  786.   end
  787. end

  788. #==============================================================================
  789. # ■ Sprite_Battler
  790. #------------------------------------------------------------------------------
  791. #  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、
  792. # スプライトの状態を自動的に変化させます。
  793. #==============================================================================

  794. class Sprite_Battler < RPG::Sprite
  795.   #--------------------------------------------------------------------------
  796.   # ● フレーム更新
  797.   #--------------------------------------------------------------------------
  798.   def update
  799.     super
  800.     # バトラーが nil の場合
  801.     if @battler == nil
  802.       self.bitmap = nil
  803.       loop_animation(nil)
  804.       return
  805.     end
  806.     # ファイル名か色相が現在のものと異なる場合
  807.     if @battler.battler_name != @battler_name or
  808.        @battler.battler_hue != @battler_hue
  809.       # ビットマップを取得、設定
  810.       @battler_name = @battler.battler_name
  811.       @battler_hue = @battler.battler_hue
  812.       self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
  813.       @width = bitmap.width
  814.       @height = bitmap.height
  815.       self.ox = @width / 2
  816.       self.oy = @height
  817.       if @battler.is_a?(Game_Enemy)
  818.         @battler.height = @height
  819.       end
  820.       # 戦闘不能または隠れ状態なら不透明度を 0 にする
  821.       if @battler.dead? or @battler.hidden
  822.         self.opacity = 0
  823.       end
  824.     end
  825.     # アニメーション ID が現在のものと異なる場合
  826.     if @battler.state_animation_id != @state_animation_id
  827.       @state_animation_id = @battler.state_animation_id
  828.       loop_animation($data_animations[@state_animation_id])
  829.     end
  830.     # 表示されるべきアクターの場合
  831.     if @battler.is_a?(Game_Actor) and @battler_visible
  832.       # メインフェーズでないときは不透明度をやや下げる
  833.       if $game_temp.battle_main_phase
  834.         self.opacity += 3 if self.opacity < 255
  835.       else
  836.         self.opacity -= 3 if self.opacity > 207
  837.       end
  838.     end
  839.     # 明滅
  840.     if @battler.blink
  841.       blink_on
  842.     else
  843.       blink_off
  844.     end
  845.     # 不可視の場合
  846.     unless @battler_visible
  847.       # 出現
  848.       if not @battler.hidden and not @battler.dead? and
  849.          (@battler.damage.size < 2 or @battler.damage_pop.size < 2)
  850.         appear
  851.         @battler_visible = true
  852.       end
  853.     end
  854.     # ダメージ
  855.     for battler in @battler.damage_pop
  856.       if battler[0].class == Array
  857.         if battler[0][1] >= 0
  858.           $scene.skill_se
  859.         else
  860.           $scene.levelup_se
  861.         end
  862.         damage(@battler.damage[battler[0]], false, 2)
  863.       else
  864.         damage(@battler.damage[battler[0]], @battler.critical[battler[0]])
  865.       end
  866.       if @battler.damage_sp.include?(battler[0])
  867.         damage(@battler.damage_sp[battler[0]],
  868.                 @battler.critical[battler[0]], 1)
  869.         @battler.damage_sp.delete(battler[0])
  870.       end
  871.       @battler.damage_pop.delete(battler[0])
  872.       @battler.damage.delete(battler[0])
  873.       @battler.critical.delete(battler[0])
  874.     end
  875.     # 可視の場合
  876.     if @battler_visible
  877.       # 逃走
  878.       if @battler.hidden
  879.         $game_system.se_play($data_system.escape_se)
  880.         escape
  881.         @battler_visible = false
  882.       end
  883.       # 白フラッシュ
  884.       if @battler.white_flash
  885.         whiten
  886.         @battler.white_flash = false
  887.       end
  888.       # アニメーション
  889.       unless @battler.animation.empty?
  890.         for animation in @battler.animation.reverse
  891.           animation($data_animations[animation[0]], animation[1])
  892.           @battler.animation.delete(animation)
  893.         end
  894.       end
  895.       # コラプス
  896.       if @battler.total_damage.empty? and @battler.dead?
  897.         if $scene.dead_ok?(@battler)
  898.           if @battler.is_a?(Game_Enemy)
  899.             $game_system.se_play($data_system.enemy_collapse_se)
  900.           else
  901.             $game_system.se_play($data_system.actor_collapse_se)
  902.           end
  903.           collapse
  904.           @battler_visible = false
  905.         end
  906.       end
  907.     end
  908.     # スプライトの座標を設定
  909.     self.x = @battler.screen_x
  910.     self.y = @battler.screen_y
  911.     self.z = @battler.screen_z
  912.     if @battler.is_a?(Game_Enemy)
  913.       self.zoom_x = @battler.real_zoom * @battler.zoom
  914.       self.zoom_y = @battler.real_zoom * @battler.zoom
  915.     end
  916.   end
  917. end
复制代码
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-8-9
帖子
5
3
 楼主| 发表于 2009-8-9 12:27:34 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

伸手爱好者

梦石
0
星屑
50
在线时间
8 小时
注册时间
2009-3-28
帖子
527
4
发表于 2009-8-9 13:17:09 | 只看该作者
本帖最后由 悠悠炸弹 于 2009-8-9 13:18 编辑

攻击次数的判定是在动画里的.
打开范例看看,
那个"千裂斩"动画里有很微弱的闪烁.
大概是(0,0,5)
就是靠闪烁来决定攻击次数的.
动画里有多少个这样的闪烁就会攻击多少次

其实就是这一句...      因为是日文的所以很多人看不懂...(我也看不懂=_=|||)
# アニメに強さ0のフラッシュが存在した場合、

# 赤:倍率 緑:+スキル・アイテムID でダメージ計算を行う。

#

# 连击数,每次伤害比率如何设置,参考动画“千裂斩”
咱在咱的设计素描书上看到有“柳笛”这个名字,恩~到底有怎样的关系呢?
[img]http://rpg.blue/data/attachment/forum/month_0910/09102318341719b34b80b536d4.gif[/img]
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
6 小时
注册时间
2009-7-7
帖子
22
5
发表于 2009-8-9 13:57:18 | 只看该作者
……囧。。
彩虹神剑和这个估计都是靠画面(人物)闪烁来决定连击数(HITS)的。。
我亲手弄过的。。彩虹神剑的确是靠闪烁- -||(冷汗)
辛古·米迪奥莱特:(Shing Meteoryte)  这是一名对世界拥有强烈好奇心的少年。他与祖父泽克斯在边境的希布尔村居住。他从祖父和母亲那里所获得索玛武器具有一种超凡的能力。但由于其强烈好奇心和与人处事的经验尚浅。因此说的话经常会不经大脑考虑,但他一旦认识到错误会立刻反省。在消灭琥珀的污染根源时,无意使思念迷宫变异,让琥珀失去了所以情感,现在正在努力把所有碎片找回。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-8-9
帖子
5
6
 楼主| 发表于 2009-8-9 20:18:56 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-11 07:12

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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