查看: 3918|回复: 1

[交流讨论] 【RMVA发布】使用物品/装备后触发公共事件

[复制链接]
梦石
0
星屑
2920
在线时间
713 小时
注册时间
2010-7-25
回帖
659

开拓者

发表于 2017-8-18 16:25:23 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 jianyulei 于 2017-8-21 11:52 编辑

本体[pre lang="ruby"]
=begin
  使用物品/装备后触发公共事件  by:老香蕉
  
  插入后菜单将新增一个选项,点选进入道具选择界面,当选择任一一个道具后自动将道具
  的ID保存到变量并激活公共事件,你可以在公共事件里面设定一切你想做的东西,根据需
  求这个脚本会产生不同的作用。

  SceneManager.call(Scene_Item_hc)  也可以呼出菜单,另外,因为没有制作战斗中的
  使用方法,不想报错的话就不要在战斗中使用这个命令。

  使用例:
  你拥有武器ID3的PPK手枪和物品ID6的手枪用瞄准镜,你在公共事件121(武器公共事件)
  里写入分歧:如果变量11(接收物品ID的变量)等于3(PPK的ID号),则进入2个选项:
  选项1为加装瞄准镜,选项2为拆卸武器,在1选项里判断是否拥有手枪瞄准镜,是的话就
  删除手枪和瞄准镜得到“带有瞄准镜的PPK”,如果选2就失去武器,得到机器零件X3
  当然,实际使用的时候你可以随意设定,因为是使用公共事件,所以非常灵活和简单,
  缺点是不太方便,而且需要一定的脚本知识。
  
=end
#===============================================================
module LX20170818
  TXT = "改造"    #这里设定菜单显示的选项名称
  BIANL = 11       #这里设定占用的变量,用于接收物品ID
  GGSJ1 = 120    #道具的公共事件
  GGSJ2 = 121    #武器的公共事件
  GGSJ3 = 122    #防具的公共事件
  XXKG = 21    #菜单中是否显示选项的开关的ID
end  
#===============================================================
class Scene_Item_hc < Scene_ItemBase
  def start
      super
      create_help_window
      create_category1_window
      create_item1_window   
  end

  def create_category1_window  #新的分类
    @category_window = Window_ItemCategory.new
    @category_window.viewport = @viewport
    @category_window.help_window = @help_window
    @category_window.y = @help_window.height
    @category_window.set_handler(:ok,     method(:on_category1_ok))
    @category_window.set_handler(:cancel, method(:return_scene))
  end

  def create_item1_window   #新的物品
    wy = @category_window.y + @category_window.height
    wh = Graphics.height - wy
    @item_window = Window_ItemList_hc.new(0, wy, Graphics.width, wh)
    @item_window.viewport = @viewport
    @item_window.help_window = @help_window
    @item_window.set_handler(:ok,     method(:on_item1_ok))
    @item_window.set_handler(:cancel, method(:on_item1_cancel))
    @category_window.item_window = @item_window
  end

  def on_category1_ok #新的分类“确定”
    @item_window.activate
    @item_window.select_last
  end
  def on_item1_ok #新的物品“确定”
    $game_party.last_item.object = item
    determine_item_hc
  end
  def on_item1_cancel  #新的物品“取消”
    @item_window.unselect
    @category_window.activate
  end  
  def play_se_for_item   #音效
    Sound.play_use_item
  end
  def use_item    #使用物品
    super
    @item_window.redraw_current_item
  end  
  
end
#===============================================================
class Window_ItemList_hc < Window_Selectable

  def initialize(x, y, width, height) #初始化对象
    super
    @category = :none
    @data = []
  end

  def category=(category) #设置分类
    return if @category == category
    @category = category
    refresh
    self.oy = 0
  end

  def col_max  #获取列数
    return 2
  end

  def item_max  #获取项目数
    @data ? @data.size : 1
  end

  def item  #获取物品
    @data && index >= 0 ? @data[index] : nil
  end

  def current_item_enabled? #获取选择项目的有效状态
    enable?(@data[index])
  end

  def include?(item) #查询列表中是否含有此物品
    case @category
    when :item
      item.is_a?(RPG::Item) && !item.key_item?
    when :weapon
      item.is_a?(RPG::Weapon)
    when :armor
      item.is_a?(RPG::Armor)
    when :key_item
      item.is_a?(RPG::Item) && item.key_item?
    else
      false
    end
  end

  def enable?(item) #查询此物品是否可用
     return true
  end

  def make_item_list #生成物品列表
    @data = $game_party.all_items.select {|item| include?(item) }
    @data.push(nil) if include?(nil)
  end

  def select_last #返回上一个选择的位置
    select(@data.index($game_party.last_item.object) || 0)
  end

  def draw_item(index)  #绘制项目
    item = @data[index]
    if item
      rect = item_rect(index)
      rect.width -= 4
      draw_item_name(item, rect.x, rect.y, enable?(item))
      draw_item_number(rect, item)
    end
  end

  def draw_item_number(rect, item) #绘制物品个数
    draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2)
  end

  def update_help #更新帮助内容
    @help_window.set_item(item)
  end

  def refresh  #刷新
    make_item_list
    create_contents
    draw_all_items
  end
end

#===============================================================
class Scene_ItemBase < Scene_MenuBase

  def determine_item_hc   #确定物品
       $game_variables[LX20170818::BIANL] = item.id  
       if item.is_a?(RPG::Item) #道具判定
          SceneManager.goto(Scene_Map);$game_temp.reserve_common_event(LX20170818::GGSJ1);end
       if item.is_a?(RPG::Weapon)  #武器判定
          SceneManager.goto(Scene_Map);$game_temp.reserve_common_event(LX20170818::GGSJ2);end
       if item.is_a?(RPG::Armor) #防具判定  
          SceneManager.goto(Scene_Map);$game_temp.reserve_common_event(LX20170818::GGSJ3);end
  end  
end  
#===============================================================

class Window_MenuCommand < Window_Command
  def add_main_commands   #为了位置上的美观,没有重命名
    add_command(Vocab::item,   :item,   main_commands_enabled)
        add_command(LX20170818::TXT, :hc_gz, main_commands_enabled) if $game_switches[LX20170818::XXKG]
    add_command(Vocab::skill,  :skill,  main_commands_enabled)
    add_command(Vocab::equip,  :equip,  main_commands_enabled)
    add_command(Vocab::status, :status, main_commands_enabled)
  end
end  
#===============================================================
class Scene_Menu < Scene_MenuBase
  alias hcck_create_command_window create_command_window
  def create_command_window
    hcck_create_command_window
    @command_window.set_handler(:hc_gz, method(:command_hc))
  end
  def command_hc
    SceneManager.call(Scene_Item_hc)
  end
end
[/pre]



一些分歧判断用的函数:(使用方法:分歧-脚本)
$game_party.members.size >= 3  队伍人物是否大于等于3
$game_party.members.include?($game_actors[3])    3号角色在不在队伍中
$game_party.members[0].armors.include?($data_armors[107])     领队角色是否装备有107号防具,武器的话将armors改为weapons
$game_player.y  == 14  玩家在地图上的Y值是否是14
$game_switches[2]    2号开关是否开启
$game_self_switches[[21,14,"龙傲天"]]      21号地图的14号事件的“龙傲天”独立开关是否打开
(独立开关游戏中只给了ABCD,其实一个事件你可以设定无数个独立开关)
$game_variables[4] > $game_actors[1].hp   4号变量是否大于1号角色的HP
$game_actors[4].state?(857)    4号角色是否存在857号状态
$game_actors[1].usable?($data_skills[946])    1号角色的946号技能是否可用
$game_actors[1].movable?    1号角色是否可以行动
$game_actors[1].class_id == 12  1号角色是否是12号职业
$game_party.item_number($data_items[56]) > 8     56号道具的数量是否大于8(用此脚本来合成的话,这个方法我估计你们会经常用到)武器和防具的写法见上方
$game_map.events[7].region_id == 5    判断7号事件是否在5号区域
$game_player.region_id == 5          判断玩家是否在5号区域
$game_party.members.any? {|actor| actor.state?(2)}   判断所有队员中是否有人存在2号状态




其实这脚本的内容是对着原始脚本直接复制粘贴过来的,界面类的脚本我自己都看不懂,但是已经尽可能的自定义以增加兼容性了,至少在我的用了无数脚本的大工程里没有发现兼容问题,我不对其他脚本的兼容问题负责


麻烦版主帮下忙将帖子移动到发布版吧
梦石
0
星屑
17043
在线时间
6058 小时
注册时间
2011-7-18
回帖
152

开拓者

发表于 2017-8-18 17:40:31 | 显示全部楼层
RM技术区:https://rpg.blue/forum.php?mod=forumdisplay&fid=75
变成综合技术讨论区的子版块了
这里岚风·雷,任饭、PM理性粉、UT/DR原作粉、(Trans)Furry自萌,半吊子技术一枚_(:з」∠)_    游戏制作交流工(liao)作(tian)室欢迎来玩!
【无偿/有偿】RGSS3(VA)脚本定制 + 合作招募/同好交友    修正Firefox/火狐浏览器的代码框复制问题(油猴脚本)
Click→←Click
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部