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

Project1

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

[已经过期] 我用了 强化对话框脚本后,不能切入战斗了。

[复制链接]

Lv1.梦旅人

梦石
0
星屑
235
在线时间
8 小时
注册时间
2012-4-30
帖子
4
跳转到指定楼层
1
发表于 2012-5-1 16:13:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 iisnow 于 2012-5-1 20:19 编辑



Scene_Battle 脚本如下。还有怎么在 脚本前面弄个行数编号啊,别人都有  = =
  1. #==============================================================================
  2. # ** Scene_Battle
  3. #------------------------------------------------------------------------------
  4. #  這個類用來執行顯示作戰畫面的程式。
  5. #==============================================================================

  6. class Scene_Battle < Scene_Base
  7.   #--------------------------------------------------------------------------
  8.   # * 程式開始
  9.   #--------------------------------------------------------------------------
  10.   def start
  11.     super
  12.     $game_temp.in_battle = true
  13.     @spriteset = Spriteset_Battle.new
  14.     @message_window = Window_BattleMessage.new
  15.     @action_battlers = []
  16.     create_info_viewport
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # * 程式開始後的處理
  20.   #--------------------------------------------------------------------------
  21.   def post_start
  22.     super
  23.     process_battle_start
  24.   end
  25.   #--------------------------------------------------------------------------
  26.   # * 程式終止
  27.   #--------------------------------------------------------------------------
  28.   def terminate
  29.     super
  30.     dispose_info_viewport
  31.     @message_window.dispose
  32.     @spriteset.dispose
  33.     unless $scene.is_a?(Scene_Gameover)
  34.       $scene = nil if $BTEST
  35.     end
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # * 基礎更新處理
  39.   #     main : 呼叫主更新方法
  40.   #--------------------------------------------------------------------------
  41.   def update_basic(main = false)
  42.     Graphics.update unless main     # 更新螢幕內容
  43.     Input.update unless main        # 更新指令輸入資訊
  44.     $game_system.update             # 更新計時器
  45.     $game_troop.update              # 更新敵人隊伍資訊
  46.     @spriteset.update               # 更新精靈物設
  47.     @message_window.update          # 更新文本訊息視窗
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # * 等待預定的時間
  51.   #     duration : 等待時長(按幀數計算)
  52.   #     no_fast  : 禁用快速播放畫面
  53.   #    一種當場景畫面類更新內容顯示的過程的時候插入等待的方法。
  54.   #    通常,顯示每一幀的時候都會呼叫一次畫面更新,
  55.   #    不過在作戰時卻難以把握處理流程,所以這個方法被當作一種異常來使用。
  56.   #--------------------------------------------------------------------------
  57.   def wait(duration, no_fast = false)
  58.     for i in 0...duration
  59.       update_basic
  60.       break if not no_fast and i >= duration / 2 and show_fast?
  61.     end
  62.   end
  63.   #--------------------------------------------------------------------------
  64.   # * 等待文本訊息顯示完畢
  65.   #--------------------------------------------------------------------------
  66.   def wait_for_message
  67.     @message_window.update
  68.     while $game_message.visible
  69.       update_basic
  70.     end
  71.   end
  72.   #--------------------------------------------------------------------------
  73.   # * 等待動畫播放顯示完畢
  74.   #--------------------------------------------------------------------------
  75.   def wait_for_animation
  76.     while @spriteset.animation?
  77.       update_basic
  78.     end
  79.   end
  80.   #--------------------------------------------------------------------------
  81.   # * 快速播放畫面指令的判定
  82.   #--------------------------------------------------------------------------
  83.   def show_fast?
  84.     return (Input.press?(Input::A) or Input.press?(Input::C))
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # * 更新幀
  88.   #--------------------------------------------------------------------------
  89.   def update
  90.     super
  91.     update_basic(true)
  92.     update_info_viewport                  # 更新資訊視口
  93.     if $game_message.visible
  94.       @info_viewport.visible = false
  95.       @message_window.visible = true
  96.     end
  97.     unless $game_message.visible          # 除非正在顯示文本訊息
  98.       return if judge_win_loss            # 判定作戰勝負結果
  99.       update_scene_change
  100.       if @target_enemy_window != nil
  101.         update_target_enemy_selection     # 選擇目標敵人
  102.       elsif @target_actor_window != nil
  103.         update_target_actor_selection     # 選擇目標主角
  104.       elsif @skill_window != nil
  105.         update_skill_selection            # 選擇技能
  106.       elsif @item_window != nil
  107.         update_item_selection             # 選擇物品
  108.       elsif @party_command_window.active
  109.         update_party_command_selection    # 隊伍選單項目選擇
  110.       elsif @actor_command_window.active
  111.         update_actor_command_selection    # 主角行動選單項目選擇
  112.       else
  113.         process_battle_event              # 作戰事件處理
  114.         process_action                    # 作戰行為
  115.         process_battle_event              # 作戰事件處理
  116.       end
  117.     end
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # * 創建資訊顯示視口
  121.   #--------------------------------------------------------------------------
  122.   def create_info_viewport
  123.     @info_viewport = Viewport.new(0, 288, 544, 128)
  124.     @info_viewport.z = 100
  125.     @status_window = Window_BattleStatus.new
  126.     @party_command_window = Window_PartyCommand.new
  127.     @actor_command_window = Window_ActorCommand.new
  128.     @status_window.viewport = @info_viewport
  129.     @party_command_window.viewport = @info_viewport
  130.     @actor_command_window.viewport = @info_viewport
  131.     @status_window.x = 128
  132.     @actor_command_window.x = 544
  133.     @info_viewport.visible = false
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # * 清除資訊顯示視口
  137.   #--------------------------------------------------------------------------
  138.   def dispose_info_viewport
  139.     @status_window.dispose
  140.     @party_command_window.dispose
  141.     @actor_command_window.dispose
  142.     @info_viewport.dispose
  143.   end
  144.   #--------------------------------------------------------------------------
  145.   # * 更新資訊顯示視口內容
  146.   #--------------------------------------------------------------------------
  147.   def update_info_viewport
  148.     @party_command_window.update
  149.     @actor_command_window.update
  150.     @status_window.update
  151.     if @party_command_window.active and @info_viewport.ox > 0
  152.       @info_viewport.ox -= 16
  153.     elsif @actor_command_window.active and @info_viewport.ox < 128
  154.       @info_viewport.ox += 16
  155.     end
  156.   end
  157.   #--------------------------------------------------------------------------
  158.   # * 作戰事件處理
  159.   #--------------------------------------------------------------------------
  160.   def process_battle_event
  161.     loop do
  162.       return if judge_win_loss
  163.       return if $game_temp.next_scene != nil
  164.       $game_troop.interpreter.update
  165.       $game_troop.setup_battle_event
  166.       wait_for_message
  167.       process_action if $game_troop.forcing_battler != nil
  168.       return unless $game_troop.interpreter.running?
  169.       update_basic
  170.     end
  171.   end
  172.   #--------------------------------------------------------------------------
  173.   # * 判定作戰勝負結果
  174.   #--------------------------------------------------------------------------
  175.   def judge_win_loss
  176.     if $game_temp.in_battle
  177.       if $game_party.all_dead?
  178.         process_defeat
  179.         return true
  180.       elsif $game_troop.all_dead?
  181.         process_victory
  182.         return true
  183.       else
  184.         return false
  185.       end
  186.     else
  187.       return true
  188.     end
  189.   end
  190.   #--------------------------------------------------------------------------
  191.   # * 結束作戰
  192.   #     result : 作戰結果 (0: 得勝, 1: 撤退, 2: 我方全滅)
  193.   #--------------------------------------------------------------------------
  194.   def battle_end(result)
  195.     if result == 2 and not $game_troop.can_lose
  196.       call_gameover
  197.     else
  198.       $game_party.clear_actions
  199.       $game_party.remove_states_battle
  200.       $game_troop.clear
  201.       if $game_temp.battle_proc != nil
  202.         $game_temp.battle_proc.call(result)
  203.         $game_temp.battle_proc = nil
  204.       end
  205.       unless $BTEST
  206.         $game_temp.map_bgm.play
  207.         $game_temp.map_bgs.play
  208.       end
  209.       $scene = Scene_Map.new
  210.       @message_window.clear
  211.       Graphics.fadeout(30)
  212.     end
  213.     $game_temp.in_battle = false
  214.   end
  215.   #--------------------------------------------------------------------------
  216.   # * 轉而接收下一個主角的指令輸入資訊
  217.   #--------------------------------------------------------------------------
  218.   def next_actor
  219.     loop do
  220.       if @actor_index == $game_party.members.size-1
  221.         start_main
  222.         return
  223.       end
  224.       @status_window.index = @actor_index += 1
  225.       @active_battler = $game_party.members[@actor_index]
  226.       if @active_battler.auto_battle
  227.         @active_battler.make_action
  228.         next
  229.       end
  230.       break if @active_battler.inputable?
  231.     end
  232.     start_actor_command_selection
  233.   end
  234.   #--------------------------------------------------------------------------
  235.   # * 轉而接收上一個主角的指令輸入資訊
  236.   #--------------------------------------------------------------------------
  237.   def prior_actor
  238.     loop do
  239.       if @actor_index == 0
  240.         start_party_command_selection
  241.         return
  242.       end
  243.       @status_window.index = @actor_index -= 1
  244.       @active_battler = $game_party.members[@actor_index]
  245.       next if @active_battler.auto_battle
  246.       break if @active_battler.inputable?
  247.     end
  248.     start_actor_command_selection
  249.   end
  250.   #--------------------------------------------------------------------------
  251.   # * 開始接收隊伍選單命令項選擇指令輸入資訊
  252.   #--------------------------------------------------------------------------
  253.   def start_party_command_selection
  254.     if $game_temp.in_battle
  255.       @status_window.refresh
  256.       @status_window.index = @actor_index = -1
  257.       @active_battler = nil
  258.       @info_viewport.visible = true
  259.       @message_window.visible = false
  260.       @party_command_window.active = true
  261.       @party_command_window.index = 0
  262.       @actor_command_window.active = false
  263.       $game_party.clear_actions
  264.       if $game_troop.surprise or not $game_party.inputable?
  265.         start_main
  266.       end
  267.     end
  268.   end
  269.   #--------------------------------------------------------------------------
  270.   # * 更新隊伍選單命令項選擇指令輸入資訊
  271.   #--------------------------------------------------------------------------
  272.   def update_party_command_selection
  273.     if Input.trigger?(Input::C)
  274.       case @party_command_window.index
  275.       when 0  # 作戰
  276.         Sound.play_decision
  277.         @status_window.index = @actor_index = -1
  278.         next_actor
  279.       when 1  # 撤退
  280.         if $game_troop.can_escape == false
  281.           Sound.play_buzzer
  282.           return
  283.         end
  284.         Sound.play_decision
  285.         process_escape
  286.       end
  287.     end
  288.   end
  289.   #--------------------------------------------------------------------------
  290.   # * 開始接收主角行動指令選擇的指令輸入資訊
  291.   #--------------------------------------------------------------------------
  292.   def start_actor_command_selection
  293.     @party_command_window.active = false
  294.     @actor_command_window.setup(@active_battler)
  295.     @actor_command_window.active = true
  296.     @actor_command_window.index = 0
  297.   end
  298.   #--------------------------------------------------------------------------
  299.   # * 更新主角行動指令選擇的指令輸入資訊
  300.   #--------------------------------------------------------------------------
  301.   def update_actor_command_selection
  302.     if Input.trigger?(Input::B)
  303.       Sound.play_cancel
  304.       prior_actor
  305.     elsif Input.trigger?(Input::C)
  306.       case @actor_command_window.index
  307.       when 0  # 攻擊
  308.         Sound.play_decision
  309.         @active_battler.action.set_attack
  310.         start_target_enemy_selection
  311.       when 1  # 技能
  312.         Sound.play_decision
  313.         start_skill_selection
  314.       when 2  # 防禦
  315.         Sound.play_decision
  316.         @active_battler.action.set_guard
  317.         next_actor
  318.       when 3  # 用品
  319.         Sound.play_decision
  320.         start_item_selection
  321.       end
  322.     end
  323.   end
  324.   #--------------------------------------------------------------------------
  325.   # * 開始接收選擇目標敵人的指令輸入資訊
  326.   #--------------------------------------------------------------------------
  327.   def start_target_enemy_selection
  328.     @target_enemy_window = Window_TargetEnemy.new
  329.     @target_enemy_window.y = @info_viewport.rect.y
  330.     @info_viewport.rect.x += @target_enemy_window.width
  331.     @info_viewport.ox += @target_enemy_window.width
  332.     @actor_command_window.active = false
  333.   end
  334.   #--------------------------------------------------------------------------
  335.   # * 停止接收選擇目標敵人的指令輸入資訊
  336.   #--------------------------------------------------------------------------
  337.   def end_target_enemy_selection
  338.     @info_viewport.rect.x -= @target_enemy_window.width
  339.     @info_viewport.ox -= @target_enemy_window.width
  340.     @target_enemy_window.dispose
  341.     @target_enemy_window = nil
  342.     if @actor_command_window.index == 0
  343.       @actor_command_window.active = true
  344.     end
  345.   end
  346.   #--------------------------------------------------------------------------
  347.   # * 更新目標敵人選擇的指令輸入資訊
  348.   #--------------------------------------------------------------------------
  349.   def update_target_enemy_selection
  350.     @target_enemy_window.update
  351.     if Input.trigger?(Input::B)
  352.       Sound.play_cancel
  353.       end_target_enemy_selection
  354.     elsif Input.trigger?(Input::C)
  355.       Sound.play_decision
  356.       @active_battler.action.target_index = @target_enemy_window.enemy.index
  357.       end_target_enemy_selection
  358.       end_skill_selection
  359.       end_item_selection
  360.       next_actor
  361.     end
  362.   end
  363.   #--------------------------------------------------------------------------
  364.   # * 開始接收選擇目標主角的指令輸入資訊
  365.   #--------------------------------------------------------------------------
  366.   def start_target_actor_selection
  367.     @target_actor_window = Window_BattleStatus.new
  368.     @target_actor_window.index = 0
  369.     @target_actor_window.active = true
  370.     @target_actor_window.y = @info_viewport.rect.y
  371.     @info_viewport.rect.x += @target_actor_window.width
  372.     @info_viewport.ox += @target_actor_window.width
  373.     @actor_command_window.active = false
  374.   end
  375.   #--------------------------------------------------------------------------
  376.   # * 停止接收選擇目標主角的指令輸入資訊
  377.   #--------------------------------------------------------------------------
  378.   def end_target_actor_selection
  379.     @info_viewport.rect.x -= @target_actor_window.width
  380.     @info_viewport.ox -= @target_actor_window.width
  381.     @target_actor_window.dispose
  382.     @target_actor_window = nil
  383.   end
  384.   #--------------------------------------------------------------------------
  385.   # * 更新目標主角選擇的指令輸入資訊
  386.   #--------------------------------------------------------------------------
  387.   def update_target_actor_selection
  388.     @target_actor_window.update
  389.     if Input.trigger?(Input::B)
  390.       Sound.play_cancel
  391.       end_target_actor_selection
  392.     elsif Input.trigger?(Input::C)
  393.       Sound.play_decision
  394.       @active_battler.action.target_index = @target_actor_window.index
  395.       end_target_actor_selection
  396.       end_skill_selection
  397.       end_item_selection
  398.       next_actor
  399.     end
  400.   end
  401.   #--------------------------------------------------------------------------
  402.   # * 開始接收技能選擇的指令輸入資訊
  403.   #--------------------------------------------------------------------------
  404.   def start_skill_selection
  405.     @help_window = Window_Help.new
  406.     @skill_window = Window_Skill.new(0, 56, 544, 232, @active_battler)
  407.     @skill_window.help_window = @help_window
  408.     @actor_command_window.active = false
  409.   end
  410.   #--------------------------------------------------------------------------
  411.   # * 停止接收技能選擇的指令輸入資訊
  412.   #--------------------------------------------------------------------------
  413.   def end_skill_selection
  414.     if @skill_window != nil
  415.       @skill_window.dispose
  416.       @skill_window = nil
  417.       @help_window.dispose
  418.       @help_window = nil
  419.     end
  420.     @actor_command_window.active = true
  421.   end
  422.   #--------------------------------------------------------------------------
  423.   # * 更新技能選擇的指令輸入資訊
  424.   #--------------------------------------------------------------------------
  425.   def update_skill_selection
  426.     @skill_window.active = true
  427.     @skill_window.update
  428.     @help_window.update
  429.     if Input.trigger?(Input::B)
  430.       Sound.play_cancel
  431.       end_skill_selection
  432.     elsif Input.trigger?(Input::C)
  433.       @skill = @skill_window.skill
  434.       if @skill != nil
  435.         @active_battler.last_skill_id = @skill.id
  436.       end
  437.       if @active_battler.skill_can_use?(@skill)
  438.         Sound.play_decision
  439.         determine_skill
  440.       else
  441.         Sound.play_buzzer
  442.       end
  443.     end
  444.   end
  445.   #--------------------------------------------------------------------------
  446.   # * 確認技能此時是否可用
  447.   #--------------------------------------------------------------------------
  448.   def determine_skill
  449.     @active_battler.action.set_skill(@skill.id)
  450.     @skill_window.active = false
  451.     if @skill.need_selection?
  452.       if @skill.for_opponent?
  453.         start_target_enemy_selection
  454.       else
  455.         start_target_actor_selection
  456.       end
  457.     else
  458.       end_skill_selection
  459.       next_actor
  460.     end
  461.   end
  462.   #--------------------------------------------------------------------------
  463.   # * 開始接收物品選擇的指令輸入資訊
  464.   #--------------------------------------------------------------------------
  465.   def start_item_selection
  466.     @help_window = Window_Help.new
  467.     @item_window = Window_Item.new(0, 56, 544, 232)
  468.     @item_window.help_window = @help_window
  469.     @actor_command_window.active = false
  470.   end
  471.   #--------------------------------------------------------------------------
  472.   # * 停止接收物品選擇的指令輸入資訊
  473.   #--------------------------------------------------------------------------
  474.   def end_item_selection
  475.     if @item_window != nil
  476.       @item_window.dispose
  477.       @item_window = nil
  478.       @help_window.dispose
  479.       @help_window = nil
  480.     end
  481.     @actor_command_window.active = true
  482.   end
  483.   #--------------------------------------------------------------------------
  484.   # * 更新物品選擇的指令輸入資訊
  485.   #--------------------------------------------------------------------------
  486.   def update_item_selection
  487.     @item_window.active = true
  488.     @item_window.update
  489.     @help_window.update
  490.     if Input.trigger?(Input::B)
  491.       Sound.play_cancel
  492.       end_item_selection
  493.     elsif Input.trigger?(Input::C)
  494.       @item = @item_window.item
  495.       if @item != nil
  496.         $game_party.last_item_id = @item.id
  497.       end
  498.       if $game_party.item_can_use?(@item)
  499.         Sound.play_decision
  500.         determine_item
  501.       else
  502.         Sound.play_buzzer
  503.       end
  504.     end
  505.   end
  506.   #--------------------------------------------------------------------------
  507.   # * 確認物品此時是否可用
  508.   #--------------------------------------------------------------------------
  509.   def determine_item
  510.     @active_battler.action.set_item(@item.id)
  511.     @item_window.active = false
  512.     if @item.need_selection?
  513.       if @item.for_opponent?
  514.         start_target_enemy_selection
  515.       else
  516.         start_target_actor_selection
  517.       end
  518.     else
  519.       end_item_selection
  520.       next_actor
  521.     end
  522.   end
  523.   #--------------------------------------------------------------------------
  524.   # * 作戰進程開始
  525.   #--------------------------------------------------------------------------
  526.   def process_battle_start
  527.     @message_window.clear
  528.     wait(10)
  529.     for name in $game_troop.enemy_names
  530.       text = sprintf(Vocab::Emerge, name)
  531.       $game_message.texts.push(text)
  532.     end
  533.     if $game_troop.preemptive
  534.       text = sprintf(Vocab::Preemptive, $game_party.name)
  535.       $game_message.texts.push(text)
  536.     elsif $game_troop.surprise
  537.       text = sprintf(Vocab::Surprise, $game_party.name)
  538.       $game_message.texts.push(text)
  539.     end
  540.     wait_for_message
  541.     @message_window.clear
  542.     make_escape_ratio
  543.     process_battle_event
  544.     start_party_command_selection
  545.   end
  546.   #--------------------------------------------------------------------------
  547.   # * 生成撤退比率
  548.   #--------------------------------------------------------------------------
  549.   def make_escape_ratio
  550.     actors_agi = $game_party.average_agi
  551.     enemies_agi = $game_troop.average_agi
  552.     @escape_ratio = 150 - 100 * enemies_agi / actors_agi
  553.   end
  554.   #--------------------------------------------------------------------------
  555.   # * 關於撤退的處理
  556.   #--------------------------------------------------------------------------
  557.   def process_escape
  558.     @info_viewport.visible = false
  559.     @message_window.visible = true
  560.     text = sprintf(Vocab::EscapeStart, $game_party.name)
  561.     $game_message.texts.push(text)
  562.     if $game_troop.preemptive
  563.       success = true
  564.     else
  565.       success = (rand(100) < @escape_ratio)
  566.     end
  567.     Sound.play_escape
  568.     if success
  569.       wait_for_message
  570.       battle_end(1)
  571.     else
  572.       @escape_ratio += 10
  573.       $game_message.texts.push('\.' + Vocab::EscapeFailure)
  574.       wait_for_message
  575.       $game_party.clear_actions
  576.       start_main
  577.     end
  578.   end
  579.   #--------------------------------------------------------------------------
  580.   # * 關於作戰勝利的處理
  581.   #--------------------------------------------------------------------------
  582.   def process_victory
  583.     @info_viewport.visible = false
  584.     @message_window.visible = true
  585.     RPG::BGM.stop
  586.     $game_system.battle_end_me.play
  587.     unless $BTEST
  588.       $game_temp.map_bgm.play
  589.       $game_temp.map_bgs.play
  590.     end
  591.     display_exp_and_gold
  592.     display_drop_items
  593.     display_level_up
  594.     battle_end(0)
  595.   end
  596.   #--------------------------------------------------------------------------
  597.   # * 顯示所獲得的經驗值和敵人掉落的資金
  598.   #--------------------------------------------------------------------------
  599.   def display_exp_and_gold
  600.     exp = $game_troop.exp_total
  601.     gold = $game_troop.gold_total
  602.     $game_party.gain_gold(gold)
  603.     text = sprintf(Vocab::Victory, $game_party.name)
  604.     $game_message.texts.push('\|' + text)
  605.     if exp > 0
  606.       text = sprintf(Vocab::ObtainExp, exp)
  607.       $game_message.texts.push('\.' + text)
  608.     end
  609.     if gold > 0
  610.       text = sprintf(Vocab::ObtainGold, gold, Vocab::gold)
  611.       $game_message.texts.push('\.' + text)
  612.     end
  613.     wait_for_message
  614.   end
  615.   #--------------------------------------------------------------------------
  616.   # * 顯示所獲得的敵人掉落的物品
  617.   #--------------------------------------------------------------------------
  618.   def display_drop_items
  619.     drop_items = $game_troop.make_drop_items
  620.     for item in drop_items
  621.       $game_party.gain_item(item, 1)
  622.       text = sprintf(Vocab::ObtainItem, item.name)
  623.       $game_message.texts.push(text)
  624.     end
  625.     wait_for_message
  626.   end
  627.   #--------------------------------------------------------------------------
  628.   # * 顯示等級提升訊息
  629.   #--------------------------------------------------------------------------
  630.   def display_level_up
  631.     exp = $game_troop.exp_total
  632.     for actor in $game_party.existing_members
  633.       last_level = actor.level
  634.       last_skills = actor.skills
  635.       actor.gain_exp(exp, true)
  636.     end
  637.     wait_for_message
  638.   end
  639.   #--------------------------------------------------------------------------
  640.   # * 關於作戰失敗的處理
  641.   #--------------------------------------------------------------------------
  642.   def process_defeat
  643.     @info_viewport.visible = false
  644.     @message_window.visible = true
  645.     text = sprintf(Vocab::Defeat, $game_party.name)
  646.     $game_message.texts.push(text)
  647.     wait_for_message
  648.     battle_end(2)
  649.   end
  650.   #--------------------------------------------------------------------------
  651.   # * 執行畫面切換
  652.   #--------------------------------------------------------------------------
  653.   def update_scene_change
  654.     case $game_temp.next_scene
  655.     when "map"
  656.       call_map
  657.     when "gameover"
  658.       call_gameover
  659.     when "title"
  660.       call_title
  661.     else
  662.       $game_temp.next_scene = nil
  663.     end
  664.   end
  665.   #--------------------------------------------------------------------------
  666.   # * 切換至地圖場景畫面
  667.   #--------------------------------------------------------------------------
  668.   def call_map
  669.     $game_temp.next_scene = nil
  670.     battle_end(1)
  671.   end
  672.   #--------------------------------------------------------------------------
  673.   # * 切換至GAMEOVER畫面
  674.   #--------------------------------------------------------------------------
  675.   def call_gameover
  676.     $game_temp.next_scene = nil
  677.     $scene = Scene_Gameover.new
  678.     @message_window.clear
  679.   end
  680.   #--------------------------------------------------------------------------
  681.   # * 切換至標題畫面
  682.   #--------------------------------------------------------------------------
  683.   def call_title
  684.     $game_temp.next_scene = nil
  685.     $scene = Scene_Title.new
  686.     @message_window.clear
  687.     Graphics.fadeout(60)
  688.   end
  689.   #--------------------------------------------------------------------------
  690.   # * 開始執行作戰程式
  691.   #--------------------------------------------------------------------------
  692.   def start_main
  693.     $game_troop.increase_turn
  694.     @info_viewport.visible = false
  695.     @info_viewport.ox = 0
  696.     @message_window.visible = true
  697.     @party_command_window.active = false
  698.     @actor_command_window.active = false
  699.     @status_window.index = @actor_index = -1
  700.     @active_battler = nil
  701.     @message_window.clear
  702.     $game_troop.make_actions
  703.     make_action_orders
  704.     wait(20)
  705.   end
  706.   #--------------------------------------------------------------------------
  707.   # * 創建行為指令
  708.   #--------------------------------------------------------------------------
  709.   def make_action_orders
  710.     @action_battlers = []
  711.     unless $game_troop.surprise
  712.       @action_battlers += $game_party.members
  713.     end
  714.     unless $game_troop.preemptive
  715.       @action_battlers += $game_troop.members
  716.     end
  717.     for battler in @action_battlers
  718.       battler.action.make_speed
  719.     end
  720.     @action_battlers.sort! do |a,b|
  721.       b.action.speed - a.action.speed
  722.     end
  723.   end
  724.   #--------------------------------------------------------------------------
  725.   # * 作戰行為處理
  726.   #--------------------------------------------------------------------------
  727.   def process_action
  728.     return if judge_win_loss
  729.     return if $game_temp.next_scene != nil
  730.     set_next_active_battler
  731.     if @active_battler == nil
  732.       turn_end
  733.       return
  734.     end
  735.     @message_window.clear
  736.     wait(5)
  737.     @active_battler.white_flash = true
  738.     unless @active_battler.action.forcing
  739.       @active_battler.action.prepare
  740.     end
  741.     if @active_battler.action.valid?
  742.       execute_action
  743.     end
  744.     unless @active_battler.action.forcing
  745.       @message_window.clear
  746.       remove_states_auto
  747.       display_current_state
  748.     end
  749.     @active_battler.white_flash = false
  750.     @message_window.clear
  751.   end
  752.   #--------------------------------------------------------------------------
  753.   # * 執行作戰行為
  754.   #--------------------------------------------------------------------------
  755.   def execute_action
  756.     case @active_battler.action.kind
  757.     when 0  # 本能
  758.       case @active_battler.action.basic
  759.       when 0  # 攻擊
  760.         execute_action_attack
  761.       when 1  # 防禦
  762.         execute_action_guard
  763.       when 2  # 撤退
  764.         execute_action_escape
  765.       when 3  # 等待
  766.         execute_action_wait
  767.       end
  768.     when 1  # 技能
  769.       execute_action_skill
  770.     when 2  # 物品
  771.       execute_action_item
  772.     end
  773.   end
  774.   #--------------------------------------------------------------------------
  775.   # * 回合結束
  776.   #--------------------------------------------------------------------------
  777.   def turn_end
  778.     $game_troop.turn_ending = true
  779.     $game_party.slip_damage_effect
  780.     $game_troop.slip_damage_effect
  781.     $game_party.do_auto_recovery
  782.     $game_troop.preemptive = false
  783.     $game_troop.surprise = false
  784.     process_battle_event
  785.     $game_troop.turn_ending = false
  786.     start_party_command_selection
  787.   end
  788.   #--------------------------------------------------------------------------
  789.   # * 安排下一個參戰者的行動
  790.   #    當[強行下達指令……]這條事件指令正在執行的時候,將這個被下達指令的參戰
  791.   #    者從這個調度清單中除名。否則從這個調度清單的頂端讀取並調度行動。
  792.   #    如果調度清單中的參戰者不在場(比如說目標敵人被掛掉而留下了空的編號,或
  793.   #    者我方有主角在[隊伍人事調動]這個事件指令的影響下離開了戰場,或者更多類
  794.   #    似的情況),則直接跳過。
  795.   #--------------------------------------------------------------------------
  796.   def set_next_active_battler
  797.     loop do
  798.       if $game_troop.forcing_battler != nil
  799.         @active_battler = $game_troop.forcing_battler
  800.         @action_battlers.delete(@active_battler)
  801.         $game_troop.forcing_battler = nil
  802.       else
  803.         @active_battler = @action_battlers.shift
  804.       end
  805.       return if @active_battler == nil
  806.       return if @active_battler.index != nil
  807.     end
  808.   end
  809.   #--------------------------------------------------------------------------
  810.   # * 自動解除狀態
  811.   #--------------------------------------------------------------------------
  812.   def remove_states_auto
  813.     last_st = @active_battler.states
  814.     @active_battler.remove_states_auto
  815.     if @active_battler.states != last_st
  816.       wait(5)
  817.       display_state_changes(@active_battler)
  818.       wait(30)
  819.       @message_window.clear
  820.     end
  821.   end
  822.   #--------------------------------------------------------------------------
  823.   # * 顯示當前狀態資訊
  824.   #--------------------------------------------------------------------------
  825.   def display_current_state
  826.     state_text = @active_battler.most_important_state_text
  827.     unless state_text.empty?
  828.       wait(5)
  829.       text = @active_battler.name + state_text
  830.       @message_window.add_instant_text(text)
  831.       wait(45)
  832.       @message_window.clear
  833.     end
  834.   end
  835.   #--------------------------------------------------------------------------
  836.   # * 執行戰鬥行為:攻擊
  837.   #--------------------------------------------------------------------------
  838.   def execute_action_attack
  839.     text = sprintf(Vocab::DoAttack, @active_battler.name)
  840.     @message_window.add_instant_text(text)
  841.     targets = @active_battler.action.make_targets
  842.     display_attack_animation(targets)
  843.     wait(20)
  844.     for target in targets
  845.       target.attack_effect(@active_battler)
  846.       display_action_effects(target)
  847.     end
  848.   end
  849.   #--------------------------------------------------------------------------
  850.   # * 執行戰鬥行為:防禦
  851.   #--------------------------------------------------------------------------
  852.   def execute_action_guard
  853.     text = sprintf(Vocab::DoGuard, @active_battler.name)
  854.     @message_window.add_instant_text(text)
  855.     wait(45)
  856.   end
  857.   #--------------------------------------------------------------------------
  858.   # * 執行戰鬥行為:撤退
  859.   #--------------------------------------------------------------------------
  860.   def execute_action_escape
  861.     text = sprintf(Vocab::DoEscape, @active_battler.name)
  862.     @message_window.add_instant_text(text)
  863.     @active_battler.escape
  864.     Sound.play_escape
  865.     wait(45)
  866.   end
  867.   #--------------------------------------------------------------------------
  868.   # * 執行戰鬥行為:等待
  869.   #--------------------------------------------------------------------------
  870.   def execute_action_wait
  871.     text = sprintf(Vocab::DoWait, @active_battler.name)
  872.     @message_window.add_instant_text(text)
  873.     wait(45)
  874.   end
  875.   #--------------------------------------------------------------------------
  876.   # * 執行戰鬥行為:使用技能
  877.   #--------------------------------------------------------------------------
  878.   def execute_action_skill
  879.     skill = @active_battler.action.skill
  880.     text = @active_battler.name + skill.message1
  881.     @message_window.add_instant_text(text)
  882.     unless skill.message2.empty?
  883.       wait(10)
  884.       @message_window.add_instant_text(skill.message2)
  885.     end
  886.     targets = @active_battler.action.make_targets
  887.     display_animation(targets, skill.animation_id)
  888.     @active_battler.mp -= @active_battler.calc_mp_cost(skill)
  889.     $game_temp.common_event_id = skill.common_event_id
  890.     for target in targets
  891.       target.skill_effect(@active_battler, skill)
  892.       display_action_effects(target, skill)
  893.     end
  894.   end
  895.   #--------------------------------------------------------------------------
  896.   # * 執行戰鬥行為:使用物品
  897.   #--------------------------------------------------------------------------
  898.   def execute_action_item
  899.     item = @active_battler.action.item
  900.     text = sprintf(Vocab::UseItem, @active_battler.name, item.name)
  901.     @message_window.add_instant_text(text)
  902.     targets = @active_battler.action.make_targets
  903.     display_animation(targets, item.animation_id)
  904.     $game_party.consume_item(item)
  905.     $game_temp.common_event_id = item.common_event_id
  906.     for target in targets
  907.       target.item_effect(@active_battler, item)
  908.       display_action_effects(target, item)
  909.     end
  910.   end
  911.   #--------------------------------------------------------------------------
  912.   # * 顯示動畫
  913.   #     targets      : 顯示位置
  914.   #     animation_id : 動畫編號(如果為-1則播放普通攻擊動畫)
  915.   #--------------------------------------------------------------------------
  916.   def display_animation(targets, animation_id)
  917.     if animation_id < 0
  918.       display_attack_animation(targets)
  919.     else
  920.       display_normal_animation(targets, animation_id)
  921.     end
  922.     wait(20)
  923.     wait_for_animation
  924.   end
  925.   #--------------------------------------------------------------------------
  926.   # * 顯示攻擊動畫
  927.   #     targets : 顯示位置
  928.   #    如果是敵人,只播放[敵人攻擊]聲效,然後等待一陣子。
  929.   #    如果是主角則同時考慮到貳刀流主角的情況(左手動畫水準翻轉顯示)
  930.   #--------------------------------------------------------------------------
  931.   def display_attack_animation(targets)
  932.     if @active_battler.is_a?(Game_Enemy)
  933.       Sound.play_enemy_attack
  934.       wait(15, true)
  935.     else
  936.       aid1 = @active_battler.atk_animation_id
  937.       aid2 = @active_battler.atk_animation_id2
  938.       display_normal_animation(targets, aid1, false)
  939.       display_normal_animation(targets, aid2, true)
  940.     end
  941.     wait_for_animation
  942.   end
  943.   #--------------------------------------------------------------------------
  944.   # * 顯示普通動畫
  945.   #     targets      : 顯示位置
  946.   #     animation_id : 動畫編號
  947.   #     mirror       : 水準翻轉
  948.   #--------------------------------------------------------------------------
  949.   def display_normal_animation(targets, animation_id, mirror = false)
  950.     animation = $data_animations[animation_id]
  951.     if animation != nil
  952.       to_screen = (animation.position == 3)       # 動畫顯示基準位置為全螢幕?
  953.       for target in targets.uniq
  954.         target.animation_id = animation_id
  955.         target.animation_mirror = mirror
  956.         wait(20, true) unless to_screen           # 如果是單體動畫,等待
  957.       end
  958.       wait(20, true) if to_screen                 # 如果是全體動畫,等待
  959.     end
  960.   end
  961.   #--------------------------------------------------------------------------
  962.   # * 顯示行動結果
  963.   #     target : 目標參戰者
  964.   #     obj    : 技能或物品
  965.   #--------------------------------------------------------------------------
  966.   def display_action_effects(target, obj = nil)
  967.     unless target.skipped
  968.       line_number = @message_window.line_number
  969.       wait(5)
  970.       display_critical(target, obj)
  971.       display_damage(target, obj)
  972.       display_state_changes(target, obj)
  973.       if line_number == @message_window.line_number
  974.         display_failure(target, obj) unless target.states_active?
  975.       end
  976.       if line_number != @message_window.line_number
  977.         wait(30)
  978.       end
  979.       @message_window.back_to(line_number)
  980.     end
  981.   end
  982.   #--------------------------------------------------------------------------
  983.   # * 顯示會心一擊資訊
  984.   #     target : 目標參戰者
  985.   #     obj    : 技能或物品
  986.   #--------------------------------------------------------------------------
  987.   def display_critical(target, obj = nil)
  988.     if target.critical
  989.       if target.actor?
  990.         text = Vocab::CriticalToActor
  991.       else
  992.         text = Vocab::CriticalToEnemy
  993.       end
  994.       @message_window.add_instant_text(text)
  995.       wait(20)
  996.     end
  997.   end
  998.   #--------------------------------------------------------------------------
  999.   # * 顯示傷害資訊
  1000.   #     target : 目標參戰者
  1001.   #     obj    : 技能或物品
  1002.   #--------------------------------------------------------------------------
  1003.   def display_damage(target, obj = nil)
  1004.     if target.missed
  1005.       display_miss(target, obj)
  1006.     elsif target.evaded
  1007.       display_evasion(target, obj)
  1008.     else
  1009.       display_hp_damage(target, obj)
  1010.       display_mp_damage(target, obj)
  1011.     end
  1012.   end
  1013.   #--------------------------------------------------------------------------
  1014.   # * 顯示落空資訊
  1015.   #     target : 目標參戰者
  1016.   #     obj    : 技能或物品
  1017.   #--------------------------------------------------------------------------
  1018.   def display_miss(target, obj = nil)
  1019.     if obj == nil or obj.physical_attack
  1020.       if target.actor?
  1021.         text = sprintf(Vocab::ActorNoHit, target.name)
  1022.       else
  1023.         text = sprintf(Vocab::EnemyNoHit, target.name)
  1024.       end
  1025.       Sound.play_miss
  1026.     else
  1027.       text = sprintf(Vocab::ActionFailure, target.name)
  1028.     end
  1029.     @message_window.add_instant_text(text)
  1030.     wait(30)
  1031.   end
  1032.   #--------------------------------------------------------------------------
  1033.   # * 顯示撤退資訊
  1034.   #     target : 目標參戰者
  1035.   #     obj    : 技能或物品
  1036.   #--------------------------------------------------------------------------
  1037.   def display_evasion(target, obj = nil)
  1038.     if target.actor?
  1039.       text = sprintf(Vocab::ActorEvasion, target.name)
  1040.     else
  1041.       text = sprintf(Vocab::EnemyEvasion, target.name)
  1042.     end
  1043.     Sound.play_evasion
  1044.     @message_window.add_instant_text(text)
  1045.     wait(30)
  1046.   end
  1047.   #--------------------------------------------------------------------------
  1048.   # * 顯示HP傷害資訊
  1049.   #     target : 目標參戰者
  1050.   #     obj    : 技能或物品
  1051.   #--------------------------------------------------------------------------
  1052.   def display_hp_damage(target, obj = nil)
  1053.     if target.hp_damage == 0                # 無HP傷害
  1054.       return if obj != nil and obj.damage_to_mp
  1055.       return if obj != nil and obj.base_damage == 0
  1056.       fmt = target.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
  1057.       text = sprintf(fmt, target.name)
  1058.     elsif target.absorbed                   # HP被汲取
  1059.       fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
  1060.       text = sprintf(fmt, target.name, Vocab::hp, target.hp_damage)
  1061.     elsif target.hp_damage > 0              # HP傷害
  1062.       if target.actor?
  1063.         text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage)
  1064.         Sound.play_actor_damage
  1065.         $game_troop.screen.start_shake(5, 5, 10)
  1066.       else
  1067.         text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage)
  1068.         Sound.play_enemy_damage
  1069.         target.blink = true
  1070.       end
  1071.     else                                    # HP恢復
  1072.       fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
  1073.       text = sprintf(fmt, target.name, Vocab::hp, -target.hp_damage)
  1074.       Sound.play_recovery
  1075.     end
  1076.     @message_window.add_instant_text(text)
  1077.     wait(30)
  1078.   end
  1079.   #--------------------------------------------------------------------------
  1080.   # * 顯示MP傷害資訊
  1081.   #     target : 目標參戰者
  1082.   #     obj    : 技能或物品
  1083.   #--------------------------------------------------------------------------
  1084.   def display_mp_damage(target, obj = nil)
  1085.     return if target.dead?
  1086.     return if target.mp_damage == 0
  1087.     if target.absorbed                      # MP被汲取
  1088.       fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
  1089.       text = sprintf(fmt, target.name, Vocab::mp, target.mp_damage)
  1090.     elsif target.mp_damage > 0              # MP傷害
  1091.       fmt = target.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss
  1092.       text = sprintf(fmt, target.name, Vocab::mp, target.mp_damage)
  1093.     else                                    # MP恢復
  1094.       fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
  1095.       text = sprintf(fmt, target.name, Vocab::mp, -target.mp_damage)
  1096.       Sound.play_recovery
  1097.     end
  1098.     @message_window.add_instant_text(text)
  1099.     wait(30)
  1100.   end
  1101.   #--------------------------------------------------------------------------
  1102.   # * 顯示狀態改變的資訊
  1103.   #     target : 目標參戰者
  1104.   #     obj    : 技能或物品
  1105.   #--------------------------------------------------------------------------
  1106.   def display_state_changes(target, obj = nil)
  1107.     return if target.missed or target.evaded
  1108.     return unless target.states_active?
  1109.     if @message_window.line_number < 4
  1110.       @message_window.add_instant_text("")
  1111.     end
  1112.     display_added_states(target, obj)
  1113.     display_removed_states(target, obj)
  1114.     display_remained_states(target, obj)
  1115.     if @message_window.last_instant_text.empty?
  1116.       @message_window.back_one
  1117.     else
  1118.       wait(10)
  1119.     end
  1120.   end
  1121.   #--------------------------------------------------------------------------
  1122.   # * 顯示被附加的狀態的訊息
  1123.   #     target : 目標參戰者
  1124.   #     obj    : 技能或物品
  1125.   #--------------------------------------------------------------------------
  1126.   def display_added_states(target, obj = nil)
  1127.     for state in target.added_states
  1128.       if target.actor?
  1129.         next if state.message1.empty?
  1130.         text = target.name + state.message1
  1131.       else
  1132.         next if state.message2.empty?
  1133.         text = target.name + state.message2
  1134.       end
  1135.       if state.id == 1                      # 瀕死?
  1136.         target.perform_collapse
  1137.       end
  1138.       @message_window.replace_instant_text(text)
  1139.       wait(20)
  1140.     end
  1141.   end
  1142.   #--------------------------------------------------------------------------
  1143.   # * 顯示被解除的狀態的訊息
  1144.   #     target : 目標參戰者
  1145.   #     obj    : 技能或物品
  1146.   #--------------------------------------------------------------------------
  1147.   def display_removed_states(target, obj = nil)
  1148.     for state in target.removed_states
  1149.       next if state.message4.empty?
  1150.       text = target.name + state.message4
  1151.       @message_window.replace_instant_text(text)
  1152.       wait(20)
  1153.     end
  1154.   end
  1155.   #--------------------------------------------------------------------------
  1156.   # * 顯示持續存在的狀態的訊息
  1157.   #     target : 目標參戰者
  1158.   #     obj    : 技能或物品
  1159.   #    用於催眠某個睡眠狀態的參戰者等情況。
  1160.   #--------------------------------------------------------------------------
  1161.   def display_remained_states(target, obj = nil)
  1162.     for state in target.remained_states
  1163.       next if state.message3.empty?
  1164.       text = target.name + state.message3
  1165.       @message_window.replace_instant_text(text)
  1166.       wait(20)
  1167.     end
  1168.   end
  1169.   #--------------------------------------------------------------------------
  1170.   # * 顯示失敗訊息
  1171.   #     target : 目標參戰者(主角)
  1172.   #     obj    : 技能或物品
  1173.   #--------------------------------------------------------------------------
  1174.   def display_failure(target, obj)
  1175.     text = sprintf(Vocab::ActionFailure, target.name)
  1176.     @message_window.add_instant_text(text)
  1177.     wait(20)
  1178.   end
  1179. end
复制代码

点评

抱歉,提问已过期,若想要继续获得解答请重开帖子  发表于 2012-5-17 00:20
请修改图片链接,百度不支持外链  发表于 2012-5-1 20:20

Lv1.梦旅人

沉睡的八宝粥 

梦石
0
星屑
64
在线时间
832 小时
注册时间
2011-4-22
帖子
2996

短篇七萝莉正太组季军

2
发表于 2012-5-1 18:34:05 | 只看该作者
用添加代码功能就能有行数了
你的那个图片失效了。
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
235
在线时间
8 小时
注册时间
2012-4-30
帖子
4
3
 楼主| 发表于 2012-5-2 11:36:14 | 只看该作者
图片内容如下,我手打出来了。

脚本节:'scene_battle',行数15:发生了NameError。
uninitialized constant Scene_battle::Window_battleMessage
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-26 12:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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