Project1

标题: CP制战斗系统的另种写法。。。。。。 [打印本页]

作者: slick    时间: 2008-11-14 08:12
标题: CP制战斗系统的另种写法。。。。。。
本帖最后由 slick 于 2009-8-30 16:51 编辑

  1. #VX CP制战斗系统 V 1.00 BY SLICK

  2. #==============================================================================
  3. # ■ Game_Battler
  4. #------------------------------------------------------------------------------
  5. #  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
  6. # 超级类来使用。
  7. #==============================================================================

  8. class Game_Battler
  9.   attr_accessor :cp
  10.   attr_accessor :turn_count
  11.   attr_accessor :my_turn    #轮到这个家伙行动了吗?
  12.   alias neoinitialize initialize
  13.   def initialize
  14.     @cp = 0
  15.     @turn_count = 0
  16.     @my_turn = false
  17.     neoinitialize
  18.   end
  19.   #--------------------------------------------------------------------------
  20.   # ● 可以输入命令判定
  21.   #--------------------------------------------------------------------------
  22.   def inputable?
  23.     if @my_turn
  24.       return (not @hidden and restriction <= 1)
  25.     else
  26.       return false
  27.     end
  28.   end
  29. end

  30. #==============================================================================
  31. # ■ Game_Troop
  32. #------------------------------------------------------------------------------
  33. #  处理敌人队伍和战斗相关资料的类,也可执行如战斗事件管理之类的功能。
  34. # 本类的实例请参考 $game_troop。
  35. #==============================================================================

  36. class Game_Troop < Game_Unit
  37.   #--------------------------------------------------------------------------
  38.   # ● 增加回合数
  39.   #--------------------------------------------------------------------------
  40.   def increase_turn(enemy)
  41.     for page in troop.pages
  42.       if page.span == 1
  43.         @event_flags= false
  44.       end
  45.     end
  46.     enemy.turn_count += 1
  47.     aaa = []
  48.     for iii in $game_troop.members
  49.       aaa.push(iii.turn_count)
  50.     end
  51.     @turn_count = aaa.min
  52.   end
  53.   #--------------------------------------------------------------------------
  54.   # ● 生成战斗行动
  55.   #--------------------------------------------------------------------------
  56.   def make_actions(enemy)
  57.     enemy.make_action
  58.   end
  59. end

  60. #==============================================================================
  61. # ■ Scene_Battle
  62. #------------------------------------------------------------------------------
  63. #  处理战斗画面的类。
  64. #==============================================================================

  65. class Scene_Battle < Scene_Base
  66.   #--------------------------------------------------------------------------
  67.   # ● 生成资讯显示端口
  68.   #--------------------------------------------------------------------------
  69.   alias neocreate_info_viewport create_info_viewport
  70.   def create_info_viewport
  71.     @info_viewport = Viewport.new(0, 256, 544, 160)
  72.     @info_viewport.z = 100
  73.     @status_window = Window_BattleStatus.new
  74.     @party_command_window = Window_PartyCommand.new
  75.     @actor_command_window = Window_ActorCommand.new
  76.     @status_window.viewport = @info_viewport
  77.     @party_command_window.viewport = @info_viewport
  78.     @actor_command_window.viewport = @info_viewport
  79.     @party_command_window.y = 32
  80.     @actor_command_window.y = 8
  81.     @status_window.x = 128
  82.     @status_window.y = 32
  83.     @actor_command_window.x = 544
  84.     @info_viewport.visible = false
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # ● 开始处理
  88.   #--------------------------------------------------------------------------
  89.   def start
  90.     super
  91.     $game_temp.in_battle = true
  92.     @spriteset = Spriteset_Battle.new
  93.     @message_window = Window_BattleMessage.new
  94.     @action_battlers = []
  95.     # 清空CP,所有人从零开始
  96.     for iii in $game_party.members + $game_troop.members
  97.       iii.cp = 0
  98.     end
  99.     for iii in $game_party.members + $game_troop.members
  100.       iii.turn_count = 0
  101.     end
  102.     # 谁的CP到顶了,谁才能动
  103.     @enable_go = nil
  104.     create_info_viewport
  105.   end
  106.   #--------------------------------------------------------------------------
  107.   # ● 更新画面
  108.   #--------------------------------------------------------------------------
  109.   def update
  110.     super
  111.     update_basic(true)
  112.     update_info_viewport                  # 更新资讯显示端口
  113.     if $game_message.visible
  114.       @info_viewport.visible = false
  115.       @message_window.visible = true
  116.     end
  117.     unless $game_message.visible          # 除非讯息显示中
  118.       return if judge_win_loss            # 判断胜负结果
  119.       update_scene_change
  120.       if @target_enemy_window != nil
  121.         update_target_enemy_selection     # 选择目标敌人
  122.       elsif @target_actor_window != nil
  123.         update_target_actor_selection     # 选择目标角色
  124.       elsif @skill_window != nil
  125.         update_skill_selection            # 选择技能
  126.       elsif @item_window != nil
  127.         update_item_selection             # 选择物品
  128.       elsif @party_command_window.active
  129.         update_party_command_selection    # 选择队伍命令
  130.       elsif @actor_command_window.active
  131.         update_actor_command_selection    # 选择角色命令
  132.       else
  133. # 等待:每个人的CP向前添加 =====================================================
  134.         fullflag = false
  135.         for iii in $game_troop.members + $game_party.members
  136.           iii.cp += iii.agi * 10
  137.           if iii.cp >= 5000
  138.             iii.cp -= 5000
  139.             @enable_go = iii
  140.             iii.my_turn = true
  141.             fullflag = true
  142.             break
  143.           end         
  144.         end
  145. # ==============================================================================
  146.         unless fullflag
  147.           return
  148.         end
  149.         process_battle_event              # 战斗事件处理
  150.         process_action                    # 战斗行动        
  151.         process_battle_event              # 战斗事件处理
  152.         if @enable_go.is_a?(Game_Actor)
  153.           @status_window.refresh
  154.           start_party_command_selection
  155.         else
  156.           $game_troop.make_actions(@enable_go)
  157.           start_main
  158.         end
  159.         @enable_go = nil
  160.       end
  161.     end
  162.   end
  163.   #--------------------------------------------------------------------------
  164.   # ● 开始队伍命令选择
  165.   #--------------------------------------------------------------------------
  166.   def start_party_command_selection
  167.     if $game_temp.in_battle
  168.       @status_window.refresh
  169.       @status_window.index = @actor_index = -1
  170.       @active_battler = nil      
  171.       @message_window.visible = false
  172.       @party_command_window.active = false
  173.       @party_command_window.visible = false
  174.       @party_command_window.index = 0
  175.       @actor_command_window.active = true
  176.       $game_party.clear_actions
  177.       next_actor
  178.       @info_viewport.visible = true
  179.       if $game_troop.surprise or not $game_party.inputable?
  180.         start_main
  181.       end
  182.     end
  183.   end
  184.   #--------------------------------------------------------------------------
  185.   # ● 更新角色命令选择
  186.   #--------------------------------------------------------------------------
  187.   def update_actor_command_selection
  188.     if Input.trigger?(Input::B)
  189.       Sound.play_cancel
  190.       prior_actor
  191.     elsif Input.trigger?(Input::C)
  192.       case @actor_command_window.index
  193.       when 0  # 攻击
  194.         Sound.play_decision
  195.         @active_battler.action.set_attack
  196.         start_target_enemy_selection
  197.       when 1  # 技能
  198.         Sound.play_decision
  199.         start_skill_selection
  200.       when 2  # 防御
  201.         Sound.play_decision
  202.         @active_battler.action.set_guard
  203.         next_actor
  204.       when 3  # 物品
  205.         Sound.play_decision
  206.         start_item_selection
  207.       when 4  # 逃跑
  208.         if $game_troop.can_escape == false
  209.           Sound.play_buzzer
  210.           return
  211.         end
  212.         Sound.play_decision
  213.         process_escape
  214.       end
  215.     end
  216.   end
  217.   #--------------------------------------------------------------------------
  218.   # ● 开始敌人目标选择
  219.   #--------------------------------------------------------------------------
  220.   alias neostart_target_enemy_selection start_target_enemy_selection
  221.   def start_target_enemy_selection
  222.     neostart_target_enemy_selection
  223.     @target_enemy_window.y = @info_viewport.rect.y + 32
  224.   end
  225.   #--------------------------------------------------------------------------
  226.   # ● 开始同伴目标选择
  227.   #--------------------------------------------------------------------------
  228.   alias neostart_target_actor_selection start_target_actor_selection
  229.   def start_target_actor_selection
  230.     neostart_target_actor_selection
  231.     @target_actor_window.y = @info_viewport.rect.y + 32
  232.   end
  233.   #--------------------------------------------------------------------------
  234.   # ● 开始执行战斗处理
  235.   #--------------------------------------------------------------------------
  236.   def start_main
  237.     for member in $game_troop.members
  238.       $game_troop.increase_turn(member)
  239.     end
  240.     @info_viewport.visible = false
  241.     @info_viewport.ox = 0
  242.     @message_window.visible = true
  243.     @party_command_window.active = false
  244.     @actor_command_window.active = false
  245.     @status_window.index = @actor_index = -1
  246.     @active_battler = nil
  247.     @message_window.clear
  248.     for member in $game_troop.members
  249.       $game_troop.make_actions(member)
  250.     end
  251.     make_action_orders
  252.     wait(20)
  253.   end
  254.   #--------------------------------------------------------------------------
  255.   # ● 生成行动顺序
  256.   #--------------------------------------------------------------------------
  257.   def make_action_orders
  258.     @action_battlers = []
  259.     for iii in $game_troop.members + $game_party.members
  260.       if iii.my_turn
  261.         @action_battlers.push(iii)
  262.         iii.my_turn = false
  263.       end
  264.     end
  265.   end
  266.   #--------------------------------------------------------------------------
  267.   # ● 回合结束
  268.   #--------------------------------------------------------------------------
  269.   def turn_end
  270.     $game_troop.turn_ending = true
  271.     $game_party.slip_damage_effect
  272.     $game_troop.slip_damage_effect
  273.     $game_party.do_auto_recovery
  274.     $game_troop.preemptive = false
  275.     $game_troop.surprise = false
  276.     process_battle_event
  277.     $game_troop.turn_ending = false
  278.   end  
  279. end

  280. #==============================================================================
  281. # ■ Window_ActorCommand
  282. #------------------------------------------------------------------------------
  283. #  选择角色命令(如「攻击」或「技能」)的窗口。
  284. #==============================================================================

  285. class Window_ActorCommand < Window_Command
  286.   #--------------------------------------------------------------------------
  287.   # ● 初始化对像
  288.   #--------------------------------------------------------------------------
  289.   def initialize
  290.     super(128, [], 1, 5)
  291.     self.active = false
  292.   end
  293.   #--------------------------------------------------------------------------
  294.   # ● 设置
  295.   #     actor : 角色
  296.   #--------------------------------------------------------------------------
  297.   def setup(actor)
  298.     s1 = Vocab::attack
  299.     s2 = Vocab::skill
  300.     s3 = Vocab::guard
  301.     s4 = Vocab::item
  302.     s5 = Vocab::escape
  303.     if actor.class.skill_name_valid     # 是否指定职业技能文字
  304.       s2 = actor.class.skill_name       # 替换「技能」命令文字
  305.     end
  306.     @commands = [s1, s2, s3, s4, s5]
  307.     @item_max = 5
  308.     refresh
  309.     self.index = 0
  310.   end
  311. end
复制代码


我对拉尔夫战记的CP即时制战斗系统比较感兴趣,,,于是自己也想琢磨着写一个{/gg}

这个战斗系统的算法借鉴的是RMXP的CP制战斗系统算法

程序好像也过于简单了点儿只有300多行

http://rpg.blue/upload_program/d ... 时CP_107050111.rar
作者: 地龙    时间: 2008-11-15 01:46
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-11-15 04:00
LS不要引用整个脚本 = =
作者: zh99998    时间: 2008-11-15 04:51
执法真严{/fd}
作者: 精灵使者    时间: 2008-11-15 18:18
编辑好了。
解除屏蔽之
这个系统可以做为好多系统的核心部分。
作者: 千落樱·念晓    时间: 2008-11-15 18:57
话说…已经能兼容那个横版了么?
作者: 精灵使者    时间: 2008-11-15 19:12
以下引用千落樱·念晓于2008-11-15 10:57:53的发言:

话说…已经能兼容那个横版了么?

精灵也想考虑那个sideview了……
p.s.这个横板脚本已经交给slick了,相信很快就有结果。
作者: 海之彼岸    时间: 2008-12-27 00:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: 周子民    时间: 2008-12-27 02:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: ONEWateR    时间: 2008-12-29 00:12
没有cp条给人的感觉比较空荡。
作者: 精灵使者    时间: 2008-12-29 00:17
以下引用ONEWateR于2008-12-28 16:12:18的发言:

没有cp条给人的感觉比较空荡。

那可不一定呢。
很多回合制系统,就采用的是无CP条的战斗模式(选择即行动),而不是默认RMXP的(统一选择完毕以后行动)的说。
作者: 风魔乱舞    时间: 2009-2-9 00:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: slick    时间: 2009-6-12 08:00
以下引用海之彼岸于2008-12-26 16:31:56的发言:

怎么让CP条显示出来?
以下引用周子民于2008-12-26 18:53:50的发言:

是哦,怎样显示CP条


这部分脚本是没有CP条绘制的,比较完善的版本见这个:

http://rpg.blue/viewthread.php?tid=110309




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