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

Project1

 找回密码
 注册会员
搜索
查看: 5052|回复: 7
打印 上一主题 下一主题

[已经解决] 如何使某一事件页的发动条件为使用某物品

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1257
在线时间
423 小时
注册时间
2011-6-30
帖子
497
跳转到指定楼层
1
 楼主| 发表于 2013-3-3 11:47:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 0newing 于 2013-3-8 00:04 编辑

事件页的原本发动条件为某开关打开,或者某独立开关打开,或者某物品持有……
现在我想做出这种效果——对事件块使用某物品,就执行此事件页的内容。应该如何处理?
已经有了一个用物品的公共事件解决的方案,公共事件判断主角位置是否与事件块相邻,然后再执行事件。但感觉太繁琐……尤其是对那种可移动的事件块。
记得在VX看到过一个这种脚本,能提供帮助,或者将此脚本转为VA的,在下感激不尽……
  1. module Event_Trigger_Object
  2.   LAST_USE_ITEM = 1     
  3. end
  4.                      

  5. class Game_Battler

  6.   alias tig_eto_skill_can_use? skill_can_use?
  7.   def skill_can_use?(skill)
  8.     return false unless skill.is_a?(RPG::Skill)
  9.     return false unless movable?
  10.     return false if silent? and skill.spi_f > 0
  11.     return false if calc_mp_cost(skill) > mp
  12.     unless $game_temp.in_battle
  13.       id = 1000 + skill.id
  14.       if $game_player.check_event_trigger_object(id, true)
  15.         return true
  16.       end
  17.       if skill.scope == 0
  18.         return skill.common_event_id > 0
  19.       end
  20.     end
  21.     return tig_eto_skill_can_use?(skill)
  22.   end
  23. end
  24.   

  25. class Game_Party < Game_Unit

  26.   attr_accessor :use_skill                     
  27.   attr_accessor :skill_user                    

  28.   alias tig_eto_initialize initialize
  29.   def initialize
  30.     tig_eto_initialize
  31.     @use_skill_id = nil
  32.     @skill_user_id = nil
  33.   end

  34.   
  35.   alias tig_eto_item_can_use? item_can_use?
  36.   def item_can_use?(item)
  37.     return false unless item.is_a?(RPG::Item)
  38.     return false if item_number(item) == 0
  39.     unless $game_temp.in_battle
  40.       if $game_player.check_event_trigger_object(item.id, true)
  41.         return true
  42.       end
  43.       if item.scope == 0
  44.         return item.common_event_id > 0
  45.       end
  46.     end
  47.     return tig_eto_item_can_use?(item)
  48.   end
  49. end


  50. class Game_Event < Game_Character
  51.   attr_reader   :erased        
  52.   alias tig_eto_initialize initialize
  53.   def initialize(map_id, event)
  54.     @event_trigger_all_items = false
  55.     @event_trigger_all_skills = false
  56.     @event_trigger_all_weapons = false
  57.     @event_trigger_all_armors = false
  58.     @event_trigger_type = []
  59.     @event_trigger_id = []
  60.     tig_eto_initialize(map_id, event)
  61.   end

  62.   
  63.   alias tig_eto_conditions_met? conditions_met?
  64.   def conditions_met?(page)
  65.     return if @erased
  66.     if set_event_object_trigger(page)
  67.       return false if $game_player.trigger_object_id == nil
  68.       return object_trigger?($game_player.trigger_object_id)
  69.     end
  70.     return tig_eto_conditions_met?(page)
  71.   end
  72.   
  73.   
  74.   
  75.   def object_trigger?(object_id)
  76.     if object_id < 1000
  77.       return true if @event_trigger_all_items
  78.       object = $data_items[object_id]
  79.     elsif object_id < 2000
  80.       return true if @event_trigger_all_skills
  81.       object = $data_skills[object_id - 1000]
  82.     elsif object_id < 3000
  83.       return true if @event_trigger_all_weapons
  84.       object = $data_weapons[object_id - 2000]
  85.     elsif object_id < 4000
  86.       return true if @event_trigger_all_armors
  87.       object = $data_armors[object_id - 3000]
  88.     end

  89.     return true if @event_trigger_id.include?(object_id)
  90.     if object != nil
  91.       return true if @event_trigger_type.include?(object.event_trigger_type)
  92.     end
  93.     return false
  94.   end
  95.   
  96.   
  97.   
  98.   def set_event_object_trigger(page)
  99.     if page.list.size > 0
  100.       command = page.list[0]
  101.       if command.code == 108
  102.         if /^启动条件[<<]/ =~ command.parameters[0]
  103.           @event_trigger_all_items = /[<<\s\//]items[>>\s\//]/ =~ command.parameters[0]
  104.           @event_trigger_all_skills = /[<<\s\//]skills[>>\s\//]/ =~ command.parameters[0]
  105.           @event_trigger_all_weapons = /[<<\s\//]weapons[>>\s\//]/ =~ command.parameters[0]
  106.           @event_trigger_all_armors = /[<<\s\//]armors[>>\s\//]/ =~ command.parameters[0]
  107.           if /[<<\s]all[>>\s]/ =~ command.parameters[0]
  108.             @event_trigger_all_items = true ; @event_trigger_all_skills = true
  109.             @event_trigger_all_weapons = true ; @event_trigger_all_armors = true
  110.           end
  111.          
  112.           @event_trigger_id = []
  113.           if /[<<\s\//]item[-_]id:\d+[>>\s\//]/ =~ command.parameters[0]
  114.             item_id = command.parameters[0].scan(/[<<\s\//]item[-_]id:(\d+)[>>\s\//]/)
  115.             item_id = item_id.flatten
  116.             item_id.size.times {|n|item_id[n] = item_id[n].to_i}
  117.             @event_trigger_id += item_id.compact
  118.           end
  119.           if /[<<\s\//]skill[-_]id:\d+[>>\s\//]/ =~ command.parameters[0]
  120.             skill_id = command.parameters[0].scan(/[<<\s\//]skill[-_]id:(\d+)[>>\s\//]/)
  121.             skill_id = skill_id.flatten
  122.             skill_id.size.times { |n|
  123.               skill_id[n] = skill_id[n].to_i
  124.               skill_id[n] += 1000
  125.             }
  126.             @event_trigger_id += skill_id.compact
  127.           end
  128.           if /[<<\s\//]weapon[-_]id:\d+[>>\s\//]/ =~ command.parameters[0]
  129.             weapon_id = command.parameters[0].scan(/[<<\s\//]weapon[-_]id:(\d+)[>>\s\//]/)
  130.             weapon_id = weapon_id.flatten
  131.             weapon_id.size.times { |n|
  132.               weapon_id[n] = weapon_id[n].to_i
  133.               weapon_id[n] += 2000
  134.             }
  135.             @event_trigger_id += weapon_id.compact
  136.           end
  137.           if /[<<\s\//]armor[-_]id:\d+[>>\s\//]/ =~ command.parameters[0]
  138.             armor_id = command.parameters[0].scan(/[<<\s\//]armor[-_]id:(\d+)[>>\s\//]/)
  139.             armor_id = armor_id.flatten
  140.             armor_id.size.times { |n|
  141.               armor_id[n] = armorl_id[n].to_i
  142.               armor_id[n] += 3000
  143.             }
  144.             @event_trigger_id += armor_id.compact
  145.           end
  146.          
  147.           words = command.parameters[0].scan(/[<<\s\//]type:(\S+)[>>\s\//]/)
  148.           words = words.flatten
  149.           words = [] if words == nil
  150.           @event_trigger_type = words
  151.          
  152.           return true
  153.         end
  154.       end
  155.     end
  156.     return false
  157.   end
  158. end
  159.   


  160. class Game_Player < Game_Character

  161.   
  162.   attr_accessor :trigger_object_id           
  163.   attr_reader   :last_trigger_object_id      
  164.   
  165.   
  166.   alias tig_eto_initialize initialize
  167.   def initialize
  168.     tig_eto_initialize
  169.     @trigger_object_id = nil
  170.     @last_trigger_object_id = nil
  171.   end
  172.   
  173.   
  174.   def check_event_trigger_object(object_id, test = false)
  175.     return false if $game_map.interpreter.running?
  176.     result = false
  177.     $game_variables[Event_Trigger_Object::LAST_USE_ITEM] = object_id
  178.     @trigger_object_id = object_id
  179.     @last_trigger_object_id = object_id
  180.     for event in $game_map.events_xy(@x, @y)
  181.       event.refresh
  182.       next if event.erased
  183.       next unless event.object_trigger?(object_id)
  184.       next if event.priority_type == 1
  185.       event.start unless test
  186.       result = true
  187.     end
  188.     if result == false
  189.       front_x = $game_map.x_with_direction(@x, @direction)
  190.       front_y = $game_map.y_with_direction(@y, @direction)
  191.       for event in $game_map.events_xy(front_x, front_y)
  192.         event.refresh
  193.         next if event.erased
  194.         next unless event.object_trigger?(object_id)
  195.         next if event.priority_type != 1
  196.         event.start unless test
  197.         result = true
  198.       end
  199.     end
  200.     @trigger_object_id = nil
  201.    
  202.     return result
  203.   end
  204. end



  205. class Game_Interpreter

  206.   
  207.   alias tig_eto_command_end command_end
  208.   def command_end
  209.     tig_eto_command_end
  210.     $game_variables[Event_Trigger_Object::LAST_USE_ITEM] = 0
  211.   end
  212.   
  213.   
  214.   def event_trigger_type?(type)
  215.     id = $game_player.last_trigger_object_id
  216.     object = nil
  217.     if id < 1000
  218.       object = $data_items[id]
  219.     elsif id < 2000
  220.       object = $data_skills[id - 1000]
  221.     elsif id < 3000
  222.       object = $data_weapons[id - 2000]
  223.     elsif id < 4000
  224.       object = $data_armors[id - 3000]
  225.     end
  226.     return false if object == nil
  227.     if /启动条件[<<]type[::](\S+)[>>]/ =~ object.note
  228.       return type == $1
  229.     else
  230.       return false
  231.     end
  232.   end
  233.   
  234.   
  235.   def event_trigger_item_type?(type)
  236.     object = $data_items[$game_player.last_trigger_object_id]
  237.     return false if object == nil
  238.     if /启动条件[<<]type[::](\S+)[>>]/ =~ object.note
  239.       return type == $1
  240.     else
  241.       return false
  242.     end  
  243.   end
  244.   
  245.   
  246.   def event_trigger_skill_type?(type)
  247.     object = $data_skills[$game_player.last_trigger_object_id - 1000]
  248.     return false if object == nil
  249.     if /启动条件[<<]type[::](\S+)[>>]/ =~ object.note
  250.       return type == $1
  251.     else
  252.       return false
  253.     end  
  254.   end
  255.   
  256.   
  257.   def event_trigger_weapon_type?(type)
  258.     object = $data_weapons[$game_player.last_trigger_object_id - 2000]
  259.     return false if object == nil
  260.     if /启动条件[<<]type[::](\S+)[>>]/ =~ object.note
  261.       return type == $1
  262.     else
  263.       return false
  264.     end  
  265.   end
  266.   
  267.   
  268.   def event_trigger_armor_type?(type)
  269.     object = $data_armors[$game_player.last_trigger_object_id - 3000]
  270.     return false if object == nil
  271.     if /启动条件[<<]type[::](\S+)[>>]/ =~ object.note
  272.       return type == $1
  273.     else
  274.       return false
  275.     end  
  276.   end
  277.   
  278.   
  279.   def consume_skill_cost
  280.     skill = $game_party.use_skill
  281.     user = $game_party.skill_user
  282.     return if $game_party.use_skill == nil
  283.     user.mp -= user.calc_mp_cost(skill)
  284.   end
  285. end



  286. class Window_Message < Window_Selectable

  287.   
  288.   
  289.   alias tig_eto_convert_special_characters convert_special_characters
  290.   def convert_special_characters
  291.     object_id = $game_player.last_trigger_object_id
  292.     if object_id != nil
  293.       if object_id < 1000
  294.         object = $data_items[object_id]
  295.       elsif object_id < 2000
  296.         object = $data_skills[object_id - 1000]
  297.       elsif object_id < 3000
  298.         object = $data_weapons[object_id - 2000]
  299.       elsif object_id < 4000
  300.         object = $data_armors[object_id - 3000]
  301.       end
  302.       if object != nil
  303.         @text.gsub!(/\\N\[启动条件オブジェクト\]/i) { object.name }
  304.       end
  305.     end
  306.     tig_eto_convert_special_characters
  307.   end
  308. end



  309. class Scene_Item < Scene_Base

  310.   
  311.   alias tig_eto_determine_item determine_item
  312.   def determine_item
  313.     if $game_player.check_event_trigger_object(@item.id)
  314.       $scene = Scene_Map.new
  315.       return
  316.     end
  317.     tig_eto_determine_item
  318.   end
  319. end



  320. class Scene_Skill < Scene_Base

  321.   
  322.   alias tig_eto_determine_skill determine_skill
  323.   def determine_skill
  324.     id = 1000 + @skill.id
  325.     if $game_player.check_event_trigger_object(id)
  326.       $game_party.use_skill = @skill
  327.       $game_party.skill_user = @actor
  328.       $scene = Scene_Map.new
  329.       return
  330.     end
  331.     tig_eto_determine_skill
  332.   end
  333. end



  334. class RPG::BaseItem
  335.   
  336.   
  337.   def event_trigger_type
  338.     if /启动条件[<<]type[::](\S+)[>>]/ =~ self.note
  339.       return $1
  340.     else
  341.       return ""
  342.     end
  343.   end
  344. end
复制代码
点这里给我发邮件
有事欢迎给我发邮件哟~~
不出意外的话都会回复的哟~~~
邮箱:[email protected]
个人主页:curatorjin.github.io

Lv1.梦旅人

梦石
0
星屑
50
在线时间
366 小时
注册时间
2009-7-14
帖子
124
来自 2楼
发表于 2013-3-5 18:44:45 | 只看该作者
用MOG的传感器脚本也可以实现吧,这脚本效果就是可以设定事件为中心的一个范围,主角接近事件到那个范围内,就会打开那个事件的独立开关D。
事件设置两页,都是并行处理,第一页关闭X开关,第二页独立开关D打开时执行,内容为打开X开关。也就是说主角在事件旁边的时候,X开关会打开,然后这时候使用物品(物品特性那里按楼上的调用公共事件打开Y开关),你再设置个事件当XY开关都打开时执行就行了,大概是这么个思路吧。

点评

修改了之前的一个脚本,搞定了……谢谢!  发表于 2013-3-5 22:47
求此脚本……搜索不到……我再研究研究这个思路,成功了再来看吧。  发表于 2013-3-5 22:30
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

万兽

梦石
0
星屑
597
在线时间
2271 小时
注册时间
2006-11-4
帖子
4868

贵宾

3
发表于 2013-3-3 16:12:26 | 只看该作者
在使用物品里添加一个公共事件打开开关,当此开关开启时执行此事件。

点评

我的意思是仍然像对话一样的,对着事件块使用物品,然后发动事件。这个方法会使在地图任一位置使用物品都执行事件。  发表于 2013-3-3 20:45
回复 支持 反对

使用道具 举报

Lv1.梦旅人

水土火风重逢处

梦石
0
星屑
239
在线时间
691 小时
注册时间
2010-7-17
帖子
3042
4
发表于 2013-3-3 22:38:44 | 只看该作者
对着事件块使用物品是怎么回事?难道说是面向事件块然后打开菜单使用?依旧可以用公共事件实现...

点评

就是这个意思,求解……  发表于 2013-3-3 23:54
独坐望城,望断天涯
回复 支持 反对

使用道具 举报

Lv1.梦旅人

水土火风重逢处

梦石
0
星屑
239
在线时间
691 小时
注册时间
2010-7-17
帖子
3042
5
发表于 2013-3-4 12:12:37 | 只看该作者
物品触发公共事件,然后变量操作得到X坐标,Y坐标,一个方向判定一次...
比如是向上,当X坐标=事件X坐标时,Y坐标-=1,Y坐标=事件Y坐标时,角色面向朝上时-执行
事件页的条件设置为变量,具体应该怎么设置就看情况了,
当然,如果不想用变量的话,开关也行
独坐望城,望断天涯
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1257
在线时间
423 小时
注册时间
2011-6-30
帖子
497
6
 楼主| 发表于 2013-3-4 17:48:30 | 只看该作者
429259591 发表于 2013-3-4 12:12
物品触发公共事件,然后变量操作得到X坐标,Y坐标,一个方向判定一次...
比如是向上,当X坐标=事件X坐标时 ...

如果事件块是固定不移动的,那这个方法是可行的,如果是一个,移动的事件块,要如何在公共事件中确定一个移动的坐标?还有就是,这个方法我已经试过了,包括在VA中还可以用地形标志来实现位置,从而不用做出更加复杂的判断。。。总得来说,这个问题我们已经解决一半了,还剩下,事件块移动的情况
点这里给我发邮件
有事欢迎给我发邮件哟~~
不出意外的话都会回复的哟~~~
邮箱:[email protected]
个人主页:curatorjin.github.io
回复 支持 反对

使用道具 举报

Lv1.梦旅人

水土火风重逢处

梦石
0
星屑
239
在线时间
691 小时
注册时间
2010-7-17
帖子
3042
7
发表于 2013-3-4 18:19:49 | 只看该作者
移动的事件块要怎样对着使用........和固定的一样?..和角色一样用变量来取得事件的X坐标和Y坐标..........
独坐望城,望断天涯
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
367
在线时间
1292 小时
注册时间
2013-1-12
帖子
3590

贵宾

8
发表于 2013-3-8 12:05:07 | 只看该作者
物品選擇處理再用變量判定是否對的

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-1 10:38

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表