#==============================================================================
# ■ Scene_Item
#------------------------------------------------------------------------------
# 处理物品画面的类。
#==============================================================================
class Scene_Item
#--------------------------------------------------------------------------
# ● 初始化对像■■■■■■■■■■■■■■■■■■■■■■
# actor_index : 角色索引
#--------------------------------------------------------------------------
def initialize(actor_index = 0, equip_index = 0)
@actor_index = actor_index # 返回菜单用
end
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def main
# 获取角色
@actor = $game_party.actors[@actor_index]
# 获取角色现在装备的物品
@right_window = Window_Eq.new(@actor)
# 隐藏装备栏索引
@right_window.index = -1
# 隐藏装备栏窗口
@right_window.active = false
# 生成装备帮助窗口
@help1_window = Shop_Help.new
# 关联装备帮助窗口
@right_window.help_window = @help1_window
@right_window.help_window.z = 2000
# 提示窗口
@tip = Window_Tip_Item.new
# 显示人物动态图窗口
@dongtaitu_window = Window_dtt.new(@actor)
# 生成物品分类窗口
@itemcommand_window = Fenlei_Command.new
@command_index = @itemcommand_window.index
# 生成物品窗口
@itemlist_window = Actor_Item.new(@actor)
@itemlist_window.active = false
# 生成物品帮助窗口
@help_window = Shop_Help.new
# 关联物品帮助窗口
@itemlist_window.help_window = @help_window
# 生成目标窗口 (设置为不可见・不活动)
@target_window = Window_Target_zl.new
@target_window.visible = false
@target_window.active = false
# 生成头像框
@sthero_window = Window_Sthero.new
# 显示游戏界面1图片
@jiemian = Sprite.new
@jiemian.bitmap = Bitmap.new("Graphics/Pictures/Ui/主界面/游戏界面1")
@jiemian.z = 200
# 显示游戏界面2图片
@jiemian1 = Sprite.new
@jiemian1.bitmap = Bitmap.new("Graphics/Pictures/Ui/主界面/游戏界面2")
@jiemian1.y = 715
@jiemian1.z = 200
# 生成背景图窗口
@back = Sprite.new
@back.bitmap = Bitmap.new("Graphics/Pictures/Ui/物品界面/物品背景")
@back.y = (768-555)/2-53/2
@back.z = 200
# 生成现实时间窗口
@realtime_window = Window_RealTime.new
# 生成游戏时间窗口
@playtime_window = Window_PlayTime.new
# 显示队伍头像
@dtx = Window_DuiTouxiang.new
# 生成金钱窗口
@gold_window = Window_Gold.new
@gold_window.x = 58+2
@gold_window.y = 571
@gold_window.opacity = 0
# 生成队标窗口
@db = Window_db.new
# 队伍人数大于1
if $game_party.actors.size <= 1
# 隐藏队标窗口
@db.visible = false
else
# 显示队标窗口
@db.visible = true
end
# 物品窗口索引
@itemlist_window.set_item(@command_index)
# 执行过度
Graphics.transition
# 主循环
loop do
# 刷新游戏画面
Graphics.update
# 刷新输入信息
Input.update
# 刷新画面
update
# 如果画面切换就中断循环
if $scene != self
break
end
end
# 装备过渡
Graphics.freeze
# 释放物品分类窗口
@itemcommand_window.dispose
# 释放物品栏窗口
@itemlist_window.dispose
# 释放目标被激活的窗口
@target_window.dispose
# 释放提示窗口
@tip.dispose
# 释放装备窗口
@right_window.dispose
# 释放物品帮助窗口
@help_window.dispose
# 释放装备帮助窗口
@help1_window.dispose
# 释放人物动态图窗口
@dongtaitu_window.dispose
# 释放头像框
@sthero_window.dispose
# 释放现实时间窗口
@realtime_window.dispose
# 释放游戏时间窗口
@playtime_window.dispose
# 释放队伍头像
@dtx.dispose
# 释放界面图片
@jiemian.dispose
@jiemian.bitmap.dispose
@jiemian1.dispose
@jiemian1.bitmap.dispose
# 释放背景图窗口
@back.dispose
# 释放背景图图片
@back.bitmap.dispose
# 释放金钱窗口
@gold_window.dispose
# 释放队标窗口
@db.dispose
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
#【仿网游动态地图界面】
$spriteset.update
# 刷新队伍头像
@dtx.update
# 刷新游戏时间窗口
@playtime_window.update
# 刷新显示时间窗口
@realtime_window.update
# 刷新装备窗口
@right_window.update
# 物品提示窗口
@tip.update
# 刷新物品分类
@itemcommand_window.update
# 刷新物品栏窗口
@itemlist_window.update
# 刷新人物动态图窗口
@dongtaitu_window.update
# 刷新物品帮助窗口
@help_window.update
# 刷新装备帮助窗口
@help1_window.update
# 刷新头像框
@sthero_window.update
# 刷新界面图片
@jiemian.update
@jiemian1.update
# 刷新背景图窗口
@back.update
# 刷新金钱窗口
@gold_window.update
# 队伍人数大于1
if $game_party.actors.size <= 1
# 隐藏队标窗口
@db.visible = false
# 刷新队标窗口
@db.update
else
# 显示队标窗口
@db.visible = true
# 刷新队标窗口
@db.update
end
# 调整装备栏光标距离
irect = @right_window.cursor_rect
w = @help1_window
w.x = @right_window.x + irect.x + irect.width + 13
w.y = @right_window.y + irect.y + irect.height + 13
if w.x + w.width > 1024
w.x = 1024 - w.width
end
if w.y + w.height > 400#768
w.y = 400 - w.height
end
# 按下 ALT 的情况
if Kboard.keyboard(226)
# 按下 ALT + E 关闭物品画面
if Kboard.key(8,1)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 回到带头角色头像框
$temp_mapface_id = $game_party.actors[0].id
# 切换到地图画面
$scene = Scene_Map.new
return
end
end
# 队伍人数大于1时
if $game_party.actors.size > 1
# 按下 W 键的情况下
if Kboard.key(26,1)
# 演奏光标 SE
$game_system.se_play($data_system.cursor_se)
# 移至下一位角色
@actor_index += 1
@actor_index %= $game_party.actors.size
# 角色头像对应角色索引
$temp_mapface_id = $game_party.actors[@actor_index].id
# 回到物品栏索引
$scene = Scene_Item.new(@actor_index)
return
end
# 按下 Q 键的情况下
if Kboard.key(20,1)
# 演奏光标 SE
$game_system.se_play($data_system.cursor_se)
# 移至上一位角色
@actor_index += $game_party.actors.size - 1
@actor_index %= $game_party.actors.size
# 角色头像对应角色索引
$temp_mapface_id = $game_party.actors[@actor_index].id
# 回到物品栏索引
$scene = Scene_Item.new(@actor_index)
return
end
end
# 刷新目标被激活的窗口
@target_window.update
if @command_index != @itemcommand_window.index
@command_index = @itemcommand_window.index
@itemlist_window.set_item(@command_index)
end
# 物品分类被激活的情况下: 调用 update_itemcommand
if @itemcommand_window.active
update_itemcommand
return
end
# 物品窗口被激活的情况下: 调用 update_itemlist
if @itemlist_window.active
update_itemlist
return
end
# 目标窗口被激活的情况下: 调用 update_target
if @target_window.active
update_target
return
end
# 角色装备栏被激活的情况下:调用 update_equip
if @right_window.active
update_equip
return
end
end
#--------------------------------------------------------------------------
# ● 刷新画面 (物品分类窗口被激活的情况下)
#--------------------------------------------------------------------------
def update_itemcommand
# 按下 B 键的情况下 主窗口 B 键 退出
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 回到带头角色头像框
$temp_mapface_id = $game_party.actors[0].id
# 切换到地图画面
$scene = Scene_Map.new
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 如果没有选定命令项
if @itemlist_window.item_number == 0
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
return
end
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 激活物品分类窗口--关闭
@itemcommand_window.active = false
# 显示帮助窗口
@help_window.visible = true
# 激活物品栏窗口--打开
@itemlist_window.active = true
# 激活物品栏索引为第一个
@itemlist_window.index = 0
return
end
end
#--------------------------------------------------------------------------
# ● 刷新画面 (目标窗口被激活的情况下)
#--------------------------------------------------------------------------
def update_itemlist
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 打开物品分类
@itemcommand_window.active = true
# 关闭物品栏窗口
@itemlist_window.active = false
# 隐藏物品栏索引
@itemlist_window.index = -1
# 隐藏帮助窗口
@help_window.visible = false
@itemcommand_window.index = @command_index
# 索引返回到0,在回到-1达到隐藏效果
0.downto(-1) { |x| @itemlist_window.index = x }
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 获取项目窗口中当前选定的数据
@item = @itemlist_window.item
# 非使用项目时
unless @item.is_a?(RPG::Item)
=begin
# 不能装备演奏冻结SE。
unless @actor.can_equip?(@item)
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
@tip.tip("你不能装备!")
return
end
=end
# 武器或装备的场合
if @item.is_a?(RPG::Weapon) or @item.is_a?(RPG::Armor)
case @actor.can_equip?(@item)
when false
tip_str = "你不能装备!"
when nil
tip_str = "等级过低无法穿戴!"
else
tip_str = false
end
if tip_str
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
@tip.tip(tip_str)
return
end
end
# 激活装备界面
$game_system.se_play($data_system.decision_se)
if @item.nil?
@type = nil
else
@type = @item.is_a?(RPG::Weapon) ? 0 : @item.kind + 1
end
if @item != nil
@item1 == @itemlist_window.item
end
# 关闭物品栏窗口
@itemlist_window.active = false
@right_window.index = @type.nil? ? 0 : @type
# 打开装备栏窗口
@right_window.active = true
return
end
# 不可用时
unless $game_party.item_can_use?(@item.id)
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
@tip.tip("你不能使用该物品!")
return
end
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 效果范围是我方的情况下
if @item.scope >= 3
# 激活目标窗口
@itemlist_window.active = false
# 调整物品画面使用对像角色选择的窗口位置
@target_window.visible = true
@target_window.active = true
# 设置效果范围 (单体/全体) 的对应光标位置
if @item.scope == 4 || @item.scope == 6
@target_window.index = -1
else
@target_window.index = 0
end
# 效果在我方以外的情况下
else
# 公共事件 ID 有效的情况下
if @item.common_event_id > 0
# 预约调用公共事件
$game_temp.common_event_id = @item.common_event_id
# 演奏物品使用时的 SE
$game_system.se_play(@item.menu_se)
# 消耗品的情况下
if @item.consumable
# 使用的物品数减 1
$game_party.lose_item(@item.id, 1)
# 再描绘物品窗口的项目
@itemlist_window.draw_item(@itemlist_window.index)
end
# 切换到地图画面
$scene = Scene_Map.new
return
end
end
return
end
end
#--------------------------------------------------------------------------
# ● 刷新画面 (目标窗口被激活的情况下)
#--------------------------------------------------------------------------
def update_target
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 由于物品用完而不能使用的场合
unless $game_party.item_can_use?(@item.id)
# 再次生成物品窗口的内容
@itemlist_window.refresh
end
# 删除目标窗口
@itemlist_window.active = true
@target_window.visible = false
@target_window.active = false
@itemlist_window.set_item(@command_index)
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 如果物品用完的情况下
if $game_party.item_number(@item.id) == 0
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
# 物品提示
@tip.tip("物品已用完!")
return
end
# 目标是全体的情况下
if @target_window.index == -1
# 对同伴全体应用物品使用效果
used = false
for i in $game_party.actors
used |= i.item_effect(@item)
end
end
# 目标是单体的情况下
if @target_window.index >= 0
# 对目标角色应用物品的使用效果
target = $game_party.actors[@target_window.index]
used = target.item_effect(@item)
end
# 使用物品的情况下
if used
# 演奏物品使用时的 SE
$game_system.se_play(@item.menu_se)
# 消耗品的情况下
if @item.consumable
# 使用的物品数减 1
$game_party.lose_item(@item.id, 1)
# 再描绘物品窗口的项目
@itemlist_window.draw_item(@itemlist_window.index)
@itemlist_window.set_item(@command_index)
#如果使用后物品归零,则关闭Help_Window
if $game_party.item_number(@item.id) == 0
# 隐藏帮助窗口
@help_window.visible = false
# 删除目标窗口
@target_window.visible = false
@target_window.active = false
# 物品提示
@tip.tip("物品已用完!")
#这是为了让光标不要停留在空白处
if @itemlist_window.index > 0
@itemlist_window.index -= 1
end
# 激活物品窗口状态
@itemlist_window.active = true
end
end
# 再生成目标窗口的内容
@target_window.refresh
# 全灭的情况下
if $game_party.all_dead?
# 切换到游戏结束画面
$scene = Scene_Gameover.new
return
end
# 公共事件 ID 有效的情况下
if @item.common_event_id > 0
# 预约调用公共事件
$game_temp.common_event_id = @item.common_event_id
# 切换到地图画面
$scene = Scene_Map.new
return
end
end
# 无法使用物品的情况下
unless used
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
# 物品提示
@tip.tip("你不能使用该物品!")
end
return
end
end
# 刷新(角色装备)。
def update_equip
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# #隐藏物品分类
@itemlist_window.active = true
# 隐藏装备栏窗口
@right_window.active = false
# 隐藏装备帮助窗口
@help1_window.visible = false
# 隐藏装备索引
@right_window.index = -1
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
if @type != nil and @right_window.index != @type
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
# 物品提示
@tip.tip("不能装备在这儿!")
return
end
# 演奏装备 SE
$game_system.se_play($data_system.equip_se)
# 变更装备
@actor.equip(@right_window.index, @item == nil ? 0 : @item.id)
=begin
# 如果穿着后,装备归零,则关闭Help_Window
if $game_party.item_number(@item1.id) == 0
@help_window.visible = false
# 物品窗口索引判定(这是为了让光标不要停留在空白处)
if @itemlist_window.index > 0
# @itemlist_window.index -= 1
end
@item1 = nil
end
=end
# 索引=物品分类
@itemlist_window.set_item(@command_index)
# 刷新装备窗口
@right_window.refresh
# 关闭物品窗口激活状态
@itemlist_window.active = true
# 隐藏装备栏窗口
@right_window.active = false
# 隐藏装备帮助窗口
@help1_window.visible = false
# 隐藏装备索引
@right_window.index = -1
end
end
end