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

Project1

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

[已经过期] 如何在CP战斗脚本里添加一个新的类Game_Pet ?

 关闭 [复制链接]

Lv4.逐梦者

梦石
3
星屑
6420
在线时间
1131 小时
注册时间
2007-12-26
帖子
2402
跳转到指定楼层
1
发表于 2011-8-26 12:51:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
柳柳的宠物脚本就是那个是把宠物装备在角色身上的,可能由于把宠物定义为一个新的类Game_Pet,所以与CP战斗冲突,宠物装备后在战斗中没有任何反应,我想应该要在CP制御脚本中相应地添加关于宠物的类,请教具体应该怎么写?


宠物脚本
  1. class Game_BattleAction
  2.   #--------------------------------------------------------------------------
  3.   # ● 随机目标 (敌人用)
  4.   #--------------------------------------------------------------------------
  5.   def decide_random_target_for_pet
  6.     # 效果范围的分支
  7.     if for_one_friend_hp0?
  8.       battler = $game_party.random_target_actor_hp0
  9.     elsif for_one_friend?
  10.       battler = $game_party.random_target_actor
  11.     else
  12.       battler = $game_troop.random_target_enemy
  13.     end
  14.     # 对像存在的话取得索引、
  15.     # 对像不存在的场合下清除行动
  16.     if battler != nil
  17.       @target_index = battler.index
  18.     else
  19.       clear
  20.     end
  21.   end
  22. end


  23. #==============================================================================
  24. # ■ Game_Actor
  25. #------------------------------------------------------------------------------
  26. #  处理角色的类。本类在 Game_Actors 类 ($game_actors)
  27. # 的内部使用、Game_Party 类请参考 ($game_party) 。
  28. #==============================================================================
  29. class Game_Actor < Game_Battler
  30.   attr_accessor :pet_id                  # 宠物的敌人ID号
  31.   #--------------------------------------------------------------------------
  32.   # ● 初始化对像
  33.   #     actor_id : 角色 ID
  34.   #--------------------------------------------------------------------------
  35.   def initialize(actor_id)
  36.     super()
  37.     #########################################################################
  38.     @pet_id = 0
  39.     #########################################################################
  40.     setup(actor_id)
  41.   end
  42. end


  43. #==============================================================================
  44. # ■ Game_Pet
  45. #------------------------------------------------------------------------------
  46. #  处理宠物的类,专用。
  47. #==============================================================================
  48. class Game_Pet < Game_Battler
  49.   #--------------------------------------------------------------------------
  50.   # ● 初始化对像
  51.   #     troop_id     : 循环 ID
  52.   #     member_index : 循环成员的索引
  53.   #--------------------------------------------------------------------------
  54.   def initialize(enemy_id)
  55.     super()
  56.     @enemy_id = enemy_id
  57.     enemy = $data_enemies[@enemy_id]
  58.     @battler_name = enemy.battler_name
  59.     @battler_hue = enemy.battler_hue
  60.     @hp = maxhp
  61.     @sp = maxsp
  62.   end
  63.   #--------------------------------------------------------------------------
  64.   # ● 获取敌人 ID
  65.   #--------------------------------------------------------------------------
  66.   def id
  67.     return @enemy_id
  68.   end
  69.   #--------------------------------------------------------------------------
  70.   # ● 获取索引
  71.   #--------------------------------------------------------------------------
  72.   def index
  73.     return @member_index
  74.   end
  75.   #--------------------------------------------------------------------------
  76.   # ● 获取名称
  77.   #--------------------------------------------------------------------------
  78.   def name
  79.     return $data_enemies[@enemy_id].name
  80.   end
  81.   #--------------------------------------------------------------------------
  82.   # ● 获取基本 MaxHP
  83.   #--------------------------------------------------------------------------
  84.   def base_maxhp
  85.     return $data_enemies[@enemy_id].maxhp
  86.   end
  87.   #--------------------------------------------------------------------------
  88.   # ● 获取基本 MaxSP
  89.   #--------------------------------------------------------------------------
  90.   def base_maxsp
  91.     return $data_enemies[@enemy_id].maxsp
  92.   end
  93.   #--------------------------------------------------------------------------
  94.   # ● 获取基本力量
  95.   #--------------------------------------------------------------------------
  96.   def base_str
  97.     return $data_enemies[@enemy_id].str
  98.   end
  99.   #--------------------------------------------------------------------------
  100.   # ● 获取基本灵巧
  101.   #--------------------------------------------------------------------------
  102.   def base_dex
  103.     return $data_enemies[@enemy_id].dex
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # ● 获取基本速度
  107.   #--------------------------------------------------------------------------
  108.   def base_agi
  109.     return $data_enemies[@enemy_id].agi
  110.   end
  111.   #--------------------------------------------------------------------------
  112.   # ● 获取基本魔力
  113.   #--------------------------------------------------------------------------
  114.   def base_int
  115.     return $data_enemies[@enemy_id].int
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● 获取基本攻击力
  119.   #--------------------------------------------------------------------------
  120.   def base_atk
  121.     return $data_enemies[@enemy_id].atk
  122.   end
  123.   #--------------------------------------------------------------------------
  124.   # ● 获取基本物理防御
  125.   #--------------------------------------------------------------------------
  126.   def base_pdef
  127.     return $data_enemies[@enemy_id].pdef
  128.   end
  129.   #--------------------------------------------------------------------------
  130.   # ● 获取基本魔法防御
  131.   #--------------------------------------------------------------------------
  132.   def base_mdef
  133.     return $data_enemies[@enemy_id].mdef
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # ● 获取基本回避修正
  137.   #--------------------------------------------------------------------------
  138.   def base_eva
  139.     return $data_enemies[@enemy_id].eva
  140.   end
  141.   #--------------------------------------------------------------------------
  142.   # ● 普通攻击 获取攻击方动画 ID
  143.   #--------------------------------------------------------------------------
  144.   def animation1_id
  145.     return $data_enemies[@enemy_id].animation1_id
  146.   end
  147.   #--------------------------------------------------------------------------
  148.   # ● 普通攻击 获取对像方动画 ID
  149.   #--------------------------------------------------------------------------
  150.   def animation2_id
  151.     return $data_enemies[@enemy_id].animation2_id
  152.   end
  153.   #--------------------------------------------------------------------------
  154.   # ● 获取属性修正值
  155.   #     element_id : 属性 ID
  156.   #--------------------------------------------------------------------------
  157.   def element_rate(element_id)
  158.     # 获取对应属性有效度的数值
  159.     table = [0,200,150,100,50,0,-100]
  160.     result = table[$data_enemies[@enemy_id].element_ranks[element_id]]
  161.     # 状态能防御本属性的情况下效果减半
  162.     for i in @states
  163.       if $data_states[i].guard_element_set.include?(element_id)
  164.         result /= 2
  165.       end
  166.     end
  167.     # 过程结束
  168.     return result
  169.   end
  170.   #--------------------------------------------------------------------------
  171.   # ● 获取属性有效度
  172.   #--------------------------------------------------------------------------
  173.   def state_ranks
  174.     return $data_enemies[@enemy_id].state_ranks
  175.   end
  176.   #--------------------------------------------------------------------------
  177.   # ● 属性防御判定
  178.   #     state_id : 状态 ID
  179.   #--------------------------------------------------------------------------
  180.   def state_guard?(state_id)
  181.     return false
  182.   end
  183.   #--------------------------------------------------------------------------
  184.   # ● 获取普通攻击属性
  185.   #--------------------------------------------------------------------------
  186.   def element_set
  187.     return []
  188.   end
  189.   #--------------------------------------------------------------------------
  190.   # ● 获取普通攻击的状态变化 (+)
  191.   #--------------------------------------------------------------------------
  192.   def plus_state_set
  193.     return []
  194.   end
  195.   #--------------------------------------------------------------------------
  196.   # ● 获取普通攻击的状态变化 (-)
  197.   #--------------------------------------------------------------------------
  198.   def minus_state_set
  199.     return []
  200.   end
  201.   #--------------------------------------------------------------------------
  202.   # ● 获取行动
  203.   #--------------------------------------------------------------------------
  204.   def actions
  205.     return $data_enemies[@enemy_id].actions
  206.   end
  207.   #--------------------------------------------------------------------------
  208.   # ● 获取 EXP
  209.   #--------------------------------------------------------------------------
  210.   def exp
  211.     return $data_enemies[@enemy_id].exp
  212.   end
  213.   #--------------------------------------------------------------------------
  214.   # ● 获取金钱
  215.   #--------------------------------------------------------------------------
  216.   def gold
  217.     return $data_enemies[@enemy_id].gold
  218.   end
  219.   #--------------------------------------------------------------------------
  220.   # ● 获取物品 ID
  221.   #--------------------------------------------------------------------------
  222.   def item_id
  223.     return $data_enemies[@enemy_id].item_id
  224.   end
  225.   #--------------------------------------------------------------------------
  226.   # ● 获取武器 ID
  227.   #--------------------------------------------------------------------------
  228.   def weapon_id
  229.     return $data_enemies[@enemy_id].weapon_id
  230.   end
  231.   #--------------------------------------------------------------------------
  232.   # ● 获取放具 ID
  233.   #--------------------------------------------------------------------------
  234.   def armor_id
  235.     return $data_enemies[@enemy_id].armor_id
  236.   end
  237.   #--------------------------------------------------------------------------
  238.   # ● 获取宝物出现率
  239.   #--------------------------------------------------------------------------
  240.   def treasure_prob
  241.     return $data_enemies[@enemy_id].treasure_prob
  242.   end
  243.   #--------------------------------------------------------------------------
  244.   # ● 逃跑
  245.   #--------------------------------------------------------------------------
  246.   def escape
  247.     # 设置击中标志
  248.     @hidden = true
  249.     # 清除当前行动
  250.     self.current_action.clear
  251.   end
  252.   #--------------------------------------------------------------------------
  253.   # ● 变身
  254.   #     enemy_id : 变身为的敌人 ID
  255.   #--------------------------------------------------------------------------
  256.   def transform(enemy_id)
  257.     # 更改敌人 ID
  258.     @enemy_id = enemy_id
  259.     # 更改战斗图形
  260.     @battler_name = $data_enemies[@enemy_id].battler_name
  261.     @battler_hue = $data_enemies[@enemy_id].battler_hue
  262.     # 在生成行动
  263.     make_action
  264.   end
  265.   #--------------------------------------------------------------------------
  266.   # ● 生成行动
  267.   #--------------------------------------------------------------------------
  268.   def make_action
  269.     # 清除当前行动
  270.     self.current_action.clear
  271.     # 无法行动的情况
  272.     unless self.movable?
  273.       # 过程结束
  274.       return
  275.     end
  276.     # 抽取现在有效的行动
  277.     available_actions = []
  278.     rating_max = 0
  279.     for action in self.actions
  280.       # 确认回合条件
  281.       n = $game_temp.battle_turn
  282.       a = action.condition_turn_a
  283.       b = action.condition_turn_b
  284.       if (b == 0 and n != a) or
  285.          (b > 0 and (n < 1 or n < a or n % b != a % b))
  286.         next
  287.       end
  288.       # 确认 HP 条件
  289.       if self.hp * 100.0 / self.maxhp > action.condition_hp
  290.         next
  291.       end
  292.       # 确认等级条件
  293.       if $game_party.max_level < action.condition_level
  294.         next
  295.       end
  296.       # 确认开关条件
  297.       switch_id = action.condition_switch_id
  298.       if switch_id > 0 and $game_switches[switch_id] == false
  299.         next
  300.       end
  301.       # 符合条件 : 添加本行动
  302.       available_actions.push(action)
  303.       if action.rating > rating_max
  304.         rating_max = action.rating
  305.       end
  306.     end
  307.     # 最大概率值作为 3 合计计算(0 除外)
  308.     ratings_total = 0
  309.     for action in available_actions
  310.       if action.rating > rating_max - 3
  311.         ratings_total += action.rating - (rating_max - 3)
  312.       end
  313.     end
  314.     # 概率合计不为 0 的情况下
  315.     if ratings_total > 0
  316.       # 生成随机数
  317.       value = rand(ratings_total)
  318.       # 设置对应生成随机数的当前行动
  319.       for action in available_actions
  320.         if action.rating > rating_max - 3
  321.           if value < action.rating - (rating_max - 3)
  322.             self.current_action.kind = action.kind
  323.             self.current_action.basic = action.basic
  324.             self.current_action.skill_id = action.skill_id
  325.             self.current_action.decide_random_target_for_pet
  326.             return
  327.           else
  328.             value -= action.rating - (rating_max - 3)
  329.           end
  330.         end
  331.       end
  332.     end
  333.   end
  334. end


  335. #==============================================================================
  336. # ■ Sprite_Pet
  337. #——————————————————————————————————————
  338. # 全新定义
  339. #==============================================================================
  340. class Sprite_Pet < RPG::Sprite
  341.   #--------------------------------------------------------------------------
  342.   # ● 定义实例变量
  343.   #--------------------------------------------------------------------------
  344.   attr_accessor :battler                  # 战斗者
  345.   #--------------------------------------------------------------------------
  346.   # ● 初始化对像
  347.   #     viewport : 显示端口;battler  : 战斗者 (Game_Battler)
  348.   #--------------------------------------------------------------------------
  349.   def initialize(viewport, father_id = 0)
  350.     super(viewport)
  351.     @father_id = father_id
  352.     if $game_party.actors[father_id] != nil
  353.       if $game_party.actors[father_id].pet_id != 0
  354.         @battler = Game_Pet.new($game_party.actors[father_id].pet_id)
  355.       else
  356.         @battler = nil
  357.       end
  358.     end
  359.   end
  360.   #--------------------------------------------------------------------------
  361.   # ● 释放
  362.   #--------------------------------------------------------------------------
  363.   def dispose
  364.     if self.bitmap != nil
  365.       self.bitmap.dispose
  366.     end
  367.     super
  368.   end
  369.   #--------------------------------------------------------------------------
  370.   # ● 刷新画面
  371.   #--------------------------------------------------------------------------
  372.   def update
  373.     super
  374.     # 战斗者为 nil 的情况下
  375.     if @battler == nil
  376.       self.bitmap = nil
  377.       loop_animation(nil)
  378.       return
  379.     end
  380.     if self.battler != nil
  381.       self.bitmap = RPG::Cache.battler(@battler.battler_name, @battler.battler_hue)
  382.       if @battler.animation_id != 0
  383.         animation = $data_animations[@battler.animation_id]
  384.         animation(animation, @battler.animation_hit)
  385.         @battler.animation_id = 0
  386.       end
  387.       if $game_party.actors[@father_id].pet_id == 0
  388.         self.battler = nil
  389.         collapse
  390.       end
  391.     end
  392.     # 设置活动块的坐标   
  393.     self.x = @father_id * 160 + 85
  394.     self.y = 400
  395.     self.z = 5
  396.     self.zoom_x = 0.6
  397.     self.zoom_y = 0.6
  398.   end
  399. end


  400. #==============================================================================
  401. # ■ Spriteset_Battle
  402. #------------------------------------------------------------------------------
  403. #  处理战斗画面的活动块的类。本类在 Scene_Battle 类
  404. # 的内部使用。
  405. #==============================================================================

  406. class Spriteset_Battle
  407.   #--------------------------------------------------------------------------
  408.   # ● 定义实例变量
  409.   #--------------------------------------------------------------------------
  410.   attr_reader   :viewport1                # 敌人方的显示端口
  411.   attr_reader   :viewport2                # 角色方的显示端口
  412.   #--------------------------------------------------------------------------
  413.   # ● 初始化变量
  414.   #--------------------------------------------------------------------------
  415.   def initialize
  416.     # 生成显示端口
  417.     @viewport1 = Viewport.new(0, 0, 640, 320)
  418.     @viewport2 = Viewport.new(0, 0, 640, 480)
  419.     @viewport3 = Viewport.new(0, 0, 640, 480)
  420.     @viewport4 = Viewport.new(0, 0, 640, 480)
  421.     @viewport2.z = 101
  422.     @viewport3.z = 200
  423.     @viewport4.z = 5000
  424.     # 生成战斗背景活动块
  425.     @battleback_sprite = Sprite.new(@viewport1)
  426.     # 生成敌人活动块
  427.     @enemy_sprites = []
  428.     for enemy in $game_troop.enemies.reverse
  429.       @enemy_sprites.push(Sprite_Battler.new(@viewport1, enemy))
  430.     end
  431.     # 生成自己人活动块
  432.     @actor_sprites = []
  433.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  434.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  435.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  436.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  437.     ###########################################################################
  438.     $pet_sprites = []
  439.     $pet_sprites.push(Sprite_Pet.new(@viewport2,0))
  440.     $pet_sprites.push(Sprite_Pet.new(@viewport2,1))
  441.     $pet_sprites.push(Sprite_Pet.new(@viewport2,2))
  442.     $pet_sprites.push(Sprite_Pet.new(@viewport2,3))
  443.     ###########################################################################
  444.     # 生成天候
  445.     @weather = RPG::Weather.new(@viewport1)
  446.     # 生成图片活动块
  447.     @picture_sprites = []
  448.     for i in 51..100
  449.       @picture_sprites.push(Sprite_Picture.new(@viewport3,
  450.         $game_screen.pictures[i]))
  451.     end
  452.     # 生成计时器块
  453.     @timer_sprite = Sprite_Timer.new
  454.     # 刷新画面
  455.     update
  456.   end
  457.   #--------------------------------------------------------------------------
  458.   # ● 释放
  459.   #--------------------------------------------------------------------------
  460.   def dispose
  461.     # 如果战斗背景位图存在的情况下就释放
  462.     if @battleback_sprite.bitmap != nil
  463.       @battleback_sprite.bitmap.dispose
  464.     end
  465.     # 释放战斗背景活动块
  466.     @battleback_sprite.dispose
  467.     # 释放敌人活动块、角色活动块
  468.     ###########################################################################
  469.     for sprite in @enemy_sprites + @actor_sprites + $pet_sprites
  470.       sprite.dispose
  471.     end
  472.     ###########################################################################
  473.     # 释放天候
  474.     @weather.dispose
  475.     # 释放图片活动块
  476.     for sprite in @picture_sprites
  477.       sprite.dispose
  478.     end
  479.     # 释放计时器活动块
  480.     @timer_sprite.dispose
  481.     # 释放显示端口
  482.     @viewport1.dispose
  483.     @viewport2.dispose
  484.     @viewport3.dispose
  485.     @viewport4.dispose
  486.   end
  487.   #--------------------------------------------------------------------------
  488.   # ● 显示效果中判定
  489.   #--------------------------------------------------------------------------
  490.   def effect?
  491.     # 如果是在显示效果中的话就返回 true
  492.     for sprite in @enemy_sprites + @actor_sprites
  493.       return true if sprite.effect?
  494.     end
  495.     return false
  496.   end
  497.   #--------------------------------------------------------------------------
  498.   # ● 刷新画面
  499.   #--------------------------------------------------------------------------
  500.   def update
  501.     # 刷新角色的活动块 (对应角色的替换)
  502.     @actor_sprites[0].battler = $game_party.actors[0]
  503.     @actor_sprites[1].battler = $game_party.actors[1]
  504.     @actor_sprites[2].battler = $game_party.actors[2]
  505.     @actor_sprites[3].battler = $game_party.actors[3]
  506.     # 战斗背景的文件名与现在情况有差异的情况下
  507.     if @battleback_name != $game_temp.battleback_name
  508.       @battleback_name = $game_temp.battleback_name
  509.       if @battleback_sprite.bitmap != nil
  510.         @battleback_sprite.bitmap.dispose
  511.       end
  512.       @battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name)
  513.       @battleback_sprite.src_rect.set(0, 0, 640, 320)
  514.     end
  515.     # 刷新战斗者的活动块
  516.     ###########################################################################
  517.     for sprite in @enemy_sprites + @actor_sprites + $pet_sprites
  518.       sprite.update
  519.     end
  520.     ###########################################################################
  521.     # 刷新天气图形
  522.     @weather.type = $game_screen.weather_type
  523.     @weather.max = $game_screen.weather_max
  524.     @weather.update
  525.     # 刷新图片活动块
  526.     for sprite in @picture_sprites
  527.       sprite.update
  528.     end
  529.     # 刷新计时器活动块
  530.     @timer_sprite.update
  531.     # 设置画面的色调与震动位置
  532.     @viewport1.tone = $game_screen.tone
  533.     @viewport1.ox = $game_screen.shake
  534.     # 设置画面的闪烁色
  535.     @viewport4.color = $game_screen.flash_color
  536.     # 刷新显示端口
  537.     @viewport1.update
  538.     @viewport2.update
  539.     @viewport4.update
  540.   end
  541. end

  542. #==============================================================================
  543. # ■ Window_Base
  544. #------------------------------------------------------------------------------
  545. #  游戏中全部窗口的超级类。
  546. #==============================================================================
  547. class Window_Base < Window
  548.   #############################################################################
  549.   def draw_actor_pet(actor, x, y)#——绘制宠物图形
  550.     if actor.pet_id != 0
  551.       bitmap = RPG::Cache.battler($data_enemies[actor.pet_id].battler_name, $data_enemies[actor.pet_id].battler_hue)
  552.       cw = bitmap.width
  553.       ch = bitmap.height
  554.       src_rect = Rect.new(0, 0, cw, ch)
  555.       self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect)
  556.     end
  557.   end
  558.   #############################################################################
  559. end



  560. #==============================================================================
  561. # ■ Window_Status
  562. #------------------------------------------------------------------------------
  563. #  显示状态画面、完全规格的状态窗口。
  564. #==============================================================================
  565. class Window_Status < Window_Base
  566.   alias carol3_refresh refresh
  567.   def refresh
  568.     carol3_refresh
  569.     draw_actor_pet(@actor, 40, 250)
  570.   end
  571. end






  572. class Scene_Battle
  573.   #--------------------------------------------------------------------------
  574.   # ● 主处理
  575.   #--------------------------------------------------------------------------
  576.   def main
  577.     # 初始化战斗用的各种暂时数据
  578.     $game_temp.in_battle = true
  579.     $game_temp.battle_turn = 0
  580.     $game_temp.battle_event_flags.clear
  581.     $game_temp.battle_abort = false
  582.     $game_temp.battle_main_phase = false
  583.     $game_temp.battleback_name = $game_map.battleback_name
  584.     $game_temp.forcing_battler = nil
  585.     # 初始化战斗用事件解释器
  586.     $game_system.battle_interpreter.setup(nil, 0)
  587.     # 准备队伍
  588.     @troop_id = $game_temp.battle_troop_id
  589.     $game_troop.setup(@troop_id)
  590.     # 生成角色命令窗口
  591.     s1 = $data_system.words.attack
  592.     s2 = $data_system.words.skill
  593.     s3 = $data_system.words.guard
  594.     s4 = $data_system.words.item
  595.     @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
  596.     @actor_command_window.y = 160
  597.     @actor_command_window.back_opacity = 160
  598.     @actor_command_window.active = false
  599.     @actor_command_window.visible = false
  600.     # 生成其它窗口
  601.     @party_command_window = Window_PartyCommand.new
  602.     @help_window = Window_Help.new
  603.     @help_window.back_opacity = 160
  604.     @help_window.visible = false
  605.     @status_window = Window_BattleStatus.new
  606.     @message_window = Window_Message.new
  607.     # 生成活动块
  608.     @spriteset = Spriteset_Battle.new
  609.     ############################################################################
  610.     @pet_actor = []
  611.     for i in 0..3
  612.       if $pet_sprites[i].battler != nil
  613.         @pet_actor.push($pet_sprites[i].battler)
  614.       end
  615.     end
  616.     ############################################################################
  617.     # 初始化等待计数
  618.     @wait_count = 0
  619.     # 执行过渡
  620.     if $data_system.battle_transition == ""
  621.       Graphics.transition(20)
  622.     else
  623.       Graphics.transition(40, "Graphics/Transitions/" +
  624.         $data_system.battle_transition)
  625.     end
  626.     # 开始自由战斗回合
  627.     start_phase1
  628.     # 主循环
  629.     loop do
  630.       # 刷新游戏画面
  631.       Graphics.update
  632.       # 刷新输入信息
  633.       Input.update
  634.       # 刷新画面
  635.       update
  636.       # 如果画面切换的话就中断循环
  637.       if $scene != self
  638.         break
  639.       end
  640.     end
  641.     # 刷新地图
  642.     $game_map.refresh
  643.     # 准备过渡
  644.     Graphics.freeze
  645.     # 释放窗口
  646.     @actor_command_window.dispose
  647.     @party_command_window.dispose
  648.     @help_window.dispose
  649.     @status_window.dispose
  650.     @message_window.dispose
  651.     if @skill_window != nil
  652.       @skill_window.dispose
  653.     end
  654.     if @item_window != nil
  655.       @item_window.dispose
  656.     end
  657.     if @result_window != nil
  658.       @result_window.dispose
  659.     end
  660.     # 释放活动块
  661.     @spriteset.dispose
  662.     # 标题画面切换中的情况
  663.     if $scene.is_a?(Scene_Title)
  664.       # 淡入淡出画面
  665.       Graphics.transition
  666.       Graphics.freeze
  667.     end
  668.     # 战斗测试或者游戏结束以外的画面切换中的情况
  669.     if $BTEST and not $scene.is_a?(Scene_Gameover)
  670.       $scene = nil
  671.     end
  672.   end
  673.     def start_phase4
  674.     # 转移到回合 4
  675.     @phase = 4
  676.     # 回合数计数
  677.     $game_temp.battle_turn += 1
  678.     # 搜索全页的战斗事件
  679.     for index in 0...$data_troops[@troop_id].pages.size
  680.       # 获取事件页
  681.       page = $data_troops[@troop_id].pages[index]
  682.       # 本页的范围是 [回合] 的情况下
  683.       if page.span == 1
  684.         # 设置已经执行标志
  685.         $game_temp.battle_event_flags[index] = false
  686.       end
  687.     end
  688.     # 设置角色为非选择状态
  689.     @actor_index = -1
  690.     @active_battler = nil
  691.     # 无效化同伴指令窗口
  692.     @party_command_window.active = false
  693.     @party_command_window.visible = false
  694.     # 无效化角色指令窗口
  695.     @actor_command_window.active = false
  696.     @actor_command_window.visible = false
  697.     # 设置主回合标志
  698.     $game_temp.battle_main_phase = true
  699.     # 生成敌人行动
  700.     for enemy in $game_troop.enemies
  701.       enemy.make_action
  702.     end
  703.     ############################################################################
  704.     for enemy in @pet_actor
  705.       enemy.make_action
  706.       enemy.current_action.decide_random_target_for_pet
  707.     end
  708.     ############################################################################
  709.     # 生成行动顺序
  710.     make_action_orders
  711.     # 移动到步骤 1
  712.     @phase4_step = 1
  713.   end

  714.   #--------------------------------------------------------------------------
  715.   # ● 生成行动循序
  716.   #--------------------------------------------------------------------------
  717.   def make_action_orders
  718.     # 初始化序列 @action_battlers
  719.     @action_battlers = []
  720.     # 添加敌人到 @action_battlers 序列
  721.     for enemy in $game_troop.enemies
  722.       @action_battlers.push(enemy)
  723.     end
  724.     ############################################################################
  725.     for enemy in @pet_actor
  726.       @action_battlers.push(enemy)  
  727.     end
  728.     ############################################################################
  729.     # 添加角色到 @action_battlers 序列
  730.     for actor in $game_party.actors
  731.       @action_battlers.push(actor)     
  732.     end
  733.     # 确定全体的行动速度
  734.     for battler in @action_battlers
  735.       battler.make_action_speed
  736.     end
  737.     # 按照行动速度从大到小排列
  738.     @action_battlers.sort! {|a,b|
  739.       b.current_action.speed - a.current_action.speed }
  740.     end
  741.    
  742.   #--------------------------------------------------------------------------
  743.   # ● 刷新画面 (主回合步骤 1 : 准备行动)
  744.   #--------------------------------------------------------------------------
  745.   def update_phase4_step1
  746.     # 隐藏帮助窗口
  747.     @help_window.visible = false
  748.     # 判定胜败
  749.     if judge
  750.       # 胜利或者失败的情况下 : 过程结束
  751.       return
  752.     end
  753.     # 强制行动的战斗者不存在的情况下
  754.     if $game_temp.forcing_battler == nil
  755.       # 设置战斗事件
  756.       setup_battle_event
  757.       # 执行战斗事件中的情况下
  758.       if $game_system.battle_interpreter.running?
  759.         return
  760.       end
  761.     end
  762.     # 强制行动的战斗者存在的情况下
  763.     if $game_temp.forcing_battler != nil
  764.       # 在头部添加后移动
  765.       @action_battlers.delete($game_temp.forcing_battler)
  766.       @action_battlers.unshift($game_temp.forcing_battler)
  767.     end
  768.     # 未行动的战斗者不存在的情况下 (全员已经行动)
  769.     if @action_battlers.size == 0
  770.       # 开始同伴命令回合
  771.       start_phase2
  772.       return
  773.     end
  774.     # 初始化动画 ID 和公共事件 ID
  775.     @animation1_id = 0
  776.     @animation2_id = 0
  777.     @common_event_id = 0
  778.     # 未行动的战斗者移动到序列的头部
  779.     @active_battler = @action_battlers.shift
  780.     ###########################################################################
  781.     if @active_battler.is_a?(Game_Pet)
  782.       # 移至步骤 2
  783.       @phase4_step = 2
  784.     else
  785.       # 如果已经在战斗之外的情况下
  786.       if @active_battler.index == nil
  787.         return
  788.       end
  789.       # 连续伤害
  790.       if @active_battler.hp > 0 and @active_battler.slip_damage?
  791.         @active_battler.slip_damage_effect
  792.         @active_battler.damage_pop = true
  793.       end
  794.       # 自然解除状态
  795.       @active_battler.remove_states_auto
  796.       # 刷新状态窗口
  797.       @status_window.refresh
  798.       # 移至步骤 2
  799.       @phase4_step = 2
  800.     end
  801.     ###########################################################################
  802.   end



  803.     #--------------------------------------------------------------------------
  804.   # ● 生成基本行动结果
  805.   #--------------------------------------------------------------------------
  806.   def make_basic_action_result
  807.     # 攻击的情况下
  808.     if @active_battler.current_action.basic == 0
  809.       # 设置攻击 ID
  810.       @animation1_id = @active_battler.animation1_id
  811.       @animation2_id = @active_battler.animation2_id
  812.       # 行动方的战斗者是敌人的情况下
  813.       if @active_battler.is_a?(Game_Actor) or @active_battler.is_a?(Game_Pet)
  814.         if @active_battler.restriction == 3
  815.           target = $game_party.random_target_actor
  816.         elsif @active_battler.restriction == 2
  817.           target = $game_troop.random_target_enemy
  818.         else
  819.           index = @active_battler.current_action.target_index
  820.           target = $game_troop.smooth_target_enemy(index)
  821.         end
  822.       else
  823.         if @active_battler.restriction == 3
  824.           $game_variables[2]+=1
  825.           target = $game_troop.random_target_enemy
  826.         elsif @active_battler.restriction == 2
  827.           target = $game_party.random_target_actor
  828.         else
  829.           index = @active_battler.current_action.target_index
  830.           target = $game_party.smooth_target_actor(index)
  831.         end
  832.       end
  833.       # 设置对像方的战斗者序列
  834.       @target_battlers = [target]
  835.       # 应用通常攻击效果
  836.       for target in @target_battlers
  837.         target.attack_effect(@active_battler)
  838.       end
  839.       return
  840.     end
  841.     # 防御的情况下
  842.     if @active_battler.current_action.basic == 1
  843.       # 帮助窗口显示"防御"
  844.       @help_window.set_text($data_system.words.guard, 1)
  845.       return
  846.     end
  847.     # 逃跑的情况下
  848.     if @active_battler.is_a?(Game_Enemy) and
  849.        @active_battler.current_action.basic == 2
  850.       #  帮助窗口显示"逃跑"
  851.       @help_window.set_text("逃跑", 1)
  852.       # 逃跑
  853.       @active_battler.escape
  854.       return
  855.     end
  856.     # 什么也不做的情况下
  857.     if @active_battler.current_action.basic == 3
  858.       # 清除强制行动对像的战斗者
  859.       $game_temp.forcing_battler = nil
  860.       # 移至步骤 1
  861.       @phase4_step = 1
  862.       return
  863.     end
  864.   end


  865.     #--------------------------------------------------------------------------
  866.   # ● 设置物品或特技对像方的战斗者
  867.   #     scope : 特技或者是物品的范围
  868.   #--------------------------------------------------------------------------
  869.   def set_target_battlers(scope)
  870.     # 行动方的战斗者是敌人的情况下
  871.     if @active_battler.is_a?(Game_Enemy)
  872.       # 效果范围分支
  873.       case scope
  874.       when 1  # 敌单体
  875.         index = @active_battler.current_action.target_index
  876.         @target_battlers.push($game_party.smooth_target_actor(index))
  877.       when 2  # 敌全体
  878.         for actor in $game_party.actors
  879.           if actor.exist?
  880.             @target_battlers.push(actor)
  881.           end
  882.         end
  883.       when 3  # 我方单体
  884.         index = @active_battler.current_action.target_index
  885.         @target_battlers.push($game_troop.smooth_target_enemy(index))
  886.       when 4  # 我方全体
  887.         for enemy in $game_troop.enemies
  888.           if enemy.exist?
  889.             @target_battlers.push(enemy)
  890.           end
  891.         end
  892.       when 5  # 我方单体 (HP 0)
  893.         index = @active_battler.current_action.target_index
  894.         enemy = $game_troop.enemies[index]
  895.         if enemy != nil and enemy.hp0?
  896.           @target_battlers.push(enemy)
  897.         end
  898.       when 6  # 我方全体 (HP 0)
  899.         for enemy in $game_troop.enemies
  900.           if enemy != nil and enemy.hp0?
  901.             @target_battlers.push(enemy)
  902.           end
  903.         end
  904.       when 7  # 使用者
  905.         @target_battlers.push(@active_battler)
  906.       end
  907.     end
  908.     # 行动方的战斗者是角色的情况下
  909.     if @active_battler.is_a?(Game_Actor) or @active_battler.is_a?(Game_Pet)
  910.       # 效果范围分支
  911.       case scope
  912.       when 1  # 敌单体
  913.         index = @active_battler.current_action.target_index
  914.         @target_battlers.push($game_troop.smooth_target_enemy(index))
  915.       when 2  # 敌全体
  916.         for enemy in $game_troop.enemies
  917.           if enemy.exist?
  918.             @target_battlers.push(enemy)
  919.           end
  920.         end
  921.       when 3  # 我方单体
  922.         index = @active_battler.current_action.target_index
  923.         @target_battlers.push($game_party.smooth_target_actor(index))
  924.       when 4  # 我方全体
  925.         for actor in $game_party.actors
  926.           if actor.exist?
  927.             @target_battlers.push(actor)
  928.           end
  929.         end
  930.       when 5  # 我方单体 (HP 0)
  931.         index = @active_battler.current_action.target_index
  932.         actor = $game_party.actors[index]
  933.         if actor != nil and actor.hp0?
  934.           @target_battlers.push(actor)
  935.         end
  936.       when 6  # 我方全体 (HP 0)
  937.         for actor in $game_party.actors
  938.           if actor != nil and actor.hp0?
  939.             @target_battlers.push(actor)
  940.           end
  941.         end
  942.       when 7  # 使用者
  943.         @target_battlers.push(@active_battler)
  944.       end
  945.     end
  946.   end
  947. end

  948.   #--------------------------------------------------------------------------
  949.   # ● 刷新画面
  950.   #--------------------------------------------------------------------------
  951. class Sprite_Battler < RPG::Sprite
  952.   def update
  953.     super
  954.     # 战斗者为 nil 的情况下
  955.     if @battler == nil
  956.       self.bitmap = nil
  957.       loop_animation(nil)
  958.       return
  959.     end
  960.     # 文件名和色相与当前情况有差异的情况下
  961.     if @battler.battler_name != @battler_name or
  962.        @battler.battler_hue != @battler_hue
  963.       # 获取、设置位图
  964.       @battler_name = @battler.battler_name
  965.       @battler_hue = @battler.battler_hue
  966.       self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
  967.       @width = bitmap.width
  968.       @height = bitmap.height
  969.       self.ox = @width / 2
  970.       self.oy = @height
  971.       # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
  972.       if @battler.dead? or @battler.hidden
  973.         self.opacity = 0
  974.       end
  975.     end
  976.     # 动画 ID 与当前的情况有差异的情况下
  977.     if @battler.damage == nil and
  978.        @battler.state_animation_id != @state_animation_id
  979.       @state_animation_id = @battler.state_animation_id
  980.       loop_animation($data_animations[@state_animation_id])
  981.     end
  982.     # 应该被显示的角色的情况下
  983.     if @battler.is_a?(Game_Actor) and @battler_visible
  984.       # 不是主状态的时候稍稍降低点透明度
  985.       if $game_temp.battle_main_phase
  986.         self.opacity += 3 if self.opacity < 255
  987.       else
  988.         self.opacity -= 3 if self.opacity > 207
  989.       end
  990.     end
  991.     # 明灭
  992.     if @battler.blink
  993.       blink_on
  994.     else
  995.       blink_off
  996.     end
  997.     # 不可见的情况下
  998.     unless @battler_visible
  999.       # 出现
  1000.       if not @battler.hidden and not @battler.dead? and
  1001.          (@battler.damage == nil or @battler.damage_pop)
  1002.         appear
  1003.         @battler_visible = true
  1004.       end
  1005.     end
  1006.     # 可见的情况下
  1007.     if @battler_visible
  1008.       # 逃跑
  1009.       if @battler.hidden
  1010.         $game_system.se_play($data_system.escape_se)
  1011.         escape
  1012.         @battler_visible = false
  1013.       end
  1014.       # 白色闪烁
  1015.       if @battler.white_flash
  1016.         whiten
  1017.         @battler.white_flash = false
  1018.       end
  1019.       # 动画
  1020.       if @battler.animation_id != 0
  1021.         animation = $data_animations[@battler.animation_id]
  1022.         animation(animation, @battler.animation_hit)
  1023.         @battler.animation_id = 0
  1024.       end
  1025.       # 伤害
  1026.       if @battler.damage_pop
  1027.         damage(@battler.damage, @battler.critical)
  1028.         @battler.damage = nil
  1029.         @battler.critical = false
  1030.         @battler.damage_pop = false
  1031.       end
  1032.       # korapusu
  1033.       if @battler.damage == nil and @battler.dead?
  1034.         if @battler.is_a?(Game_Enemy)
  1035.           $game_system.se_play($data_system.enemy_collapse_se)
  1036.         else
  1037.           @battler.pet_id = 0
  1038.           $game_system.se_play($data_system.actor_collapse_se)
  1039.         end
  1040.         collapse
  1041.         @battler_visible = false
  1042.       end
  1043.     end
  1044.     # 设置活动块的坐标
  1045.     self.x = @battler.screen_x
  1046.     self.y = @battler.screen_y
  1047.     self.z = @battler.screen_z
  1048.   end
  1049. end
复制代码
CP制御脚本
  1. module XRXS65
  2.   #
  3.   # 「バトルスピード」(数値が高いほど早い)
  4.   #
  5.   SPEED = 4.0
  6.   #
  7.   # 戦闘開始時 CP。 固定値と占有率
  8.   #
  9.   CP_PRESET_FIXNUM = 0
  10.   CP_PRESET_RATIO  = 2.0
  11.   #
  12.   # ターンコントローラ (nil  : カウント/ターンを有効。
  13.   #                     数値 : そのインデックスをもつエネミーが支配)
  14.   #
  15.   TC = 0
  16.   #
  17.   # カウント/ターン (TCが有効な場合は無視)
  18.   #
  19.   CPT = 40
  20.   #
  21.   # CP スキン
  22.   #
  23.   SKIN        = "123"  # スキンファイル名(Graphics/Windowskinsフォルダ)
  24.   LINE_HEIGHT =  6        # スキンの"一行"の縦幅[単位:ピクセル]
  25.   #
  26.   # 表示位置セッティング
  27.   #
  28.   X_OFFSET = 144    # 横位置
  29.   Y_OFFSET = 464    # 縦位置
  30.   ALIGN    =   1    #「位置揃え」(CPメーターの位置。0:左寄せ 1:中央 2:右寄せ)
  31.   MAX      =   4    # 確保するサイズ[単位:~人分]
  32.   #
  33.   # アクターコマンドがポップしたときの効果音
  34.   #
  35.   COMMAND_UP_SE = "Audio/SE/046-Book01.ogg"
  36. end
  37. #==============================================================================
  38. # --- CP メーターの描画情報の取得 --- (Game_Battlerにインクルードされます)
  39. #==============================================================================
  40. module XRXS_CP
  41.   #--------------------------------------------------------------------------
  42.   # ○ スキンライン (スキンの何行目を使うか)
  43.   #--------------------------------------------------------------------------
  44.   def cp_linetype
  45.     # CP フルの場合はスキンの 2 行目を使う
  46.     return 2 if self.cp_full?
  47.     # 通常はスキンの 1 行目を使う
  48.     return 1
  49.   end
  50.   #--------------------------------------------------------------------------
  51.   # ○ メーター量[単位:%]
  52.   #--------------------------------------------------------------------------
  53.   def cp_lineamount
  54.     # 戦闘不能の場合は 0 %として表示させる
  55.     return 0 if self.dead?
  56.     # CP値を%値に変換して返却する
  57.     return 100 * self.cp / self.max_cp
  58.   end
  59. end
  60. #
  61. # カスタマイズポイントここまで。
  62. #------------------------------------------------------------------------------



  63. #==============================================================================
  64. # --- XRXS. CP機構 ---
  65. #==============================================================================
  66. module XRXS_CP_SYSTEM
  67.   #----------------------------------------------------------------------------
  68.   # ○ 合計 AGI の取得
  69.   #----------------------------------------------------------------------------
  70.   def self.total_agi
  71.     total = 0
  72.     for battler in $game_party.actors + $game_troop.enemies
  73.       total += battler.agi
  74.     end
  75.     return total
  76.   end
  77. end
  78. #==============================================================================
  79. # --- バトラーにCP機能を追加 モジュール ---
  80. #==============================================================================
  81. module XRXS_CP
  82.   #--------------------------------------------------------------------------
  83.   # ○ 最大 CP の取得
  84.   #--------------------------------------------------------------------------
  85.   def max_cp
  86.     return 65535
  87.   end
  88.   #--------------------------------------------------------------------------
  89.   # ○ CP の取得と設定
  90.   #--------------------------------------------------------------------------
  91.   def cp
  92.     return @cp == nil ? @cp = 0 : @cp
  93.   end
  94.   def cp=(n)
  95.     @cp = [[n.to_i, 0].max, self.max_cp].min
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # ○ CP 初期設定
  99.   #--------------------------------------------------------------------------
  100.   def cp_preset
  101.     percent = self.max_cp * XRXS65::CP_PRESET_RATIO * (rand(16) + 16) * self.agi / XRXS_CP_SYSTEM.total_agi / 24
  102.     self.cp = XRXS65::CP_PRESET_FIXNUM + percent
  103.   end
  104.   #--------------------------------------------------------------------------
  105.   # ○ CP カウントアップ
  106.   #--------------------------------------------------------------------------
  107.   def cp_update
  108.     self.cp += XRXS65::SPEED * 4096 * self.agi / XRXS_CP_SYSTEM.total_agi
  109.   end
  110.   #--------------------------------------------------------------------------
  111.   # ○ CP 満タン?
  112.   #--------------------------------------------------------------------------
  113.   def cp_full?
  114.     return @cp == self.max_cp
  115.   end
  116. end
  117. class Game_Battler
  118.   include XRXS_CP
  119. end
  120. #==============================================================================
  121. # --- ガード機能 ---
  122. #==============================================================================
  123. class Game_Battler
  124.   #--------------------------------------------------------------------------
  125.   # ○ ガードフラグ
  126.   #--------------------------------------------------------------------------
  127.   def guarding=(n)
  128.     @guarding = n
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 防御中判定 [再定義]
  132.   #--------------------------------------------------------------------------
  133.   def guarding?
  134.     return @guarding
  135.   end
  136. end
  137. #==============================================================================
  138. # --- アクター「コマンド入力可能判定」:CPがないとコマンドしない ---
  139. #==============================================================================
  140. module XRXS_CP_INPUTABLE
  141.   def inputable?
  142.     return (self.cp_full? and super)
  143.   end
  144. end
  145. class Game_Actor < Game_Battler
  146.   include XRXS_CP_INPUTABLE
  147. end
  148. #==============================================================================
  149. # --- エネミー「行動可能判定」:CPがないとコマンドしない ---
  150. #==============================================================================
  151. module XRXS_CP_MOVABLE
  152.   def movable?
  153.     return (self.cp_full? and super)
  154.   end
  155. end
  156. class Game_Enemy < Game_Battler
  157.   include XRXS_CP_MOVABLE
  158. end

  159. class Game_Pet < Game_Battler  # XXOO
  160.   include XRXS_CP_MOVABLE
  161. end

  162. #==============================================================================
  163. # --- 戦闘時 CPカウント ---
  164. #==============================================================================
  165. module XRXS_CP_Battle
  166.   #--------------------------------------------------------------------------
  167.   # ○ パーティ全員の CP を初期設定
  168.   #--------------------------------------------------------------------------
  169.   def cp_preset_party
  170.     for actor in $game_party.actors
  171.       actor.cp_preset
  172.     end
  173.   end
  174.   
  175.   #--------------------------------------------------------------------------
  176.   # ○ トループ全員の CP を初期設定
  177.   #--------------------------------------------------------------------------
  178.   def cp_preset_troop
  179.     for enemy in $game_troop.enemies
  180.       enemy.cp_preset
  181.     end
  182.   end
  183.   
  184.   def cp_preset_troop
  185.     for enemy in $game_troop.enemies
  186.       enemy.cp_preset
  187.     end
  188.   end
  189.   
  190.   #--------------------------------------------------------------------------
  191.   # ○ バトラー全員の CP をカウントアップ
  192.   #--------------------------------------------------------------------------
  193.   def cp_update
  194.     for battler in $game_party.actors + $game_troop.enemies
  195.       battler.cp_update
  196.     end
  197.   end
  198. end
  199. class Scene_Battle
  200.   include XRXS_CP_Battle
  201. end
  202. #==============================================================================
  203. # ■ Scene_Battle
  204. #==============================================================================
  205. class Scene_Battle
  206.   #--------------------------------------------------------------------------
  207.   # ● メイン処理
  208.   #--------------------------------------------------------------------------
  209.   alias xrxs65_main main
  210.   def main
  211.     # エクストラスプライトの初期化
  212.     @extra_sprites = [] if @extra_sprites == nil
  213.     # CP の初期化
  214.     cp_preset_party
  215.     # CP メーターの作成
  216.     @cp_meters = CP_Meters.new
  217.     # CP メーターをエクストラスプライトへ登録
  218.     @extra_sprites.push(@cp_meters)
  219.     # 呼び戻す
  220.     xrxs65_main
  221.     # メーターの解放
  222.     @cp_meters.dispose
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ● プレバトルフェーズ開始
  226.   #--------------------------------------------------------------------------
  227.   alias xrxs65_start_phase1 start_phase1
  228.   def start_phase1
  229.     # 呼び戻す
  230.     xrxs65_start_phase1
  231.     # CP の初期化
  232.     cp_preset_troop
  233.     # CP メーターの更新
  234.     @cp_meters.refresh
  235.     # インデックスを計算
  236.     @cp_escape_actor_command_index = @actor_command_window.height/32 - 1
  237.     # アクターコマンドウィンドウに追加
  238. #    @actor_command_window.add_command("逃げる")  # XXOO
  239.     if !$game_temp.battle_can_escape
  240.       @actor_command_window.disable_item(@cp_escape_actor_command_index)
  241.     end
  242.   end
  243.   #--------------------------------------------------------------------------
  244.   # ● パーティコマンドフェーズ開始
  245.   #--------------------------------------------------------------------------
  246.   alias xrxs65_start_phase2 start_phase2
  247.   def start_phase2
  248.     # 呼び戻す
  249.     xrxs65_start_phase2
  250.     # パーティコマンドウィンドウを無効化
  251.     @party_command_window.active  = false
  252.     @party_command_window.visible = false
  253.     # 強制的にフェイズ 2 を保持
  254.     @phase = 2
  255.     # ただし、既に行動可能者が存在する場合は 3 へ
  256.     start_phase3 if anybody_movable?
  257.   end
  258.   #--------------------------------------------------------------------------
  259.   # ○ CP制での ターンのカウント
  260.   #--------------------------------------------------------------------------
  261.   def cp_turn_count
  262.     $game_temp.battle_turn += 1
  263.     # バトルイベントの全ページを検索
  264.     for index in 0...$data_troops[@troop_id].pages.size
  265.       # このページのスパンが [ターン] の場合
  266.       if $data_troops[@troop_id].pages[index].span == 1
  267.         # 実行済みフラグをクリア
  268.         $game_temp.battle_event_flags[index] = false
  269.       end
  270.     end
  271.   end
  272.   #--------------------------------------------------------------------------
  273.   # ● フレーム更新 (パーティコマンドフェーズ)
  274.   #--------------------------------------------------------------------------
  275.   alias xrxs65_update_phase2 update_phase2
  276.   def update_phase2
  277.     # パーティコマンドウィンドウのインデックスを無効化
  278.     @party_command_window.index = -1
  279.     # 呼び戻す
  280.     xrxs65_update_phase2
  281.     # 例外補正
  282.     @turn_count_time = 1 if @turn_count_time == nil
  283.     # ターンのカウント
  284.     if @turn_count_time > 0
  285.       @turn_count_time -= 1
  286.       if @turn_count_time == 0
  287.         cp_turn_count
  288.         @turn_count_time = XRXS65::CPT if XRXS65::TC == nil
  289.       end
  290.     end
  291.     # CP のフレーム更新
  292.     cp_update
  293.     @cp_meters.refresh
  294.     # フル CP のバトラーが存在する場合、ターン開始
  295.     start_phase3 if anybody_movable?
  296.   end
  297.   #--------------------------------------------------------------------------
  298.   # ○ フル CP バトラーが存在するか?
  299.   #--------------------------------------------------------------------------
  300.   def anybody_movable?
  301.     for battler in $game_party.actors + $game_troop.enemies
  302.       return true if battler.cp_full?
  303.     end
  304.     return false
  305.   end
  306.   #--------------------------------------------------------------------------
  307.   # ● アクターコマンドウィンドウのセットアップ
  308.   #--------------------------------------------------------------------------
  309.   alias xrxs65_phase3_setup_command_window phase3_setup_command_window
  310.   def phase3_setup_command_window
  311.     # 効果音の再生
  312.     Audio.se_play(XRXS65::COMMAND_UP_SE) rescue nil
  313.     # 呼び戻す
  314.     xrxs65_phase3_setup_command_window
  315.   end
  316.   #--------------------------------------------------------------------------
  317.   # ● フレーム更新 (アクターコマンドフェーズ : 基本コマンド)
  318.   #--------------------------------------------------------------------------
  319.   alias xrxs_bsp1_update_phase3_basic_command update_phase3_basic_command
  320.   def update_phase3_basic_command
  321.     # C ボタンが押された場合
  322.     if Input.trigger?(Input::C)
  323.       # アクターコマンドウィンドウのカーソル位置で分岐
  324.       case @actor_command_window.index
  325.       when @cp_escape_actor_command_index # 逃げる
  326.         if $game_temp.battle_can_escape
  327.           # 決定 SE を演奏
  328.           $game_system.se_play($data_system.decision_se)
  329.           # アクションを設定
  330.           @active_battler.current_action.kind = 0
  331.           @active_battler.current_action.basic = 4
  332.           # 次のアクターのコマンド入力へ
  333.           phase3_next_actor
  334.         else
  335.           # ブザー SE を演奏
  336.           $game_system.se_play($data_system.buzzer_se)
  337.         end
  338.         return
  339.       end
  340.     end
  341.     # 呼び戻す
  342.     xrxs_bsp1_update_phase3_basic_command
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # ● メインフェーズ開始
  346.   #--------------------------------------------------------------------------
  347.   alias xrxs65_start_phase4 start_phase4
  348.   def start_phase4
  349.     # ターン数を引くことによって擬似的にカウントに変化を起こさせない
  350.     $game_temp.battle_turn -= 1
  351.     # フラグを退避
  352.     save_flags = $game_temp.battle_event_flags.dup
  353.     # 呼び戻す
  354.     xrxs65_start_phase4
  355.     # フラグを復旧
  356.     $game_temp.battle_event_flags = save_flags
  357.   end
  358.   #--------------------------------------------------------------------------
  359.   # ● 行動順序作成
  360.   #--------------------------------------------------------------------------
  361.   alias xrxs65_make_action_orders make_action_orders
  362.   def make_action_orders
  363.     # 呼び戻す
  364.     xrxs65_make_action_orders
  365.     # CPが不足している場合は @action_battlers から除外する
  366.     for battler in @action_battlers.dup
  367.       @action_battlers.delete(battler) unless battler.cp_full?
  368.     end
  369.   end
  370.   #--------------------------------------------------------------------------
  371.   # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  372.   #--------------------------------------------------------------------------
  373.   alias xrxs65_update_phase4_step2 update_phase4_step2
  374.   def update_phase4_step2
  375.     # ガードの解除
  376.     @active_battler.guarding = false
  377.     # CPの消費
  378.     @active_battler.cp = 0
  379.     # CP メーターの更新
  380.     @cp_meters.refresh
  381.     # 呼び戻す
  382.     xrxs65_update_phase4_step2
  383.     # 例外補正
  384.     return if @active_battler == nil
  385.     # ターンコントローラ
  386.     if @active_battler.is_a?(Game_Enemy) and @active_battler.index == XRXS65::TC
  387.       cp_turn_count
  388.     end
  389.   end
  390.   #--------------------------------------------------------------------------
  391.   # ● 基本アクション 結果作成
  392.   #--------------------------------------------------------------------------
  393.   alias xrxs65_make_basic_action_result make_basic_action_result
  394.   def make_basic_action_result
  395.     # 呼び戻す
  396.     xrxs65_make_basic_action_result
  397.     # 防御の場合
  398.     if @active_battler.current_action.basic == 1
  399.       @active_battler.guarding = true
  400.       return
  401.     end
  402.     # パーティの逃亡の場合
  403.     if @active_battler.current_action.basic == 4
  404.       # 逃走可能ではない場合
  405.       if $game_temp.battle_can_escape == false
  406.         # ブザー SE を演奏
  407.         $game_system.se_play($data_system.buzzer_se)
  408.         return
  409.       end
  410.       # パーティ全員の CP をクリア
  411.       for actor in $game_party.actors
  412.         actor.cp = 0
  413.       end
  414.       # CP メーターの更新
  415.       @cp_meters.refresh
  416.       # 逃走処理
  417.       update_phase2_escape
  418.       return
  419.     end
  420.   end
  421.   #--------------------------------------------------------------------------
  422.   # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  423.   #--------------------------------------------------------------------------
  424.   alias xrxs65_update_phase4_step5 update_phase4_step5
  425.   def update_phase4_step5
  426.     # 呼び戻す
  427.     xrxs65_update_phase4_step5
  428.     # CP メーターの更新
  429.     @cp_meters.refresh
  430.   end
  431. end
  432. #==============================================================================
  433. # --- CP メーターをまとめて管理するクラス、表示関係はすべてココ ---
  434. #==============================================================================
  435. class CP_Meters
  436.   #--------------------------------------------------------------------------
  437.   # ○ オブジェクト初期化
  438.   #--------------------------------------------------------------------------
  439.   def initialize
  440.     # メーター群の生成
  441.     @meters = []
  442.     for i in 0...$game_party.actors.size
  443.       make_meter(i)
  444.     end
  445.     refresh
  446.   end
  447.   #--------------------------------------------------------------------------
  448.   # ○ リフレッシュ
  449.   #--------------------------------------------------------------------------
  450.   def refresh
  451.     # 戦闘メンバー数の変更を判別
  452.     for i in @meters.size...$game_party.actors.size
  453.       make_meter(i)
  454.     end
  455.     for i in [email protected]
  456.       @meters[i].dispose
  457.       @meters[i] = nil
  458.     end
  459.     @meters.compact!
  460.     # 表示更新
  461.     for i in 0...$game_party.actors.size
  462.       actor = $game_party.actors[i]
  463.       @meters[i].line   = actor.cp_linetype
  464.       @meters[i].amount = actor.cp_lineamount
  465.     end
  466.   end
  467.   #--------------------------------------------------------------------------
  468.   # ○ メーターひとつの生成
  469.   #--------------------------------------------------------------------------
  470.   def make_meter(i)
  471.     # スキンの取得
  472.     skin = RPG::Cache.windowskin(XRXS65::SKIN)
  473.     #
  474.     space = 640 / XRXS65::MAX
  475.     case XRXS65::ALIGN
  476.     when 0
  477.       actor_x = i * space + 2
  478.     when 1
  479.       actor_x = (space * ((XRXS65::MAX - $game_party.actors.size)/2.0 + i)).floor
  480.     when 2
  481.       actor_x = (i + XRXS65::MAX - $game_party.actors.size) * space + 2
  482.     end
  483.     meter = MeterSprite.new(skin, XRXS65::LINE_HEIGHT)
  484.     meter.x = actor_x + XRXS65::X_OFFSET - skin.width
  485.     meter.y = XRXS65::Y_OFFSET
  486.     @meters[i] = meter
  487.   end
  488.   #--------------------------------------------------------------------------
  489.   # ○ 可視状態
  490.   #--------------------------------------------------------------------------
  491.   def visible=(b)
  492.     @meters.each{|sprite| sprite.visible = b }
  493.   end
  494.   #--------------------------------------------------------------------------
  495.   # ○ 解放
  496.   #--------------------------------------------------------------------------
  497.   def dispose
  498.     @meters.each{|sprite| sprite.dispose }
  499.   end
  500. end
  501. #==============================================================================
  502. # --- XRXS. レクタンギュラーメーター表示・極 ---
  503. #==============================================================================
  504. class MeterSprite < Sprite
  505.   #--------------------------------------------------------------------------
  506.   # ○ オブジェクト初期化
  507.   #--------------------------------------------------------------------------
  508.   def initialize(skin, line_height)
  509.     @skin   = skin
  510.     @width  = @skin.width
  511.     @height = line_height
  512.     @line   = 1
  513.     @amount = 0
  514.     @base_sprite = Sprite.new
  515.     @base_sprite.bitmap = @skin
  516.     @base_sprite.src_rect.set(0, 0, @width, @height)
  517.     @base_sprite.z = 601
  518.     super()
  519.     self.z = @base_sprite.z + 1
  520.     self.bitmap = @skin
  521.     self.line = 1
  522.   end
  523.   #--------------------------------------------------------------------------
  524.   # ○ 値の設定
  525.   #--------------------------------------------------------------------------
  526.   def line=(n)
  527.     @line = n
  528.     refresh
  529.   end
  530.   def amount=(n)
  531.     @amount = n
  532.     refresh
  533.   end
  534.   def refresh
  535.     self.src_rect.set(0, @line * @height, @width * @amount / 100, @height)
  536.   end
  537.   #--------------------------------------------------------------------------
  538.   # ○ 座標の設定
  539.   #--------------------------------------------------------------------------
  540.   def x=(n)
  541.     super
  542.     @base_sprite.x = n
  543.   end
  544.   def y=(n)
  545.     super
  546.     @base_sprite.y = n
  547.   end
  548.   #--------------------------------------------------------------------------
  549.   # ○ 解放
  550.   #--------------------------------------------------------------------------
  551.   def dispose
  552.     @base_sprite.dispose
  553.     super
  554.   end
  555. end
复制代码
囡囚囨囚囨図囨囧

Lv1.梦旅人

梦石
0
星屑
50
在线时间
320 小时
注册时间
2011-6-23
帖子
260
2
发表于 2011-8-26 16:37:46 | 只看该作者
不要老做伸手党!
这样只会成为“抄人”!
你的想法和西游奇缘2的差不多,去参考一下奇缘2吧。
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 11:04

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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