|
脚本:
#encoding:utf-8
# 物品界面扩展,v1.0 for rmva(RGSS3)
#分类定义方法:
# 数据库中,注释部分 itemclass:类型:end
#使用说明:
# 常量ITEM_CLASS_LIST,这是一个Hash表,分类名称对应一个标号,标号决定了当这些
# 分类同时存在时列表上显示的先后顺序
# 对于使用范围为我方单体的物品,会出现一个选择框选择使用目标
# 对于使用范围为我方全体的物品,会直接使用,不显示选择框
# 注意看一下调用本界面的方法
# 如有bug请及时联系我,66rpg上或者我qq 1441157749
# 浮云半仙 2015.8.12完工
#偷偷地在这里加个命名空间 O(∩_∩)O
module FYBX
#----
#物品全部分类列表,名称 => 序号 (序号影响显示先后顺序)
ITEM_CLASS_LIST = {
"回复类" => 0,
"治愈类" => 1,
"能力提升" => 2,
"贵重物品" => 3,
"信件文档" => 4,
"武器" => 5,
"防具" => 6,
"饰品" => 7
}
#如果你的菜单使用的是va原先自带的菜单,则可以去掉下面这段代码的注释(删掉=begin和=end),
#这段代码能够使得菜单调用物品界面时进入 FYBX::Scene_Item
=begin
Scene_Menu.send :define_method, :command_item do
SceneManager.call(FYBX::Scene_Item)
end
=end
#如果你的游戏菜单用的不是va自带的,最好不要去掉注释,否则可能会出错
#这种情况下请自行修改物品界面调用
class Window_ItemClassList < Window_Selectable
attr_reader :have_classes #已有的项目
def initialize
super(0,40,140,320)
@have_classes = Array.new
make_item_class_list
open
select(0)
activate
end
#生成物品分类列表
def make_item_class_list
contents.clear
@have_classes = []
$game_party.all_items.each do |each_item|
full_desc = each_item.note[/(itemclass:).+(:end)/]
#msgbox(full_desc) #测试通过
#msgbox(full_desc[9..full_desc.length-5]) #测试通过
type = full_desc[10..full_desc.length-5]
@have_classes.push(type)
end
@have_classes.uniq!
@have_classes.sort! do
|a,b| ITEM_CLASS_LIST[a] <=> ITEM_CLASS_LIST[b]
end
#绘制出所有项目
idx = 0
@have_classes.each do |each_itemclassname|
draw_item(idx,each_itemclassname)
idx += 1
end
update
end
#绘制项目
def draw_item(index,text)
draw_text(item_rect_for_text(index), text)
end
def item_max
return @have_classes? @have_classes.size : 1
end
#获取当前分类
def current_class
return @have_classes[@index] if [0...@have_classes.size] === @index
return nil
end
#刷新列表
def refresh_list
make_item_class_list
end
end
class Window_ItemList < Window_Selectable
attr_reader :items
attr_reader :current_class
def initialize(x,y,w,h)
super(x,y,w,h)
@@last_select = 0
@items = Array.new
open
end
#生成当前分类下的物品列表
def make_item_list(current_class)
return if current_class == nil
@current_class = current_class
@items = []
contents.clear
$game_party.all_items.each do |each_item|
full_desc = each_item.note[/(itemclass:).+(:end)/]
type = full_desc[10..full_desc.length-5]
next if type != current_class
@items.push(each_item)
end
if @items == []
call_handler(:cancel)
end
idx = 0
@items.each do|each_item|
draw_item(idx,each_item)
idx += 1
end
end
def draw_item(index,item)
rect = item_rect(index)
rect.width -= 4
draw_item_name(item, rect.x, rect.y,
item.is_a?(RPG::Item)? item.menu_ok? : false, width/2)
draw_item_number(rect,item)
end
#绘制物品个数 O(∩_∩)O~好吧我承认这个方法是我从va自带脚本Window_ItemList复制来的
def draw_item_number(rect, item)
draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2)
end
def item_max
return @items? @items.size : 1
end
#刷新列表
def refresh_list
make_item_list(@current_class)
end
end
class Window_SelectActor < Window_Selectable
attr_reader :cur_item
def initialize(cur_item)
super(0,0,220,Graphics.height)
@cur_item = cur_item
make_list
end
#生成角色列表
def make_list
idx = 0
$game_party.members.size.times do
draw_item(idx)
idx += 1
end
end
def item_height
return (Graphics.height-standard_padding*2)/4
end
def item_max
return $game_party.members.size
end
#这个draw_item来自原va自带脚本Scene_MenuStatus.并做了些修改
def draw_item(index)
actor = $game_party.members[index]
rect = item_rect(index)
draw_actor_face(actor, rect.x + 1, rect.y + 1, true)
draw_actor_simple_status(actor, rect.x + 108, rect.y + line_height / 2)
end
#绘制人物状态
def draw_actor_simple_status(actor, x, y)
draw_actor_name(actor, x, y)
draw_actor_hp(actor, x , y + line_height * 1, 80)
draw_actor_mp(actor, x , y + line_height * 2, 80)
end
end
class Scene_Item < Scene_Base
def start
super
@itemclslist_last_select = 0
@useitem_last_select = 0
@current_item = nil
@window_useitem = nil
@window_itemclslist = Window_ItemClassList.new
@window_itemclslist.set_handler(:cancel , method(:return_scene))
@window_itemclslist.set_handler(:ok , method(:itemclslist_onok))
@window_itemclslist.set_handler(:moved , method(:refresh_itemclslist_moved))
@window_itemlist = Window_ItemList.new(@window_itemclslist.width,
@window_itemclslist.y,Graphics.width - @window_itemclslist.width,
@window_itemclslist.height)
@window_itemlist.make_item_list(@window_itemclslist.have_classes[0])
@window_itemlist.set_handler(:cancel , method(:item_list_cancel))
@window_itemlist.set_handler(:moved , method(:refresh_itemlist_moved))
@window_itemlist.set_handler(:ok , method(:item_list_ok))
@window_classtip = Window_Help.new(1)
@window_classtip.set_text("物品:"+(@window_itemclslist.have_classes[@window_itemclslist.index] != nil ? @window_itemclslist.have_classes[@window_itemclslist.index] : ""))
@window_classtip.open
@window_itemdesc = Window_Help.new
@window_itemdesc.x = 0
@window_itemdesc.y = @window_itemlist.y+@window_itemlist.height
@window_itemdesc.width = Graphics.width
@window_itemdesc.height = Graphics.height - @window_itemdesc.y
@window_itemdesc.set_text("")
@window_itemdesc.open
end
#在物品分类列表内按下确定键的处理
def itemclslist_onok
Sound.play_ok
@window_itemclslist.unselect
@window_itemlist.activate
@window_itemlist.select(0)
@window_itemdesc.set_text(@window_itemlist.items[@window_itemlist.index]? @window_itemlist.items[@window_itemlist.index].description : "")
end
#在物品列表内按下取消键的处理
def item_list_cancel
Sound.play_cancel
@window_itemlist.unselect
@window_itemclslist.select(@itemclslist_last_select)
@window_itemclslist.activate
end
#在物品列表内按下确定键时的处理
def item_list_ok
if !current_item_enabled?
Sound.play_buzzer
@window_itemlist.activate
return
end
Sound.play_ok
current_item = @window_itemlist.items[@window_itemlist.index]? @window_itemlist.items[@window_itemlist.index] : nil
return if current_item == nil
#msgbox(current_item.name) #测试 结果 正确
@window_itemlist.active = false
if current_item.scope == 7 #物品使用范围为我方单体
@window_useitem = Window_SelectActor.new(current_item)
@window_useitem.set_handler(:cancel ,method(:select_actor_cancel))
@window_useitem.set_handler(:ok ,method(:select_actor_ok))
@window_useitem.select(@useitem_last_select)
@window_useitem.activate
elsif current_item.scope == 8 #物品使用范围为我方全体
use_item($game_party.members[0],current_item)
@window_itemlist.activate
end
end
#当前物品是否可用?
def current_item_enabled?
$game_party.usable?(@window_itemlist.items[@window_itemlist.index])
end
#物品分类列表,光标移动时的处理
def refresh_itemclslist_moved
@itemclslist_last_select = @window_itemclslist.index
@window_classtip.set_text("物品:"+(@window_itemclslist.have_classes[@window_itemclslist.index] != nil ? @window_itemclslist.have_classes[@window_itemclslist.index] : ""))
@window_itemlist.make_item_list(@window_itemclslist.have_classes[@window_itemclslist.index])
end
#物品列表,光标移动时的处理
def refresh_itemlist_moved
@window_itemdesc.set_text(@window_itemlist.items[@window_itemlist.index]? @window_itemlist.items[@window_itemlist.index].description : "")
end
#选择角色的窗口内按下取消键
def select_actor_cancel
Sound.play_cancel
@window_useitem.close
@window_itemlist.activate
end
#选择角色的窗口内按下确定键
def select_actor_ok
@useitem_last_select = @window_useitem.index
@window_useitem.activate
user = $game_party.members[@window_useitem.index]
item = @window_useitem.cur_item
use_item(user,item)
end
#下面三个方法是从Scene_ItemBase里面复制来的 \(^o^)/~ 略做改动
def item_target_actors(item)
if !item.for_friend?
[]
elsif item.for_all?
$game_party.members
else
[$game_party.members[@window_useitem.index]]
end
end
def use_item_to_actors(user,item)
item_target_actors(item).each do |target|
item.repeats.times { target.item_apply(user, item) }
end
end
def use_item(user,item)
Sound.play_use_item
user.use_item(item)
use_item_to_actors(user,item)
check_common_event
check_gameover
@window_useitem.refresh if @window_useitem != nil && @window_useitem.open?
@window_itemclslist.refresh_list
@window_itemlist.refresh_list
end
def check_common_event
SceneManager.goto(Scene_Map) if $game_temp.common_event_reserved?
end
def update
super
if @window_itemclslist.active &&(Input.trigger?(:UP) || Input.trigger?(:DOWN))
@window_itemclslist.call_handler(:moved)
end
if @window_itemlist.active &&(Input.trigger?(:UP) || Input.trigger?(:DOWN))
@window_itemlist.call_handler(:moved)
end
end
end
#-----------------------
end #命名空间结束
#-----------------------
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2024-4-26 01:57
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.