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

Project1

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

[原创发布] 地图事件重排工具

[复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23209
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

跳转到指定楼层
1
发表于 2010-7-21 02:07:01 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
cat之RGSS Assistant脚本第三弹:地图事件重排工具

RM给地图生成事件的时候,是自动从1开始顺序编号的
但在制作过程中,如果有删除了某个事件,又添加了其他的事件,会导致事件ID变的乱七八糟
再一个,比如原来的地图,觉得空,想加一些NPC,结果加的NPC编号都很靠后,和原来的事件都不在一起,找起来非常麻烦。
本脚本可以一定程度上解决这个问题,借用这个脚本,你可以很方便的安排事件的ID,按用途整理到一起,最后还能恢复到从1开始的紧密序号。

后续将推出,数据库(魔法、武器、防具、属性、状态、开关、变量)通用重排工具,敬请关注。
  1. #==============================================================================
  2. # ■ Event_Reorder
  3. #------------------------------------------------------------------------------
  4. #  地图事件重排工具 by SailCat
  5. #   该程序能够将地图中的事件ID重新排列,包括插入空序列,紧密重排,交换,重设等
  6. #   使用说明:
  7. #     插入本脚本到Game_Temp(注意:不是Main)之前,然后在最后一行后面加上你需要的
  8. #   指令代码。
  9. #     order = Event_Reorder.new
  10. #     order.load(15) # 载入第15张地图
  11. #     order.insert(12, 14) # 在事件ID12之前插入14个空事件,即1,2...11,26,27...
  12. #     order.sort # 将事件ID从1开始紧密排列,原有顺序不变
  13. #     order.swap_event(33, 99) # 将事件33和99的ID互换,内容不变
  14. #     order.set_event_id(33, 99) # 将事件33的ID设为99,内容不变
  15. #     order.save # 保存修改后的地图
  16. #   备注:
  17. #     1. 这个功能原本很简单,大段的代码都是用来保证ID重设后已有的逻辑不改变,但
  18. #        目前这个版本还不支持事件脚本中对事件ID的引用,请先备份已有地图。
  19. #     2. 修改后请关闭工程重新打开。
  20. #     3. 用完后请将你添加的指令代码全部删掉或注释掉,以正常测试游戏。
  21. #==============================================================================
  22. class Event_Reorder
  23.   #--------------------------------------------------------------------------
  24.   # ● 初期化
  25.   #--------------------------------------------------------------------------
  26.   def initialize
  27.     # 初始化地图和文件名信息
  28.     @map = nil
  29.     @map_name = ""
  30.     # 初始化被修改的事件ID表
  31.     @modified_ids = {}
  32.   end
  33.   #--------------------------------------------------------------------------
  34.   # ● 载入地图
  35.   #     map_id: 地图ID
  36.   #--------------------------------------------------------------------------
  37.   def load(map_id)
  38.     @map_name = sprintf("Data/Map%03d.rxdata", map_id)
  39.     # 载入当前地图
  40.     if FileTest.exist?(@map_name)
  41.       @map = load_data(@map_name)
  42.     else
  43.       print "地图ID错误"
  44.       exit
  45.     end
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 插入事件序号
  49.   #     position: 插入位置
  50.   #     count: 插入的数目
  51.   #--------------------------------------------------------------------------
  52.   def insert(position, count)
  53.     # 初始化被修改的事件ID表
  54.     @modified_ids = {}
  55.     # 从999开始
  56.     event_id = 999
  57.     # 循环每一个大于position的事件ID
  58.     while event_id >= position
  59.       event = @map.events[event_id]
  60.       # 如果该事件存在
  61.       if event != nil
  62.         # 如果无法插入就报错返回
  63.         if event_id > 999 - count
  64.           print "该地图的事件太多,无法插入编号"
  65.           return
  66.         end
  67.         # 设置插入后的事件ID
  68.         event.id = event_id + count
  69.         @map.events[event_id + count] = event
  70.         @map.events.delete(event_id)
  71.         # 设置修改标记
  72.         @modified_ids[event_id] = event_id + count
  73.       end
  74.       event_id -= 1
  75.     end
  76.     # 刷新事件ID的引用
  77.     reset_commands
  78.   end
  79.   #--------------------------------------------------------------------------
  80.   # ● 重排事件序号(从1开始连续排)
  81.   #--------------------------------------------------------------------------
  82.   def sort
  83.     # 初始化被修改的事件ID表
  84.     @modified_ids = {}
  85.     # 从1开始
  86.     event_id = 1
  87.     new_event_id = 1
  88.     # 循环每个事件ID
  89.     while event_id < 999
  90.       event = @map.events[event_id]
  91.       # 如果该事件存在
  92.       if event != nil
  93.         # 如果前面已经移位
  94.         if event_id != new_event_id
  95.           # 跟着前移
  96.           event.id = new_event_id
  97.           @map.events[new_event_id] = event
  98.           @map.events.delete(event_id)
  99.           # 设置修改标记
  100.           @modified_ids[event_id] = new_event_id
  101.         end
  102.         new_event_id += 1
  103.       end
  104.       event_id += 1
  105.     end
  106.     # 刷新事件ID的引用
  107.     reset_commands
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # ● 交换事件序号
  111.   #     event_id1: 事件序号1
  112.   #     event_id2: 事件序号2
  113.   #--------------------------------------------------------------------------
  114.   def swap_event(event_id1, event_id2)
  115.     # 初始化被修改的事件ID表
  116.     @modified_ids = {}
  117.     # 如果两个事件都存在
  118.     if @map.events.has_key?(event_id1) and @map.events.has_key?(event_id2)
  119.       # 取得2个事件
  120.       event1 = @map.events[event_id1].clone
  121.       event2 = @map.events[event_id2].clone
  122.       # 互换ID
  123.       event1.id = event_id2
  124.       event2.id = event_id1
  125.       # 互换事件
  126.       @map.events[event_id1] = event2
  127.       @map.events[event_id2] = event1
  128.       # 设置修改标记
  129.       @modified_ids[event_id1] = event_id2
  130.       @modified_ids[event_id2] = event_id1
  131.       # 刷新事件ID的引用
  132.       reset_commands
  133.     end
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # ● 设置新的事件序号
  137.   #     old_event_id: 原事件序号
  138.   #     new_event_id: 新事件序号
  139.   #--------------------------------------------------------------------------
  140.   def set_event_id(old_event_id, new_event_id)
  141.     # 初始化被修改的事件ID表
  142.     @modified_ids = {}
  143.     # 如果源ID存在而目标ID不存在
  144.     if @map.events.has_key?(old_event_id)
  145.       unless @map.events.has_key?(new_event_id)
  146.         # 更改事件ID
  147.         event = @map.events[old_event_id]
  148.         event.id = new_event_id
  149.         @map.events[new_event_id] = event
  150.         @map.events.delete(old_event_id)
  151.         # 设置修改标记
  152.         @modified_ids[old_event_id] = new_event_id
  153.         # 刷新事件ID的引用
  154.         reset_commands
  155.       # 两个事件同时存在的情况下
  156.       else
  157.         # 按交换处理
  158.         swap_event(old_event_id, new_event_id)
  159.       end
  160.     end
  161.   end
  162.   #--------------------------------------------------------------------------
  163.   # ● 根据排序结果,重设本地图所有事件中对事件ID的引用
  164.   #--------------------------------------------------------------------------
  165.   def reset_commands
  166.     @map.events.each_value do |value|
  167.       value.pages.each do |page|
  168.         # 如果指令不为空
  169.         if page.list.length > 0
  170.           # 循环页的所有指令
  171.           page.list.each do |command|
  172.             # 检查需要重新设置事件ID的指令
  173.             case command.code
  174.             when 111 # 条件分歧
  175.               case command.parameters[0]
  176.               when 6 # 角色
  177.                 if @modified_ids.has_key?(command.parameters[1])
  178.                   command.parameters[1] = @modified_ids[command.parameters[1]]
  179.                 end
  180.               when 12 # 脚本
  181.                 # 暂不支持
  182.               end
  183.             when 122 # 变量操作
  184.               if command.parameters[3] == 6 and
  185.                 @modified_ids.has_key?(command.parameters[4])
  186.                 command.parameters[4] = @modified_ids[command.parameters[4]]
  187.               end              
  188.             when 202 # 设置事件位置
  189.               if @modified_ids.has_key?(command.parameters[0])
  190.                 command.parameters[0] = @modified_ids[command.parameters[0]]
  191.               end
  192.               if command.parameters[1] == 2 and
  193.                 @modified_ids.has_key?(command.parameters[2])
  194.                 command.parameters[2] = @modified_ids[command.parameters[2]]
  195.               end              
  196.             when 207, 209 # 显示动画, 强制移动
  197.               if @modified_ids.has_key?(command.parameters[0])
  198.                 command.parameters[0] = @modified_ids[command.parameters[0]]
  199.               end
  200.             when 355, 655 # 脚本
  201.               # 暂不支持
  202.             end
  203.           end
  204.         end
  205.       end
  206.     end
  207.   end
  208.   #--------------------------------------------------------------------------
  209.   # ● 保存地图
  210.   #--------------------------------------------------------------------------
  211.   def save
  212.     if @map_name != ""
  213.       save_data(@map, @map_name)
  214.     end
  215.   end
  216. end
复制代码

Lv1.梦旅人

辉瑞中国首席研究员<

梦石
0
星屑
50
在线时间
142 小时
注册时间
2008-1-18
帖子
2129
3
发表于 2010-7-21 10:13:36 | 只看该作者
在下是来膜拜LZ的,敢问LZ大人是否清华计算机系毕业,那里各种神牛

点评

在下更加崇拜了 = =  发表于 2010-7-21 11:59
她是中文系……  发表于 2010-7-21 11:11
来6r就是等某位仁兄的巨坑

褴褛着身行无端,囊中羞涩空心酸。
平生几无得意事,倒塔泡面宅寝室。
惟羡隔壁高帅富,雨露春风月夜声。
青丝无处觅其踪,只有硬盘苍井空。
莫云男儿空悲愁,鸿鹄岂不天际游。
坐断天下执鹿首,千百金帛万兜鍪。
夜深忽梦某年月,再见女神欲语迟。
吊丝终有逆袭日,木耳再无回粉时。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1195
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

2
发表于 2010-7-21 10:05:44 | 只看该作者
mark && 求第一弹
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-18 13:56

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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