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

Project1

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

武器投掷 (仿《仙剑》扔武器伤人)

2006-2-19 00:00| 发布者: 柳柳| 查看: 6399| 评论: 0|原作者: 66RPG

摘要:    作者 亿万星辰  版本与更新  2006年2月更新  相关网址 点此进入讨论贴   范例工程 点此下载 脚本功能 战斗的时候可以使用武器,效果就是扔出去K敌人
 

 作者

亿万星辰

 版本与更新

 2006年2月更新

 相关网址

点此进入讨论贴 

 范例工程

点此下载



脚本功能

战斗的时候可以使用武器,效果就是扔出去K敌人

使用方法

复制全部脚本内容,在Main脚本之前按insert,插入此脚本全部内容。

其它请参考范例工程

其它

脚本冲突预计:高 


 

 脚本内容

#==============================================================================
# ■ Window_Item
#------------------------------------------------------------------------------
#  物品画面、战斗画面、显示浏览物品的窗口。
#==============================================================================

class Window_Item < Window_Selectable
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    # 添加宝物
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        @data.push($data_items[i])
      end
    end
    # 添加武器
    for i in 1...$data_weapons.size
      if $game_party.weapon_number(i) > 0
        @data.push($data_weapons[i])
      end
    end
    # 在战斗中以外添加防具
    unless $game_temp.in_battle
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0
          @data.push($data_armors[i])
        end
      end
    end
    # 如果项目数不是 0 就生成位图、重新描绘全部项目
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 描绘项目
  #     index : 项目编号
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    if item.is_a?(RPG::Item) and
       $game_party.item_can_use?(item.id)
      self.contents.font.color = normal_color
    else
      if $game_temp.in_battle and item.is_a?(RPG::Weapon)
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
    end
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  end
end

#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
#  处理战斗画面的类。
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 转向前一个角色的命令输入
  #--------------------------------------------------------------------------
  def phase3_prior_actor
    # 循环
    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]
      $game_party.gain_weapon(@active_battler.current_action.item_id[1], 1) if @active_battler.current_action.item_id[0] == false
      @active_battler.blink = true
    # 如果角色是在无法接受指令的状态就再试
    end until @active_battler.inputable?
    # 设置角色的命令窗口
    phase3_setup_command_window
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (角色命令回合 : 选择物品)
  #--------------------------------------------------------------------------
  def update_phase3_item_select
    # 设置物品窗口为可视状态
    @item_window.visible = true
    # 刷新物品窗口
    @item_window.update
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 选择物品结束
      end_item_select
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 获取物品窗口现在选择的物品资料
      @item = @item_window.item
      # 无法使用的情况下
      if @item.is_a?(RPG::Item)
        unless $game_party.item_can_use?(@item.id)
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      elsif [email protected]_a?(RPG::Weapon)
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 设置行动
      @active_battler.current_action.item_id = [@item.is_a?(RPG::Item), @item.id]
      # 设置物品窗口为不可见状态
      @item_window.visible = false
      # 效果范围是敌单体的情况下
      if @item.is_a?(RPG::Weapon) or @item.scope == 1
        $game_party.lose_weapon(@item.id, 1) if @item.is_a?(RPG::Weapon)
        # 开始选择敌人
        start_enemy_select
      # 效果范围是我方单体的情况下
      elsif @item.scope == 3 or @item.scope == 5
        # 开始选择角色
        start_actor_select
      # 效果范围不是单体的情况下
      else
        # 物品选择结束
        end_item_select
        # 转到下一位角色的指令输入
        phase3_next_actor
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面画面 (角色命令回合 : 选择敌人)
  #--------------------------------------------------------------------------
  def update_phase3_enemy_select
    # 刷新敌人箭头
    @enemy_arrow.update
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      $game_party.gain_weapon(@item_window.item.id, 1) if @item_window != nil and @item_window.item.is_a(RPG::Weapon)
      # 演奏取消 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
      # 选择敌人结束
      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 make_item_action_result
    # 获取物品
    data = @active_battler.current_action.item_id[0] ? $data_items : $data_weapons
    @item = data[@active_battler.current_action.item_id[1]]
    # 因为物品耗尽而无法使用的情况下
    if @active_battler.current_action.item_id[0]
      unless $game_party.item_can_use?(@item.id)
        # 移至步骤 1
        @phase4_step = 1
        return
      end
      # 消耗品的情况下
      if @item.consumable
        # 使用的物品减 1
        $game_party.lose_item(@item.id, 1)
      end
      # 设置公共事件 ID
      @common_event_id = @item.common_event_id
      # 在帮助窗口显示物品名
      @help_window.set_text(@item.name, 1)
      # 设置动画 ID
      @animation1_id = @item.animation1_id
      @animation2_id = @item.animation2_id
      # 确定对像
      index = @active_battler.current_action.target_index
      target = $game_party.smooth_target_actor(index)
      # 设置对像侧战斗者
      set_target_battlers(@item.scope)
    else
      # 在帮助窗口显示物品名
      @help_window.set_text(@item.name, 1)
      # 设置动画 ID
      @animation1_id = @item.animation1_id
      @animation2_id = @item.animation2_id
      # 确定对像
      index = @active_battler.current_action.target_index
      target = $game_party.smooth_target_actor(index)
      # 设置对像侧战斗者
      set_target_battlers(1)
    end
    # 应用物品效果
    for target in @target_battlers
      target.item_effect(@item)
    end
  end
end

#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
#  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
# 超级类来使用。
#==============================================================================

class Game_Battler
  ADDITION = 2  # 武器投掷时伤害与武器自身伤害的倍率
  #--------------------------------------------------------------------------
  # ● 应用物品效果
  #     item : 物品
  #--------------------------------------------------------------------------
  def item_effect(item)
    # 清除会心一击标志
    self.critical = false
    # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
    # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
    unless item.is_a?(RPG::Weapon)
      if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
         ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
        # 过程结束
        return false
      end
      # 清除有效标志
      effective = false
      # 公共事件 ID 是有效的情况下,设置为有效标志
      effective |= item.common_event_id > 0
      # 命中判定
      hit_result = (rand(100) < item.hit)
      # 不确定的特技的情况下设置为有效标志
      effective |= item.hit < 100
      # 命中的情况
      if hit_result == true
        # 计算回复量
        recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
        recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
        if recover_hp < 0
          recover_hp += self.pdef * item.pdef_f / 20
          recover_hp += self.mdef * item.mdef_f / 20
          recover_hp = [recover_hp, 0].min
        end
        # 属性修正
        recover_hp *= elements_correct(item.element_set)
        recover_hp /= 100
        recover_sp *= elements_correct(item.element_set)
        recover_sp /= 100
        # 分散
        if item.variance > 0 and recover_hp.abs > 0
          amp = [recover_hp.abs * item.variance / 100, 1].max
          recover_hp += rand(amp+1) + rand(amp+1) - amp
        end
        if item.variance > 0 and recover_sp.abs > 0
          amp = [recover_sp.abs * item.variance / 100, 1].max
          recover_sp += rand(amp+1) + rand(amp+1) - amp
        end
        # 回复量符号为负的情况下
        if recover_hp < 0
          # 防御修正
          if self.guarding?
            recover_hp /= 2
          end
        end
        # HP 回复量符号的反转、设置伤害值
        self.damage = -recover_hp
        # HP 以及 SP 的回复
        last_hp = self.hp
        last_sp = self.sp
        self.hp += recover_hp
        self.sp += recover_sp
        effective |= self.hp != last_hp
        effective |= self.sp != last_sp
        # 状态变化
        @state_changed = false
        effective |= states_plus(item.plus_state_set)
        effective |= states_minus(item.minus_state_set)
        # 能力上升值有效的情况下
        if item.parameter_type > 0 and item.parameter_points != 0
          # 能力值的分支
          case item.parameter_type
          when 1  # MaxHP
            @maxhp_plus += item.parameter_points
          when 2  # MaxSP
            @maxsp_plus += item.parameter_points
          when 3  # 力量
            @str_plus += item.parameter_points
          when 4  # 灵巧
            @dex_plus += item.parameter_points
          when 5  # 速度
            @agi_plus += item.parameter_points
          when 6  # 魔力
            @int_plus += item.parameter_points
          end
          # 设置有效标志
          effective = true
        end
        # HP 回复率与回复量为 0 的情况下
        if item.recover_hp_rate == 0 and item.recover_hp == 0
          # 设置伤害为空的字符串
          self.damage = ""
          # SP 回复率与回复量为 0、能力上升值无效的情况下
          if item.recover_sp_rate == 0 and item.recover_sp == 0 and
             (item.parameter_type == 0 or item.parameter_points == 0)
            # 状态没有变化的情况下
            unless @state_changed
              # 伤害设置为 "Miss"
              self.damage = "Miss"
            end
          end
        end
      # Miss 的情况下
      else
        # 伤害设置为 "Miss"
        self.damage = "Miss"
      end
    else
      # 计算基本伤害
      self.damage = item.atk * ADDITION
      # 属性修正
      self.damage *= elements_correct(item.element_set)
      self.damage /= 100
      # 伤害符号正确的情况下
      if self.damage > 0
        # 会心一击修正
        if rand(100) < 4 * item.dex_plus / self.agi
          self.damage *= 2
          self.critical = true
        end
        # 防御修正
        if self.guarding?
          self.damage /= 2
        end
      end
      # 分散
      if self.damage.abs > 0
        amp = [self.damage.abs * 15 / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # 状态冲击解除
      remove_states_shock
      # HP 的伤害计算
      self.hp -= self.damage
      # 状态变化
      @state_changed = false
      states_plus(item.plus_state_set)
      states_minus(item.minus_state_set)
    end
    # 不在战斗中的情况下
    unless $game_temp.in_battle
      # 伤害设置为 nil
      self.damage = nil
    end
    # 过程结束
    return effective
  end
end

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


 

脚本使用的通用说明

约定:本脚本来源于网络,任何人不得随意将本脚本应用于商业用途,如需转载,必须保留所有版权信息,如果是国内作者,最好征求作者同意——否则发生任何后果,66RPG不予负责。使用此脚本表示您默认接受上述约定。

说明:不同脚本之间、尤其是不同作者脚本之间会有冲突,本站会对已知脚本冲突进行简单说明。测试新脚本请下载本站提供的测试文件或者新建工程测试。脚本不要贪多,否则可能会互相冲突对您的游戏造成未知的影响。如果脚本内或者本站内提供了解释,请务必完全看完解释后再使用,如有问题,请到论坛讨论。


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

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

GMT+8, 2024-11-15 10:25

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部