Project1

标题: 如何用脚本独立开关控制五个以上的事件页【已解决】 [打印本页]

作者: 骷髅岛遗老    时间: 2018-9-22 19:50
标题: 如何用脚本独立开关控制五个以上的事件页【已解决】
本帖最后由 骷髅岛遗老 于 2018-9-22 21:23 编辑

菜鸡又来想法了,想做一个类似【交纳不同物品会变化成不同外观的事件(物品种类>5)】,需要用到5个以上事件页的变化
已知$game_self_switches[[6,4,"E"]] = true能打开6号地图上的4号事件的独立开关E
现在我想让这个开关E控制事件页是否出现

……
于是我找到了这样一个脚本
  1. #==============================================================================
  2. # ■ 加强型事件出现条件(RMXP/VX/VA通用脚本)
  3. #
  4. # 作者:正太君(聪聪)
  5. # 转载请保留脚本来源:rpg.blue
  6. #------------------------------------------------------------------------------
  7. # ★ 脚本用途:
  8. #    弥补地图事件出现的条件局限性大的缺陷...如XP有开关、变量和独立开关满足条件后
  9. #    事件出现...VX和VA增加了物品和在队角色,但是仅有这些局限性还是非常大...通过这
  10. #    个脚本,可以设置任何你能想到的事件出现条件,例如:金钱大于某个值时,独立开关
  11. #    E为打开时,队伍中活着的人数为某个值时,某个事件的坐标满足条件时等等...
  12. #   
  13. # ★ 脚本用法:
  14. #    在希望出现的事件页添加注释,注释必须写在所有事件的最前面,注释的第一行必须写
  15. #    上【加强型事件出现条件】,然后下一行接着写事件页出现的条件,例如希望金钱大于
  16. #    2的时候事件页出现,则写$game_party.gold >= 2即可,如果希望当开关1和开关2只要
  17. #    其中一个打开事件页就出现,那就写$game_switches[1] or $game_switches[1]即可...
  18. #    只要是有效的脚本指令,都能触发执行...所以随便你发挥就好了,咿咿...
  19. #
  20. # ★ 注意事项:
  21. # 1、注释事件必须写在所有事件的最前面,并且第一行必须写上【加强型事件出现条件】...
  22. # 2、加强型事件注释和默认的出现条件不冲突,是“and”的关系,可以联合使用...
  23. # 3、如果一行写不完脚本可以自由换行衔接,甚至一个完整的单词都能分成两行来写...
  24. # 4、如果一个注释都写不完,可以添加第二个注释,第二个注释开头无需再写【加强型事件
  25. #    出现条件】,但必须紧随第一个注释之后,并且支持与第一个注释的换行衔接...
  26. # 5、如果出现条件满足但是事件无反应,说明需要在条件变化点添加一句刷新地图的脚本
  27. #    $game_map.need_refresh = true来刷新地图,例如改变金钱时,就应该在改变金钱的事
  28. #    件后面写上脚本命令$game_map.need_refresh = true,为了保险起见,请养成良好的习
  29. #    惯,在每次操作完成后都刷新一次地图...
  30. #==============================================================================
  31. module Kernel
  32.   def get_rm_type
  33.     message = ""
  34.     f = File.open("Game.ini","r")
  35.     f.each_line{|i| message += i if i.include?("RGSS") and i.include?("dll")}
  36.     /([0-9]+)/ =~ message
  37.     return $1.to_i / 100
  38.   end
  39. end

  40. class Game_Event < Game_Character
  41.   if get_rm_type > 1
  42.     alias :new_conditions_met? :conditions_met? unless defined? new_conditions_met?
  43.     def conditions_met?(page)
  44.       return false unless code_condition(page)
  45.       new_conditions_met?(page)
  46.     end
  47.   else  
  48.     def refresh
  49.       new_page = nil
  50.       unless @erased
  51.         for page in @event.pages.reverse
  52.           c = page.condition
  53.           next if $game_switches[c.switch1_id] == false if c.switch1_valid
  54.           next if $game_switches[c.switch2_id] == false if c.switch2_valid
  55.           next if $game_variables[c.variable_id] < c.variable_value if c.variable_valid
  56.           if c.self_switch_valid
  57.             key = [@map_id, @event.id, c.self_switch_ch]
  58.             next if $game_self_switches[key] != true
  59.           end
  60.           next unless code_condition(page)
  61.           new_page = page
  62.           break
  63.         end
  64.       end
  65.       return if new_page == @page
  66.       @page = new_page
  67.       clear_starting
  68.       if @page == nil
  69.         @tile_id = 0
  70.         @character_name = ""
  71.         @character_hue = 0
  72.         @move_type = 0
  73.         @through = true
  74.         @trigger = nil
  75.         @list = nil
  76.         @interpreter = nil
  77.         return
  78.       end
  79.       @tile_id = @page.graphic.tile_id
  80.       @character_name = @page.graphic.character_name
  81.       @character_hue = @page.graphic.character_hue
  82.       if @original_direction != @page.graphic.direction
  83.         @direction = @page.graphic.direction
  84.         @original_direction = @direction
  85.         @prelock_direction = 0
  86.       end
  87.       if @original_pattern != @page.graphic.pattern
  88.         @pattern = @page.graphic.pattern
  89.         @original_pattern = @pattern
  90.       end
  91.       @opacity = @page.graphic.opacity
  92.       @blend_type = @page.graphic.blend_type
  93.       @move_type = @page.move_type
  94.       @move_speed = @page.move_speed
  95.       @move_frequency = @page.move_frequency
  96.       @move_route = @page.move_route
  97.       @move_route_index = 0
  98.       @move_route_forcing = false
  99.       @walk_anime = @page.walk_anime
  100.       @step_anime = @page.step_anime
  101.       @direction_fix = @page.direction_fix
  102.       @through = @page.through
  103.       @always_on_top = @page.always_on_top
  104.       @trigger = @page.trigger
  105.       @list = @page.list
  106.       @interpreter = nil
  107.       @interpreter = Interpreter.new if @trigger == 4
  108.       check_event_trigger_auto
  109.     end
  110.   end  

  111.   def code_condition(page)
  112.     code = ""
  113.     page.list.each_with_index{|i, index|
  114.     if i.code == 108 or i.code == 408
  115.       code += i.parameters[0]
  116.     else
  117.       break
  118.     end}
  119.     if code.include?("【加强型事件出现条件】")
  120.       code.delete!("【加强型事件出现条件】")
  121.      return eval(code)
  122.     else
  123.       return true
  124.     end
  125.     return false
  126.   end

  127.   alias :new_start :start unless defined? new_start
  128.   def start
  129.     return if @list.all? {|i| [0, 108, 408].include?(i.code)}
  130.     new_start
  131.   end
  132. end
复制代码


按照范例的理解填了$game_self_switches[[6,4,"E"]]

然而开关打开后无事发生……





原来是脚本冲突,问题解决了
作者: soulsaga    时间: 2018-9-22 20:21
本帖最后由 soulsaga 于 2018-9-22 20:36 编辑

# 5、如果出现条件满足但是事件无反应,说明需要在条件变化点添加一句刷新地图的脚本
#    $game_map.need_refresh = true来刷新地图,例如改变金钱时,就应该在改变金钱的事
#    件后面写上脚本命令$game_map.need_refresh = true,为了保险起见,请养成良好的习
#    惯,在每次操作完成后都刷新一次地图...

你得在$game_self_switches[[6,4,"E"]] = true下面写上脚本$game_map.need_refresh = true
刷新地图后符合条件的NPC才会变化






欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1