#============================================================================== # ■ 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,使用和转载请保留此信息 #==============================================================================
|