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

Project1

 找回密码
 注册会员
搜索
Project1 查看内容

合体技能脚本v1.0

2008-1-24 23:49| 发布者: 御灵| 查看: 4441| 评论: 0|原作者: Eclair|来自: 点此进入发布帖

摘要: #==============================================================================# 本脚本来自www.66RPG.com,使用和转载请保留此信息#============================================================================== #============================

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================

#==============================================================================
#合体技能系统v1.0 BY 绿发的Eclair
#嗯...这个脚本可以相对完美地实现多人合力技能的效果。
#使用方法:
#首先设定合体技能使用的成员,在数据库最后一页的“属性”中设定如下格式的属性:
#合体技,第一个队员ID,第二个队员ID
#记得一定要用英文逗号分隔“合体技”三个字和使用队员哦,不然会错。
#如果技能需要三人以上合力,只要在第二个队员ID后面继续添加一个半角逗号和第三个人的ID即可。
#PS:默认战斗超出4人以上的合体技能是一定用不鸟的- -|||具体原因在这脚本之中~~
#最后只要把想设定成合体技能的技能勾上这个属性就完成了,就这么简单。
#最后,和战斗类脚本发生冲突的可能性非常高,使用这个脚本之前最好找个技工帮忙(如果自己就是技工的话54这句8~)
#==============================================================================

#==============================================================================
# ■ Game_chain
#------------------------------------------------------------------------------
#  - -|||一个伪造的battler模子....
#==============================================================================
class Game_chain
  attr_accessor :atk
  attr_accessor :str
  attr_accessor :dex
  attr_accessor :agi
  attr_accessor :int
  attr_accessor :hit
  def initialize
    @atk = 0
    @str = 0
    @dex = 0
    @agi = 0
    @int = 0
    @hit = 0
  end
end
module RPG
  class Skill
    def chain_id
      use = []
      for i in @element_set
        if $data_system.elements[i].split(/,/)[0] == "合体技"
          for j in 1...$data_system.elements[i].split(/,/).size
            use.push($data_system.elements[i].split(/,/)[j].to_i)
          end
        end
      end
      return use
    end
  end
end
#==============================================================================
# ■ Scene_Battle (分割定义 4)
#------------------------------------------------------------------------------
#  处理战斗画面的类。
#==============================================================================

class Scene_Battle
  attr_accessor :phase
  #--------------------------------------------------------------------------
  # ● 刷新画面画面 (角色命令回合 : 选择敌人)
  #--------------------------------------------------------------------------
  def update_phase3_enemy_select
    # 刷新敌人箭头
    @enemy_arrow.update
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 选择敌人结束
      end_enemy_select
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 设置行动
      @active_battler.current_action.target_index = @enemy_arrow.index
      #####################################################eclair
        if @skill_window != nil
        if @active_battler.current_action.kind == 1 and $data_skills[@active_battler.current_action.skill_id].chain_id != []
        for i in $game_party.actors
     
      for j in $data_skills[@active_battler.current_action.skill_id].chain_id
          if i.id == j
          i.current_action.target_index = @enemy_arrow.index
          end
        end
        end
      end
      end
      #####################################################eclair
     
      # 选择敌人结束
      end_enemy_select
      # 显示特技窗口中的情况下
      if @skill_window != nil
        # 结束特技选择
        end_skill_select
      end
      # 显示物品窗口的情况下
      if @item_window != nil
        # 结束物品选择
        end_item_select
      end
      # 转到下一位角色的指令输入
      phase3_next_actor
    end
  end

  #--------------------------------------------------------------------------
  # ● 设置角色指令窗口
  #--------------------------------------------------------------------------
  def phase3_setup_command_window
    ######################################################eclair
    if @active_battler.chain_id != 0
      phase3_next_actor
      return
    end
    ######################################################eclair
    # 同伴指令窗口无效化
    @party_command_window.active = false
    @party_command_window.visible = false
    # 角色指令窗口无效化
    @actor_command_window.active = true
    @actor_command_window.visible = true
    # 设置角色指令窗口的位置
    @actor_command_window.x = @actor_index * 160
    # 设置索引为 0
    @actor_command_window.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 转向前一个角色的命令输入
  #--------------------------------------------------------------------------
  def phase3_prior_actor
    ######################################################eclair
    if $game_party.actors[@actor_index - 1].chain_id != 0
    a = $game_party.actors[@actor_index - 1].chain_id
    b = []
    for i in $game_party.actors
      i.blink = false
      if i.chain_id == a
      b.push(i.id)
      end
    end
    for j in b
      $game_actors[j].chain_id = 0
      $game_actors[j].chain_over = false
    end
    @actor_index = b.min
    @active_battler = $game_party.actors[@actor_index]
    end 
    ######################################################eclair
    # 循环
    begin
      # 角色的明灭效果 OFF
      if @active_battler != nil
        @active_battler.blink = false
      end
      # 最初的角色的情况下
      if @actor_index == 0
        # 开始同伴指令回合
        start_phase2
        return
      end
      # 返回角色索引
      @actor_index -= 1
      @active_battler = $game_party.actors[@actor_index]
      @active_battler.blink = true
    # 如果角色是在无法接受指令的状态就再试
    end until @active_battler.inputable?
    # 设置角色的命令窗口
    phase3_setup_command_window
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 1 : 准备行动)
  #--------------------------------------------------------------------------
  def update_phase4_step1
    # 隐藏帮助窗口
    @help_window.visible = false
    # 判定胜败
    if judge
      # 胜利或者失败的情况下 : 过程结束
      return
    end
    # 强制行动的战斗者不存在的情况下
    if $game_temp.forcing_battler == nil
      # 设置战斗事件
      setup_battle_event
      # 执行战斗事件中的情况下
      if $game_system.battle_interpreter.running?
        return
      end
    end
    # 强制行动的战斗者存在的情况下
    if $game_temp.forcing_battler != nil
      # 在头部添加后移动
      @action_battlers.delete($game_temp.forcing_battler)
      @action_battlers.unshift($game_temp.forcing_battler)
    end
    # 未行动的战斗者不存在的情况下 (全员已经行动)
    ##################################################eclair
    if @action_battlers.size == 0
      for i in $game_party.actors
        i.chain_over = false
        i.chain_id = 0
      end
      # 开始同伴命令回合
      start_phase2
      return
    end
    ##################################################eclair
    # 初始化动画 ID 和公共事件 ID
    @animation1_id = 0
    @animation2_id = 0
    @common_event_id = 0
    # 未行动的战斗者移动到序列的头部
    @active_battler = @action_battlers.shift
    # 如果已经在战斗之外的情况下
    if @active_battler.index == nil
      return
    end
    # 连续伤害
    if @active_battler.hp > 0 and @active_battler.slip_damage?
      @active_battler.slip_damage_effect
      @active_battler.damage_pop = true
    end
    # 自然解除状态
    @active_battler.remove_states_auto
    # 刷新状态窗口
    @status_window.refresh
    # 移至步骤 2
    @phase4_step = 2
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (角色命令回合 : 选择特技)
  #--------------------------------------------------------------------------
  def update_phase3_skill_select
    # 设置特技窗口为可视状态
    @skill_window.visible = true
    # 刷新特技窗口
    @skill_window.update
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 结束特技选择
      end_skill_select
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 获取特技选择窗口现在选择的特技的数据
      @skill = @skill_window.skill
      # 无法使用的情况下
      if @skill == nil or not @active_battler.skill_can_use?(@skill.id)
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 设置行动
      @active_battler.current_action.skill_id = @skill.id
      ####################################################eclair
      #设定合体技能ID
      if @active_battler.is_a?(Game_Actor)
        for i in $data_skills[@skill.id].chain_id
        for j in $game_party.actors
          if j.id == i
          j.current_action.kind = 1
          j.chain_id = @skill.id   
          end
          end
        end
      end
      ####################################################eclair
      # 设置特技窗口为不可见状态
      @skill_window.visible = false
      # 效果范围是敌单体的情况下
      if @skill.scope == 1
        # 开始选择敌人
        start_enemy_select
      # 效果范围是我方单体的情况下
      elsif @skill.scope == 3 or @skill.scope == 5
        # 开始选择角色
        start_actor_select
      # 效果范围不是单体的情况下
      else
        # 选择特技结束
        end_skill_select
        # 转到下一位角色的指令输入
        phase3_next_actor
      end
      return
    end
    end
  #--------------------------------------------------------------------------
  # ● 生成特技行动结果
  #--------------------------------------------------------------------------
  def make_skill_action_result
    # 获取特技
    @skill = $data_skills[@active_battler.current_action.skill_id]
    #################################################eclair
    if @active_battler.chain_over == true
    @help_window.visible = false
    @phase4_step = 1
    return
  end
 
    if @active_battler.chain_id != 0
    @skill = $data_skills[@active_battler.chain_id]
    @a = Game_chain.new
    for i in $data_skills[@skill.id].chain_id
      for j in $game_party.actors
      if j.id == i
        @a.atk += j.atk / @skill.chain_id.size
        @a.str += j.str / @skill.chain_id.size
        @a.dex += j.dex / @skill.chain_id.size
        @a.agi += j.agi / @skill.chain_id.size
        @a.int += j.int / @skill.chain_id.size
        @a.hit += j.hit / @skill.chain_id.size
      end
    end
  end
end
    #################################################eclair
    # 如果不是强制行动
    unless @active_battler.current_action.forcing
      # 因为 SP 耗尽而无法使用的情况下
      unless @active_battler.skill_can_use?(@skill.id)
        # 清除强制行动对像的战斗者
        $game_temp.forcing_battler = nil
        # 移至步骤 1
        @phase4_step = 1
        return
      end
    end
    # 消耗 SP
    ##################################################eclair
    if @skill.chain_id != []
      for i in @skill.chain_id
        $game_actors[i].sp -= @skill.sp_cost
      end
    else
      @active_battler.sp -= @skill.sp_cost
    end
    ##################################################eclair
    # 刷新状态窗口
    @status_window.refresh
    # 在帮助窗口显示特技名
    @help_window.set_text(@skill.name, 1)
    # 设置动画 ID
    @animation1_id = @skill.animation1_id
    @animation2_id = @skill.animation2_id
    # 设置公共事件 ID
    @common_event_id = @skill.common_event_id
    # 设置对像侧战斗者
    set_target_battlers(@skill.scope)
    # 应用特技效果
       #####################################################eclair
    if @active_battler.chain_id == 0
    for target in @target_battlers
      target.skill_effect(@active_battler, @skill)
    end
  else
    for target in @target_battlers
      target.skill_effect(@a, @skill)
    end
  end
    ######################################################eclair
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 3 : 行动方动画)
  #--------------------------------------------------------------------------
  def update_phase4_step3
    # 行动方动画 (ID 为 0 的情况下是白色闪烁)
    ####################################################eclair
    if @active_battler.chain_id == 0#1
 
    if @animation1_id == 0#2
      @active_battler.white_flash = true
    else
      @active_battler.animation_id = @animation1_id
      @active_battler.animation_hit = true
    end#2
   
  else
   
    for i in $data_skills[@skill.id].chain_id#4
    for j in $game_party.actors#5
    if j.id == i#3
    j.animation_id = $data_skills[@skill.id].animation1_id
    j.animation_hit = true
   
    end#3
  end#4
end#5

  end#1
   ########################################################eclair
    # 移至步骤 4
    @phase4_step = 4
  end
 
 
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 5 : 显示伤害)
  #--------------------------------------------------------------------------
  def update_phase4_step5
    # 隐藏帮助窗口
    @help_window.visible = false
    # 刷新状态窗口
    @status_window.refresh
    # 显示伤害
    for target in @target_battlers
      if target.damage != nil
        target.damage_pop = true
      end
    end
    #####################################################eclair
    if @active_battler.chain_id != 0
      for i in $game_party.actors
        if i.chain_id == @active_battler.chain_id
           i.chain_over = true
        end
      end
    end
    #####################################################eclair
    # 移至步骤 6
    @phase4_step = 6
  end
end
#==============================================================================
# ■ Game_Battler (分割定义 1)
#------------------------------------------------------------------------------
#  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
# 超级类来使用。
#==============================================================================
class Game_Battler
  attr_accessor :chain_id                  # 使用合体技能的ID
  attr_accessor :chain_over                # 合体技能使用完毕的标志
  alias initialize_c initialize
  def initialize
    initialize_c
    @chain_id = 0
    @chain_over = false
  end
  #--------------------------------------------------------------------------
  # ● 可以使用特技的判定
  #     skill_id : 特技 ID
  #--------------------------------------------------------------------------
  def skill_can_use?(skill_id)
    # SP 不足的情况下不能使用
    if $data_skills[skill_id].sp_cost > self.sp
      return false
    end
    # 战斗不能的情况下不能使用
    if dead?
      return false
    end
    # 沉默状态的情况下、物理特技以外的特技不能使用
    if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
      return false
    end
    ###################################################eclair
    if $data_skills[skill_id].chain_id != [] and self.is_a?(Game_Actor)
      for i in $data_skills[skill_id].chain_id
        return false if !$game_party.actors.include?($game_actors[i])
        return false if !$game_actors[i].movable? or !$game_actors[i].inputable? or $game_actors[i].dead?
        return false if $game_actors[i].chain_id != 0 and ($game_actors[i].sp < $data_skills[skill_id].sp_cost)
        return false if $game_actors[i].chain_id != 0 && skill_id and $scene.phase != 4
      end
    end
    ##################################################eclair
    # 获取可以使用的时机
    occasion = $data_skills[skill_id].occasion
    # 战斗中的情况下
    if $game_temp.in_battle
      # [平时] 或者是 [战斗中] 可以使用
      return (occasion == 0 or occasion == 1)
    # 不是战斗中的情况下
    else
      # [平时] 或者是 [菜单中] 可以使用
      return (occasion == 0 or occasion == 2)
    end
  end
end

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================

 范例:
http://bbs.66rpg.com/UP_PIC/200801/合体技能.rar

2

鲜花

刚表态过的朋友 (2 人)

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

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

GMT+8, 2024-11-26 05:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部