じ☆ve冰风 发表于 2024-4-19 18:19:24

地图事件重排工具

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

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

后续将推出,数据库(魔法、武器、防具、属性、状态、开关、变量)通用重排工具,敬请关注。#==============================================================================# ■ Event_Reorder#------------------------------------------------------------------------------#  地图事件重排工具 by SailCat#   该程序能够将地图中的事件ID重新排列,包括插入空序列,紧密重排,交换,重设等#   使用说明:#   插入本脚本到Game_Temp(注意:不是Main)之前,然后在最后一行后面加上你需要的#   指令代码。#   order = Event_Reorder.new#   order.load(15) # 载入第15张地图#   order.insert(12, 14) # 在事件ID12之前插入14个空事件,即1,2...11,26,27...#   order.sort # 将事件ID从1开始紧密排列,原有顺序不变#   order.swap_event(33, 99) # 将事件33和99的ID互换,内容不变#   order.set_event_id(33, 99) # 将事件33的ID设为99,内容不变#   order.save # 保存修改后的地图#   备注:#   1. 这个功能原本很简单,大段的代码都是用来保证ID重设后已有的逻辑不改变,但#      目前这个版本还不支持事件脚本中对事件ID的引用,请先备份已有地图。#   2. 修改后请关闭工程重新打开。#   3. 用完后请将你添加的指令代码全部删掉或注释掉,以正常测试游戏。#==============================================================================class Event_Reorder#--------------------------------------------------------------------------# ● 初期化#--------------------------------------------------------------------------def initialize    # 初始化地图和文件名信息    @map = nil    @map_name = ""    # 初始化被修改的事件ID表    @modified_ids = {}end#--------------------------------------------------------------------------# ● 载入地图#   map_id: 地图ID#--------------------------------------------------------------------------def load(map_id)    @map_name = sprintf("Data/Map%03d.rxdata", map_id)    # 载入当前地图    if FileTest.exist?(@map_name)      @map = load_data(@map_name)    else      print "地图ID错误"      exit    endend#--------------------------------------------------------------------------# ● 插入事件序号#   position: 插入位置#   count: 插入的数目#--------------------------------------------------------------------------def insert(position, count)    # 初始化被修改的事件ID表    @modified_ids = {}    # 从999开始    event_id = 999    # 循环每一个大于position的事件ID    while event_id >= position      event = @map.events      # 如果该事件存在      if event != nil      # 如果无法插入就报错返回      if event_id > 999 - count          print "该地图的事件太多,无法插入编号"          return      end      # 设置插入后的事件ID      event.id = event_id + count      @map.events = event      @map.events.delete(event_id)      # 设置修改标记      @modified_ids = event_id + count      end      event_id -= 1    end    # 刷新事件ID的引用    reset_commandsend#--------------------------------------------------------------------------# ● 重排事件序号(从1开始连续排)#--------------------------------------------------------------------------def sort    # 初始化被修改的事件ID表    @modified_ids = {}    # 从1开始    event_id = 1    new_event_id = 1    # 循环每个事件ID    while event_id < 999      event = @map.events      # 如果该事件存在      if event != nil      # 如果前面已经移位      if event_id != new_event_id          # 跟着前移          event.id = new_event_id          @map.events = event          @map.events.delete(event_id)          # 设置修改标记          @modified_ids = new_event_id      end      new_event_id += 1      end      event_id += 1    end    # 刷新事件ID的引用    reset_commandsend#--------------------------------------------------------------------------# ● 交换事件序号#   event_id1: 事件序号1#   event_id2: 事件序号2#--------------------------------------------------------------------------def swap_event(event_id1, event_id2)    # 初始化被修改的事件ID表    @modified_ids = {}    # 如果两个事件都存在    if @map.events.has_key?(event_id1) and @map.events.has_key?(event_id2)      # 取得2个事件      event1 = @map.events.clone      event2 = @map.events.clone      # 互换ID      event1.id = event_id2      event2.id = event_id1      # 互换事件      @map.events = event2      @map.events = event1      # 设置修改标记      @modified_ids = event_id2      @modified_ids = event_id1      # 刷新事件ID的引用      reset_commands    endend#--------------------------------------------------------------------------# ● 设置新的事件序号#   old_event_id: 原事件序号#   new_event_id: 新事件序号#--------------------------------------------------------------------------def set_event_id(old_event_id, new_event_id)    # 初始化被修改的事件ID表    @modified_ids = {}    # 如果源ID存在而目标ID不存在    if @map.events.has_key?(old_event_id)      unless @map.events.has_key?(new_event_id)      # 更改事件ID      event = @map.events      event.id = new_event_id      @map.events = event      @map.events.delete(old_event_id)      # 设置修改标记      @modified_ids = new_event_id      # 刷新事件ID的引用      reset_commands      # 两个事件同时存在的情况下      else      # 按交换处理      swap_event(old_event_id, new_event_id)      end    endend#--------------------------------------------------------------------------# ● 根据排序结果,重设本地图所有事件中对事件ID的引用#--------------------------------------------------------------------------def reset_commands    @map.events.each_value do |value|      value.pages.each do |page|      # 如果指令不为空      if page.list.length > 0          # 循环页的所有指令          page.list.each do |command|            # 检查需要重新设置事件ID的指令            case command.code            when 111 # 条件分歧            case command.parameters            when 6 # 角色                if @modified_ids.has_key?(command.parameters)                  command.parameters = @modified_ids]                end            when 12 # 脚本                # 暂不支持            end            when 122 # 变量操作            if command.parameters == 6 and               @modified_ids.has_key?(command.parameters)                command.parameters = @modified_ids]            end                        when 202 # 设置事件位置            if @modified_ids.has_key?(command.parameters)                command.parameters = @modified_ids]            end            if command.parameters == 2 and                @modified_ids.has_key?(command.parameters)                command.parameters = @modified_ids]            end                        when 207, 209 # 显示动画, 强制移动            if @modified_ids.has_key?(command.parameters)                command.parameters = @modified_ids]            end            when 355, 655 # 脚本            # 暂不支持            end          end      end      end    endend#--------------------------------------------------------------------------# ● 保存地图#--------------------------------------------------------------------------def save    if @map_name != ""      save_data(@map, @map_name)    endendend复制代码
             本帖来自P1论坛作者DeathKing,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=142148若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 地图事件重排工具