Project1

标题: 【原创】Scene_Debug加强版(Ver1.2) [打印本页]

作者: RyanBern    时间: 2014-9-5 15:02
标题: 【原创】Scene_Debug加强版(Ver1.2)
本帖最后由 RyanBern 于 2014-12-12 17:32 编辑

不知道有没有人发过类似的。系统自带的Scene_Debug的修改范围十分有限,仅仅是限制在开关/变量的操作上。而这个加强过的Scene_Debug可以实时修改更多的游戏对象,方便测试者对游戏进行测试。原理都是简单的,就是实现比较麻烦。

有什么BUG或者更好的建议希望大家能向我提出。
更新记录:
Ver 1.1(2014.9.6): 添加了修改独立开关的功能。
Ver 1.1(2014.9.7): 修复地图没有事件时出现的BUG
Ver 1.2(2014.9.11):添加了直接执行代码的功能。

几张预览图:





脚本(URL请自行去掉):
RUBY 代码复制
  1. #============================================================================
  2. # 调试画面加强版(Ver 1.2)  BY : RyanBern
  3. #----------------------------------------------------------------------------
  4. # 系统自带的Scene_Debug可以用于实时调试游戏中的各种对象,数据,但是功能方面
  5. # 过于单一,因此对Scene_Debug作了很多扩充。在这里你可以更改物品/武器/防具的
  6. # 持有数,修改金钱的值,以及角色和队伍的调整。
  7. # Ver 1.1更新:增加了独立开关的更改。
  8. # Ver 1.2更新:增加了脚本直接输入的功能。(其实是在不关闭游戏的条件下利用外
  9. #              部txt文档,手懒没做Text Area)
  10. # 以后我要想到什么会陆续往上加。
  11. #----------------------------------------------------------------------------
  12. # 用法和默认调试画面的一样,在游戏测试模式下按F9可以打开调试画面。
  13. # 如果要使用脚本直接输入功能的话,先进入这个选项,然后会自动在游戏根目录下生
  14. # 成一个叫Debug.txt的文档,输入你想执行的脚本即可。这个不同于事件解释器里面
  15. # 的“脚本”命令,例如不可以用@event_id表示当前事件ID等。如果输入了有错误的
  16. # 代码,为了游戏的稳定,不使用rescue来补救,而是报错之后退出,所以请输入正确
  17. # 的代码。
  18. #----------------------------------------------------------------------------
  19. # 脚本冲突方面,可能和独立装备系统,背包系统,人物仓库系统,多货币系统冲突。
  20. # 说得简单点就是这个调试系统对游戏数据的更改是根据默认系统的方式,如果有别的
  21. # 外挂脚本更改了游戏数据结构,那么这个调试系统就会失效。
  22. #============================================================================
  23.  
  24.  
  25. #============================================================================
  26. # Game_Temp
  27. #----------------------------------------------------------------------------
  28. # 追加属性
  29. #============================================================================
  30.  
  31. class Game_Temp
  32.   attr_accessor :debug_command        # 调试画面 保存状态用
  33.   alias rb_initialize initialize
  34.   def initialize
  35.     rb_initialize
  36.     @debug_command = 0
  37.   end
  38. end
  39.  
  40.  
  41. #============================================================================
  42. # Window_DebugCommand
  43. #----------------------------------------------------------------------------
  44. # 调试画面的命令窗口(用于选取模式)
  45. #============================================================================
  46.  
  47. class Window_DebugCommand < Window_Selectable
  48.   #--------------------------------------------------------------------------
  49.   # 初始化对象
  50.   #--------------------------------------------------------------------------
  51.   def initialize
  52.     super(0, 0, 160, 320)
  53.     self.index = 0
  54.     refresh
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # 刷新
  58.   #--------------------------------------------------------------------------
  59.   def refresh
  60.     if self.contents != nil
  61.       self.contents.dispose
  62.       self.contents = nil
  63.     end
  64.     @item_max = 9
  65.     self.contents = Bitmap.new(width - 32, @item_max * 32)
  66.     self.contents.draw_text(4, 0, 120, 32, "开关")
  67.     self.contents.draw_text(4, 32, 120, 32, "变量")
  68.     self.contents.draw_text(4, 64, 120, 32, "物品")
  69.     self.contents.draw_text(4, 96, 120, 32, "武器")
  70.     self.contents.draw_text(4, 128, 120, 32, "防具")
  71.     self.contents.draw_text(4, 160, 120, 32, "金钱")
  72.     self.contents.draw_text(4, 192, 120, 32, "角色")
  73.     self.contents.draw_text(4, 224, 120, 32, "独立开关")
  74.     self.contents.draw_text(4, 256, 120, 32, "输入代码")
  75.   end
  76. end
  77.  
  78.  
  79. #==============================================================================
  80. # ■ Window_DebugLeft
  81. #------------------------------------------------------------------------------
  82. #  调试画面、指定开关及变量块的窗口。
  83. #==============================================================================
  84.  
  85. class Window_DebugLeft < Window_Selectable
  86.   #--------------------------------------------------------------------------
  87.   # ● 初始化对像
  88.   #--------------------------------------------------------------------------
  89.   def initialize
  90.     super(160, 0, 192, 352)
  91.     self.active = false
  92.     self.index = -1
  93.     @mode = 0
  94.     @debug_actor_items = ["替换队员", "增减等级", "增减MaxHP", "增减MaxSP",
  95.       "增减力量", "增减灵巧", "增减速度", "增减魔力"]
  96.     refresh
  97.   end
  98.   def adjust_cursor
  99.     if self.index > @item_max - 1
  100.       self.index = @item_max - 1
  101.     end
  102.   end
  103.   def mode=(mode)
  104.     if @mode != mode
  105.       @mode = mode
  106.       refresh
  107.     end
  108.   end
  109.   def real_max
  110.     case @mode
  111.     when 0
  112.       return $data_system.switches.size - 1
  113.     when 1
  114.       return $data_system.variables.size - 1
  115.     when 2
  116.       return $data_items.size - 1
  117.     when 3
  118.       return $data_weapons.size - 1
  119.     when 4
  120.       return $data_armors.size - 1
  121.     when 6
  122.       return @debug_actor_items.size
  123.     when 7
  124.       return @map_info.nil? ? 1 : @map_info.keys.size
  125.     else
  126.       return 1
  127.     end
  128.   end
  129.   #--------------------------------------------------------------------------
  130.   # ● 刷新
  131.   #--------------------------------------------------------------------------
  132.   def refresh
  133.     if self.contents != nil
  134.       self.contents.dispose
  135.       self.contents = nil
  136.     end
  137.     case @mode
  138.     # Switches
  139.     when 0
  140.       @item_max = ($data_system.switches.size - 1 + 9) / 10
  141.     # Variables
  142.     when 1
  143.       @item_max = ($data_system.variables.size - 1 + 9) / 10
  144.     # Items
  145.     when 2
  146.       @item_max = ($data_items.size - 1 + 9) / 10
  147.     # Weapons
  148.     when 3
  149.       @item_max = ($data_weapons.size - 1 + 9) / 10
  150.     # Armors
  151.     when 4
  152.       @item_max = ($data_armors.size - 1 + 9) / 10
  153.     # Actors
  154.     when 6
  155.       @item_max = @debug_actor_items.size
  156.     # SelfSwitches
  157.     when 7
  158.       if @map_info.nil?
  159.         @map_info = load_data("Data/MapInfos.rxdata")
  160.         @map_id_array = @map_info.keys.sort
  161.       end
  162.       @item_max = @map_info.keys.size
  163.     else
  164.       @item_max = 1
  165.     end
  166.     case @mode
  167.     when 5
  168.       self.contents = Bitmap.new(width - 32, 32)
  169.       self.contents.draw_text(4, 0, width - 36, 32, "点击修改金钱")
  170.     when 6
  171.       self.contents = Bitmap.new(width - 32, @item_max * 32)
  172.       @debug_actor_items.each_with_index do |item, i|
  173.         self.contents.draw_text(4, i*32, width - 36, 32, item)
  174.       end
  175.     when 7
  176.       self.contents = Bitmap.new(width - 32, @item_max * 32)
  177.       @map_id_array.each_with_index do |id, i|
  178.         name = @map_info[id].name
  179.         text = sprintf("%03d:%s", id, name)
  180.         self.contents.draw_text(4, i*32, width - 36, 32, text)
  181.       end
  182.     when 8
  183.       self.contents = Bitmap.new(width - 32, 32)
  184.       self.contents.draw_text(4, 0, width - 36, 32, "点击执行代码")
  185.     else
  186.       self.contents = Bitmap.new(width - 32, @item_max * 32)
  187.       (0...@item_max).each do |i|
  188.         text = sprintf("%s [%04d-%04d]", ["S","V","I","W","A"][@mode], i*10+1, [i*10+10,real_max].min)
  189.         self.contents.draw_text(4, i*32, width - 36, 32, text)
  190.       end
  191.     end
  192.   end
  193.   #--------------------------------------------------------------------------
  194.   # ● 获取模式
  195.   #--------------------------------------------------------------------------
  196.   def mode
  197.     @mode
  198.   end
  199.   #--------------------------------------------------------------------------
  200.   # ● 获取开头显示的 ID
  201.   #--------------------------------------------------------------------------
  202.   def top_id
  203.     return self.index * 10 + 1
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   # 获取地图 ID (在模式为7[独立开关]的情况下有效)
  207.   #--------------------------------------------------------------------------
  208.   def map_id
  209.     return @mode == 7 ? @map_id_array[self.index] : 0
  210.   end
  211. end
  212.  
  213.  
  214. #==============================================================================
  215. # ■ Window_DebugRight
  216. #------------------------------------------------------------------------------
  217. #  调试画面、个别显示开关及变量的窗口。
  218. #==============================================================================
  219.  
  220. class Window_DebugRight < Window_Selectable
  221.   #--------------------------------------------------------------------------
  222.   # ● 定义实例变量
  223.   #--------------------------------------------------------------------------
  224.   attr_reader   :mode                     # 模式
  225.   attr_reader   :sub_mode                 # 子模式(角色用)
  226.   attr_reader   :top_id                   # 开头显示的 ID
  227.   #--------------------------------------------------------------------------
  228.   # ● 初始化对像
  229.   #--------------------------------------------------------------------------
  230.   def initialize
  231.     super(160+192, 0, 448-160, 352)
  232.     self.index = -1
  233.     self.active = false
  234.     @item_max = 10
  235.     @mode = 0
  236.     @sub_mode = -1
  237.     @map_id = 0
  238.     @map = nil
  239.     @top_id = 1
  240.     refresh
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # 获取实际显示最大项目数
  244.   # (这个方法是为了解决越界BUG)
  245.   #--------------------------------------------------------------------------
  246.   def real_max
  247.     case @mode
  248.     when 0
  249.       return $data_system.switches.size - 1
  250.     when 1
  251.       return $data_system.variables.size - 1
  252.     when 2
  253.       return $data_items.size - 1
  254.     when 3
  255.       return $data_weapons.size - 1
  256.     when 4
  257.       return $data_armors.size - 1
  258.     when 6
  259.       return $data_actors.size - 1
  260.     when 7
  261.       return @map.nil? ? 1 : 4 * @map.events.keys.size
  262.     when 8
  263.       return 3
  264.     else
  265.       return 1
  266.     end
  267.   end
  268.   #--------------------------------------------------------------------------
  269.   # 模式为7[独立开关]的条件下,获取当前开关的主键
  270.   #--------------------------------------------------------------------------
  271.   def key
  272.     return [] if @mode != 7 || @item_max == 0
  273.     event_id = @event_id_array[self.index / 4]
  274.     tag = ['A', 'B', 'C', 'D'][self.index % 4]
  275.     return [@map_id, event_id, tag]
  276.   end
  277.   #--------------------------------------------------------------------------
  278.   # ● 刷新
  279.   #--------------------------------------------------------------------------
  280.   def refresh(need_reload_map = false)
  281.     if self.contents != nil
  282.       self.contents.dispose
  283.       self.contents = nil
  284.     end
  285.     if @mode == 7
  286.       if @map.nil? || need_reload_map
  287.         @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  288.         @event_id_array = @map.events.keys.sort
  289.       end
  290.     end
  291.     @item_max = [6,7,8].include?(@mode) ? real_max : [1 + real_max - @top_id, 10].min
  292.     return if @item_max == 0
  293.     self.contents = Bitmap.new(width - 32, @item_max * 32)
  294.     (0...@item_max).each do |i|
  295.       case @mode
  296.       when 0
  297.         name = $data_system.switches[@top_id+i]
  298.         status = $game_switches[@top_id+i] ? "[ON]" : "[OFF]"
  299.       when 1
  300.         name = $data_system.variables[@top_id+i]
  301.         status = $game_variables[@top_id+i].to_s
  302.       when 2
  303.         name = $data_items[@top_id+i].name
  304.         status = $game_party.item_number(@top_id+i).to_s
  305.       when 3
  306.         name = $data_weapons[@top_id+i].name
  307.         status = $game_party.weapon_number(@top_id+i).to_s
  308.       when 4
  309.         name = $data_armors[@top_id+i].name
  310.         status = $game_party.armor_number(@top_id+i).to_s
  311.       when 5
  312.         name = "金钱"
  313.         status = $game_party.gold.to_s
  314.       when 6
  315.         actor = $game_actors[i+1]
  316.         name = actor.name
  317.         case @sub_mode
  318.         when 0
  319.           status = $game_party.actors.include?(actor) ? "[IN]" : "[OUT]"
  320.         when 1
  321.           status = actor.level.to_s
  322.         when 2
  323.           status = actor.maxhp.to_s
  324.         when 3
  325.           status = actor.maxsp.to_s
  326.         when 4
  327.           status = actor.str.to_s
  328.         when 5
  329.           status = actor.dex.to_s
  330.         when 6
  331.           status = actor.agi.to_s
  332.         when 7
  333.           status = actor.int.to_s
  334.         else
  335.           status = ""
  336.         end
  337.       when 7
  338.         event_id = @event_id_array[i/4]
  339.         event = @map.events[event_id]
  340.         tag = ['A', 'B', 'C', 'D'][i%4]
  341.         name = event.name + " : " + tag
  342.         status = $game_self_switches[[@map_id, event_id, tag]] ? "[ON]" : "[OFF]"
  343.       else
  344.         name = ''
  345.         status = ''
  346.       end
  347.       if name == nil
  348.         name = ''
  349.       end
  350.       if @mode == 5
  351.         self.contents.draw_text(4, 0, width - 36, 32, name)
  352.         self.contents.draw_text(0 ,0, width - 32, 32, status, 2)
  353.         return
  354.       end
  355.       if @mode == 8
  356.         texts = []
  357.         texts[0] = "在游戏根目录下的"
  358.         texts[1] = "Debug.txt文件内键入"
  359.         texts[2] = "代码,点击确认键执行"
  360.         texts.each_with_index do |s, i|
  361.           self.contents.draw_text(4, 32 * i, width - 36, 32, s)
  362.         end
  363.         return
  364.       end
  365.       if @mode == 7
  366.         self.contents.draw_text(4, i * 32, 204, 32, name)
  367.         self.contents.draw_text(208, i * 32, 48, 32, status, 2)
  368.         next
  369.       end
  370.       id_text = sprintf("%04d:", @mode == 6 ? 1+i : @top_id+i)
  371.       self.contents.draw_text(4, i * 32, 60, 32, id_text)
  372.       self.contents.draw_text(60, i * 32, 148, 32, name)
  373.       self.contents.draw_text(208, i * 32, 48, 32, status, 2)
  374.     end
  375.   end
  376.   #--------------------------------------------------------------------------
  377.   # 设置子模式(在主模式为6[角色]的时候有效)
  378.   #   sub_mode : 新的子模式
  379.   #--------------------------------------------------------------------------
  380.   def sub_mode=(sub_mode)
  381.     if @sub_mode != sub_mode
  382.       @sub_mode = sub_mode
  383.       refresh
  384.     end
  385.   end
  386.   #--------------------------------------------------------------------------
  387.   # 设置要显示的地图(在主模式为7[独立开关]的时候有效)
  388.   #   map_id : 新的地图 ID
  389.   #--------------------------------------------------------------------------
  390.   def map_id=(map_id)
  391.     if @map_id != (map_id)
  392.       @map_id = map_id
  393.       refresh(true)
  394.     end
  395.   end
  396.   #--------------------------------------------------------------------------
  397.   # ● 设置模式
  398.   #     mode : 新的模式
  399.   #--------------------------------------------------------------------------
  400.   def mode=(mode)
  401.     if @mode != mode
  402.       @mode = mode
  403.       refresh if @mode != 7
  404.     end
  405.   end
  406.   #--------------------------------------------------------------------------
  407.   # ● 设置开头显示的 ID
  408.   #     id : 新的 ID
  409.   #--------------------------------------------------------------------------
  410.   def top_id=(id)
  411.     if @top_id != id
  412.       @top_id = id
  413.       refresh
  414.     end
  415.   end
  416. end
  417.  
  418.  
  419. #==============================================================================
  420. # ■ Scene_Debug
  421. #------------------------------------------------------------------------------
  422. #  处理调试画面的类。
  423. #==============================================================================
  424.  
  425. class Scene_Debug
  426.   #--------------------------------------------------------------------------
  427.   # ● 主处理
  428.   #--------------------------------------------------------------------------
  429.   def main
  430.     # 生成窗口
  431.     @command_window = Window_DebugCommand.new
  432.     @left_window = Window_DebugLeft.new
  433.     @right_window = Window_DebugRight.new
  434.     @help_window = Window_Base.new(160, 352, 480, 128)
  435.     @help_window.contents = Bitmap.new(448, 96)
  436.     # 还原为上次选择的项目
  437.     @command_window.index = $game_temp.debug_command
  438.     @left_window.top_row = $game_temp.debug_top_row
  439.     @left_window.index = $game_temp.debug_index
  440.     @right_window.mode = @left_window.mode = @command_window.index
  441.     @right_window.top_id = @left_window.top_id
  442.     # 连按计数
  443.     @press_count = 0
  444.     # 执行过渡
  445.     Graphics.transition
  446.     # 主循环
  447.     loop do
  448.       # 刷新游戏画面
  449.       Graphics.update
  450.       # 刷新输入情报
  451.       Input.update
  452.       # 刷新画面
  453.       update
  454.       # 如果画面被切换的话就中断循环
  455.       if $scene != self
  456.         break
  457.       end
  458.     end
  459.     # 刷新地图
  460.     $game_map.refresh
  461.     # 装备过渡
  462.     Graphics.freeze
  463.     # 释放窗口
  464.     @command_window.dispose
  465.     @left_window.dispose
  466.     @right_window.dispose
  467.     @help_window.dispose
  468.   end
  469.   #--------------------------------------------------------------------------
  470.   # ● 刷新画面
  471.   #--------------------------------------------------------------------------
  472.   def update
  473.     # 刷新窗口
  474.     @right_window.mode = @left_window.mode = @command_window.index
  475.     @right_window.sub_mode = @left_window.index if @left_window.mode == 6
  476.     if @left_window.mode == 7
  477.       @right_window.map_id = @left_window.map_id
  478.     else
  479.       @right_window.map_id = 0
  480.     end
  481.     @right_window.top_id = @left_window.top_id
  482.     @command_window.update
  483.     @left_window.update
  484.     @right_window.update
  485.     # 记忆选择中的项目
  486.     $game_temp.debug_command = @command_window.index
  487.     $game_temp.debug_top_row = @left_window.top_row
  488.     $game_temp.debug_index = @left_window.index
  489.     if @command_window.active
  490.       update_command
  491.       return
  492.     end
  493.     # 左侧窗口被激活的情况下: 调用 update_left
  494.     if @left_window.active
  495.       update_left
  496.       return
  497.     end
  498.     # 右侧窗口被激活的情况下: 调用 update_right
  499.     if @right_window.active
  500.       update_right
  501.       return
  502.     end
  503.   end
  504.   def update_command
  505.     @left_window.adjust_cursor
  506.     # 按下 B 键的情况下
  507.     if Input.trigger?(Input::B)
  508.       # 演奏取消 SE
  509.       $game_system.se_play($data_system.cancel_se)
  510.       # 切换到地图画面
  511.       $scene = Scene_Map.new
  512.       return
  513.     end
  514.     if Input.trigger?(Input::C)
  515.       $game_system.se_play($data_system.decision_se)
  516.       @command_window.active = false
  517.       @left_window.active = true
  518.       # 模式为8[执行代码]的情况下,不存在调试文件的,新建之
  519.       if @command_window.index == 8
  520.         text = "C (Enter) : Execute Code"
  521.         @help_window.contents.draw_text(4, 0, 406, 32, text)
  522.         unless FileTest.exist?("Debug.txt")
  523.           file = File.open("Debug.txt", "w")
  524.           file.close
  525.         end
  526.       end
  527.       return
  528.     end
  529.   end
  530.   #--------------------------------------------------------------------------
  531.   # ● 刷新画面 (左侧窗口被激活的情况下)
  532.   #--------------------------------------------------------------------------
  533.   def update_left
  534.     # 按下 B 键的情况下
  535.     if Input.trigger?(Input::B)
  536.       # 演奏取消 SE
  537.       $game_system.se_play($data_system.cancel_se)
  538.       @command_window.active = true
  539.       @left_window.active = false
  540.       @help_window.contents.clear
  541.       return
  542.     end
  543.     # 按下 C 键的情况下
  544.     if Input.trigger?(Input::C)
  545.       # 演奏确定 SE
  546.       $game_system.se_play($data_system.decision_se)
  547.       # 显示帮助
  548.       if @left_window.mode == 0 || @left_window.mode == 7
  549.         text1 = "C (Enter) : ON / OFF"
  550.         @help_window.contents.draw_text(4, 0, 406, 32, text1)
  551.       elsif @left_window.mode == 5
  552.         text1 = "← : -100  → : +100  ↑ : +1000  ↓ : -1000"
  553.         text2 = "L (Pageup) : -10000"
  554.         text3 = "R (Pagedown) : +10000"
  555.         @help_window.contents.draw_text(4, 0, 406, 32, text1)
  556.         @help_window.contents.draw_text(4, 32, 406, 32, text2)
  557.         @help_window.contents.draw_text(4, 64, 406, 32, text3)
  558.       elsif @left_window.mode == 6
  559.         case @right_window.sub_mode
  560.         when 0
  561.           text1 = "C (Enter) : IN / OUT"
  562.         when 1
  563.           text1 = "← : -1   → : +1"
  564.         when 2..3
  565.           text1 = "← : -10   → : +10"
  566.         when 4..7
  567.           text1 = "← : -5   → : +5"
  568.         end
  569.         @help_window.contents.draw_text(4, 0, 406, 32, text1)
  570.       elsif @left_window.mode != 8
  571.         text1 = "← : -1   → : +1"
  572.         text2 = "L (Pageup) : -10"
  573.         text3 = "R (Pagedown) : +10"
  574.         @help_window.contents.draw_text(4, 0, 406, 32, text1)
  575.         @help_window.contents.draw_text(4, 32, 406, 32, text2)
  576.         @help_window.contents.draw_text(4, 64, 406, 32, text3)
  577.       end
  578.       # 模式为8[执行代码]的情况下,直接执行
  579.       if @left_window.mode == 8
  580.         execute_code
  581.         return
  582.       end
  583.       # 激活右侧窗口
  584.       @left_window.active = false
  585.       @right_window.active = true
  586.       @right_window.index = 0
  587.       return
  588.     end
  589.   end
  590.   #--------------------------------------------------------------------------
  591.   # ● 刷新画面 (右侧窗口被激活的情况下)
  592.   #--------------------------------------------------------------------------
  593.   def update_right
  594.     # 按下 B 键的情况下
  595.     if Input.trigger?(Input::B)
  596.       # 演奏取消 SE
  597.       $game_system.se_play($data_system.cancel_se)
  598.       # 激活左侧窗口
  599.       @left_window.active = true
  600.       @right_window.active = false
  601.       @right_window.index = -1
  602.       # 删除帮助
  603.       @help_window.contents.clear
  604.       return
  605.     end
  606.     # 获取被选择的开关 / 变量的 ID
  607.     current_id = @right_window.top_id + @right_window.index
  608.     case @right_window.mode
  609.     # 开关的情况下
  610.     when 0
  611.       # 按下 C 键的情况下
  612.       if Input.trigger?(Input::C)
  613.         # 演奏确定 SE
  614.         $game_system.se_play($data_system.decision_se)
  615.         # 逆转 ON / OFF 状态
  616.         $game_switches[current_id] = (not $game_switches[current_id])
  617.         @right_window.refresh
  618.         return
  619.       end
  620.     # 变量的情况下
  621.     when 1
  622.       # 按下右键的情况下
  623.       if Input.repeat?(Input::RIGHT)
  624.         # 演奏光标 SE
  625.         $game_system.se_play($data_system.cursor_se)
  626.         # 变量加 1
  627.         $game_variables[current_id] += 1
  628.         # 检查上限
  629.         if $game_variables[current_id] > 99999999
  630.           $game_variables[current_id] = 99999999
  631.         end
  632.         @right_window.refresh
  633.         return
  634.       end
  635.       # 按下左键的情况下
  636.       if Input.repeat?(Input::LEFT)
  637.         # 演奏光标 SE
  638.         $game_system.se_play($data_system.cursor_se)
  639.         # 变量减 1
  640.         $game_variables[current_id] -= 1
  641.         # 检查下限
  642.         if $game_variables[current_id] < -99999999
  643.           $game_variables[current_id] = -99999999
  644.         end
  645.         @right_window.refresh
  646.         return
  647.       end
  648.       # 按下 R 键的情况下
  649.       if Input.repeat?(Input::R)
  650.         # 演奏光标 SE
  651.         $game_system.se_play($data_system.cursor_se)
  652.         # 变量加 10
  653.         $game_variables[current_id] += 10
  654.         # 检查上限
  655.         if $game_variables[current_id] > 99999999
  656.           $game_variables[current_id] = 99999999
  657.         end
  658.         @right_window.refresh
  659.         return
  660.       end
  661.       # 按下 L 键的情况下
  662.       if Input.repeat?(Input::L)
  663.         # 演奏光标 SE
  664.         $game_system.se_play($data_system.cursor_se)
  665.         # 变量减 10
  666.         $game_variables[current_id] -= 10
  667.         # 检查下限
  668.         if $game_variables[current_id] < -99999999
  669.           $game_variables[current_id] = -99999999
  670.         end
  671.         @right_window.refresh
  672.         return
  673.       end
  674.     # 物品的情况下
  675.     when 2
  676.       # 按下右键的情况下
  677.       if Input.repeat?(Input::RIGHT)
  678.         # 演奏光标 SE
  679.         $game_system.se_play($data_system.cursor_se)
  680.         # 物品数加 1
  681.         $game_party.gain_item(current_id, 1)
  682.         @right_window.refresh
  683.         return
  684.       end
  685.       # 按下左键的情况下
  686.       if Input.repeat?(Input::LEFT)
  687.         # 演奏光标 SE
  688.         $game_system.se_play($data_system.cursor_se)
  689.         # 物品数减 1
  690.         $game_party.lose_item(current_id, 1)
  691.         @right_window.refresh
  692.         return
  693.       end
  694.       # 按下 R 键的情况下
  695.       if Input.repeat?(Input::R)
  696.         # 演奏光标 SE
  697.         $game_system.se_play($data_system.cursor_se)
  698.         # 物品数加 10
  699.         $game_party.gain_item(current_id, 10)
  700.         @right_window.refresh
  701.         return
  702.       end
  703.       # 按下 L 键的情况下
  704.       if Input.repeat?(Input::L)
  705.         # 演奏光标 SE
  706.         $game_system.se_play($data_system.cursor_se)
  707.         # 物品数减 10
  708.         $game_party.lose_item(current_id, 10)
  709.         @right_window.refresh
  710.         return
  711.       end
  712.     # 武器的情况下
  713.     when 3
  714.       # 按下右键的情况下
  715.       if Input.repeat?(Input::RIGHT)
  716.         # 演奏光标 SE
  717.         $game_system.se_play($data_system.cursor_se)
  718.         # 武器数加 1
  719.         $game_party.gain_weapon(current_id, 1)
  720.         @right_window.refresh
  721.         return
  722.       end
  723.       # 按下左键的情况下
  724.       if Input.repeat?(Input::LEFT)
  725.         # 演奏光标 SE
  726.         $game_system.se_play($data_system.cursor_se)
  727.         # 武器数减 1
  728.         $game_party.lose_weapon(current_id, 1)
  729.         @right_window.refresh
  730.         return
  731.       end
  732.       # 按下 R 键的情况下
  733.       if Input.repeat?(Input::R)
  734.         # 演奏光标 SE
  735.         $game_system.se_play($data_system.cursor_se)
  736.         # 武器数加 10
  737.         $game_party.gain_weapon(current_id, 10)
  738.         @right_window.refresh
  739.         return
  740.       end
  741.       # 按下 L 键的情况下
  742.       if Input.repeat?(Input::L)
  743.         # 演奏光标 SE
  744.         $game_system.se_play($data_system.cursor_se)
  745.         # 武器数减 10
  746.         $game_party.lose_weapon(current_id, 10)
  747.         @right_window.refresh
  748.         return
  749.       end
  750.     # 防具的情况下
  751.     when 4
  752.       # 按下右键的情况下
  753.       if Input.repeat?(Input::RIGHT)
  754.         # 演奏光标 SE
  755.         $game_system.se_play($data_system.cursor_se)
  756.         # 防具数加 1
  757.         $game_party.gain_armor(current_id, 1)
  758.         @right_window.refresh
  759.         return
  760.       end
  761.       # 按下左键的情况下
  762.       if Input.repeat?(Input::LEFT)
  763.         # 演奏光标 SE
  764.         $game_system.se_play($data_system.cursor_se)
  765.         # 防具数减 1
  766.         $game_party.lose_armor(current_id, 1)
  767.         @right_window.refresh
  768.         return
  769.       end
  770.       # 按下 R 键的情况下
  771.       if Input.repeat?(Input::R)
  772.         # 演奏光标 SE
  773.         $game_system.se_play($data_system.cursor_se)
  774.         # 防具数加 10
  775.         $game_party.gain_armor(current_id, 10)
  776.         @right_window.refresh
  777.         return
  778.       end
  779.       # 按下 L 键的情况下
  780.       if Input.repeat?(Input::L)
  781.         # 演奏光标 SE
  782.         $game_system.se_play($data_system.cursor_se)
  783.         # 防具数减 10
  784.         $game_party.lose_armor(current_id, 10)
  785.         @right_window.refresh
  786.         return
  787.       end
  788.     # 金钱的情况下
  789.     when 5
  790.       # 按下右键的情况下
  791.       if Input.repeat?(Input::RIGHT)
  792.         # 演奏光标 SE
  793.         $game_system.se_play($data_system.cursor_se)
  794.         # 金钱数加 100
  795.         $game_party.gain_gold(100)
  796.         @right_window.refresh
  797.         return
  798.       end
  799.       # 按下左键的情况下
  800.       if Input.repeat?(Input::LEFT)
  801.         # 演奏光标 SE
  802.         $game_system.se_play($data_system.cursor_se)
  803.         # 金钱数减 100
  804.         $game_party.lose_gold(100)
  805.         @right_window.refresh
  806.         return
  807.       end
  808.       if Input.repeat?(Input::UP)
  809.         $game_system.se_play($data_system.cursor_se)
  810.         $game_party.gain_gold(1000)
  811.         @right_window.refresh
  812.         return
  813.       end
  814.       if Input.repeat?(Input::DOWN)
  815.         $game_system.se_play($data_system.cursor_se)
  816.         $game_party.lose_gold(1000)
  817.         @right_window.refresh
  818.         return
  819.       end
  820.       # 按下 R 键的情况下
  821.       if Input.repeat?(Input::R)
  822.         # 演奏光标 SE
  823.         $game_system.se_play($data_system.cursor_se)
  824.         # 金钱数加 10000
  825.         $game_party.gain_gold(10000)
  826.         @right_window.refresh
  827.         return
  828.       end
  829.       # 按下 L 键的情况下
  830.       if Input.repeat?(Input::L)
  831.         # 演奏光标 SE
  832.         $game_system.se_play($data_system.cursor_se)
  833.         # 防具数减 10
  834.         $game_party.lose_gold(10000)
  835.         @right_window.refresh
  836.         return
  837.       end
  838.     # 角色的情况下
  839.     when 6
  840.       update_debug_actor
  841.     # 独立开关的情况下
  842.     when 7
  843.       # 按下 C 键的情况下
  844.       if Input.trigger?(Input::C)
  845.         # 获取信息
  846.         key = @right_window.key
  847.         # 无效的情况下
  848.         if key == []
  849.           $game_system.se_play($data_system.buzzer_se)
  850.           return
  851.         end
  852.         # 演奏确定 SE
  853.         $game_system.se_play($data_system.decision_se)
  854.         # 逆转 ON / OFF 状态
  855.         $game_self_switches[key] ^= true
  856.         @right_window.refresh
  857.         return
  858.       end
  859.     end
  860.   end
  861.   def update_debug_actor
  862.     # 连按计数(只对左右键有效,这个是为了处理变化过慢的问题)
  863.     if Input.press?(Input::LEFT) || Input.press?(Input::RIGHT)
  864.       @press_count += 1
  865.     else
  866.       @press_count = 0
  867.     end
  868.     actor = $game_actors[@right_window.index+1]
  869.     if Input.trigger?(Input::C)
  870.       if @right_window.sub_mode == 0
  871.         $game_system.se_play($data_system.decision_se)
  872.         if $game_party.actors.include?(actor)
  873.           $game_party.remove_actor(actor.id)
  874.         else
  875.           $game_party.add_actor(actor.id)
  876.         end
  877.       end
  878.       return
  879.     end
  880.     if Input.repeat?(Input::LEFT) && @right_window.sub_mode > 0
  881.       if @press_count <= 80
  882.         rate = 1
  883.       end
  884.       if @press_count > 80 && @press_count <=200
  885.         rate = 5
  886.       end
  887.       if @press_count > 200
  888.         rate = 10
  889.       end
  890.       $game_system.se_play($data_system.cursor_se)
  891.       case @right_window.sub_mode
  892.       when 1
  893.         actor.level -= 1 * rate
  894.       when 2
  895.         actor.maxhp -= 10 * rate
  896.       when 3
  897.         actor.maxsp -= 10 * rate
  898.       when 4
  899.         actor.str -= 5 * rate
  900.       when 5
  901.         actor.dex -= 5 * rate
  902.       when 6
  903.         actor.agi -= 5 * rate
  904.       when 7
  905.         actor.int -= 5 * rate
  906.       end
  907.       return
  908.     end
  909.     if Input.repeat?(Input::RIGHT) && @right_window.sub_mode > 0
  910.       if @press_count <= 80
  911.         rate = 1
  912.       end
  913.       if @press_count > 80 && @press_count <=200
  914.         rate = 5
  915.       end
  916.       if @press_count > 200
  917.         rate = 10
  918.       end
  919.       $game_system.se_play($data_system.cursor_se)
  920.       case @right_window.sub_mode
  921.       when 1
  922.         actor.level += 1 * rate
  923.       when 2
  924.         actor.maxhp += 10 * rate
  925.       when 3
  926.         actor.maxsp += 10 * rate
  927.       when 4
  928.         actor.str += 5 * rate
  929.       when 5
  930.         actor.dex += 5 * rate
  931.       when 6
  932.         actor.agi += 5 * rate
  933.       when 7
  934.         actor.int += 5 * rate
  935.       end
  936.       return
  937.     end
  938.     @right_window.refresh
  939.   end
  940.   def execute_code
  941.     if FileTest.exist?("Debug.txt")
  942.       file = File.open("Debug.txt", "r")
  943.       str = file.read
  944.       eval(str)
  945.       file.close
  946.       print "代码执行完毕!"
  947.     else
  948.       print '找不到文件"Debug.txt"'
  949.     end
  950.   end
  951. end

作者: 1041235896    时间: 2014-9-5 16:43
好东西 顶一个{:2_285:}
作者: 克莉丝    时间: 2014-9-5 17:58
修改装备参数,按键加速之类的

作者: sirenke    时间: 2014-9-5 18:48
效果不错
作者: 羁绊的守望者    时间: 2014-9-5 18:52
记得XAS附带了一个非常强力的Scene_Debug加强,作者似乎是……
作者: kuerlulu    时间: 2014-9-7 21:04
版主大好腻害!
以及用新建的空白地图测试独立开关时RGSSError了
好想帮忙可是不知道怎么帮

作者: 羁绊的守望者    时间: 2014-9-7 21:10
能否新增一个功能,使制作者可以直接输入脚本然后执行?
作者: kuerlulu    时间: 2014-9-7 22:19
直接输入脚本运行
  1. open("1.txt", "w") {|f| f.write 'puts "于此键入代码"' }
  2. system("notepad 1.txt")
  3. eval(File.read("1.txt").gsub(/\A\xEF\xBB\xBF/, ""))
复制代码
注: xp中没有后台运行脚本或者Thread.new{loop{sleep 9}}的话10秒后会脚本已备分
作者: RyanBern    时间: 2014-9-11 21:36
kuerlulu 发表于 2014-9-7 22:19
直接输入脚本运行注: xp中没有后台运行脚本或者Thread.new{loop{sleep 9}}的话10秒后会脚本已备分 ...

已经放弃了Text Area的想法,准备利用外部文件帮忙了。
为了游戏的稳定性方面,如果输入错误的代码,那么是会报错的,而不是利用rescue来补救。因为有些错误rescue无法捕捉,而且如果代码的中间有错,那么前面正确的还是会被执行到。
有没有更好的处理方法?
作者: 晴兰    时间: 2014-9-12 10:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: taroxd    时间: 2014-9-12 16:55
本帖最后由 taroxd 于 2014-9-12 16:58 编辑
RyanBern 发表于 2014-9-11 21:36
已经放弃了Text Area的想法,准备利用外部文件帮忙了。
为了游戏的稳定性方面,如果输入错误的代码,那么 ...


外部脚本的安全性本来就是一个坑。
硬要稳定性的话,可以新建一个线程,并在那个线程中提高 $SAFE,并在线程中用 instance_eval 执行代码。

↑ 不过这样做很麻烦,不是吗。反正是制作者自己玩的,安全性稳定性就别考虑了吧。就我而言,我在 eval VA的技能公式的时候都是把原先默认的 rescue 去掉的。


关于错误的补救,把错误信息画在窗口上,或者弹出个对话框提醒就行了嘛~


事实上,我觉得这货完全没有兰兰的控制台方便实用。

最后一个小吐槽:为什么是.txt 而不是.rb…… 实在不行可以自动判断文件名嘛= =
作者: myownroc    时间: 2014-9-12 23:20
从来都是用事件设置相关变量的怎么办=_=
作者: kuerlulu    时间: 2014-9-14 14:48
浴巾大美女|余烬之中|影月千秋|Shadow Momo的全键盘脚本出来卖个萌


卖萌完毕
作者: 邪月长啸    时间: 2014-10-6 22:07
请问,这个脚本要在制作游戏时如何使用?
小白表示只知道在测试时按F9,但具体的事件妖怎么设置?
求解
作者: 云岚宗口云屌    时间: 2014-10-22 19:53
非常实用!为楼主顶一下。另外,如果游戏打包了,按下F9还会召唤这个界面吗?
作者: uishi121    时间: 2015-4-28 01:35
好东西顶一个先!
作者: pjy612    时间: 2015-5-18 01:59
{:2_276:}挖个坟。。。不知道其他的 版本 VX VA 有没有类似的脚本。。。
作者: linwsh123    时间: 2015-7-13 17:19
羁绊的守望者 发表于 2014-9-7 21:10
能否新增一个功能,使制作者可以直接输入脚本然后执行?

您的动态签名怎么搞的? 好酷炫啊




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