Project1
标题:
地图事件重排工具
[打印本页]
作者:
SailCat
时间:
2010-7-21 02:07
标题:
地图事件重排工具
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
end
end
#--------------------------------------------------------------------------
# ● 插入事件序号
# position: 插入位置
# count: 插入的数目
#--------------------------------------------------------------------------
def insert(position, count)
# 初始化被修改的事件ID表
@modified_ids = {}
# 从999开始
event_id = 999
# 循环每一个大于position的事件ID
while event_id >= position
event = @map.events[event_id]
# 如果该事件存在
if event != nil
# 如果无法插入就报错返回
if event_id > 999 - count
print "该地图的事件太多,无法插入编号"
return
end
# 设置插入后的事件ID
event.id = event_id + count
@map.events[event_id + count] = event
@map.events.delete(event_id)
# 设置修改标记
@modified_ids[event_id] = event_id + count
end
event_id -= 1
end
# 刷新事件ID的引用
reset_commands
end
#--------------------------------------------------------------------------
# ● 重排事件序号(从1开始连续排)
#--------------------------------------------------------------------------
def sort
# 初始化被修改的事件ID表
@modified_ids = {}
# 从1开始
event_id = 1
new_event_id = 1
# 循环每个事件ID
while event_id < 999
event = @map.events[event_id]
# 如果该事件存在
if event != nil
# 如果前面已经移位
if event_id != new_event_id
# 跟着前移
event.id = new_event_id
@map.events[new_event_id] = event
@map.events.delete(event_id)
# 设置修改标记
@modified_ids[event_id] = new_event_id
end
new_event_id += 1
end
event_id += 1
end
# 刷新事件ID的引用
reset_commands
end
#--------------------------------------------------------------------------
# ● 交换事件序号
# 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[event_id1].clone
event2 = @map.events[event_id2].clone
# 互换ID
event1.id = event_id2
event2.id = event_id1
# 互换事件
@map.events[event_id1] = event2
@map.events[event_id2] = event1
# 设置修改标记
@modified_ids[event_id1] = event_id2
@modified_ids[event_id2] = event_id1
# 刷新事件ID的引用
reset_commands
end
end
#--------------------------------------------------------------------------
# ● 设置新的事件序号
# 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[old_event_id]
event.id = new_event_id
@map.events[new_event_id] = event
@map.events.delete(old_event_id)
# 设置修改标记
@modified_ids[old_event_id] = new_event_id
# 刷新事件ID的引用
reset_commands
# 两个事件同时存在的情况下
else
# 按交换处理
swap_event(old_event_id, new_event_id)
end
end
end
#--------------------------------------------------------------------------
# ● 根据排序结果,重设本地图所有事件中对事件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[0]
when 6 # 角色
if @modified_ids.has_key?(command.parameters[1])
command.parameters[1] = @modified_ids[command.parameters[1]]
end
when 12 # 脚本
# 暂不支持
end
when 122 # 变量操作
if command.parameters[3] == 6 and
@modified_ids.has_key?(command.parameters[4])
command.parameters[4] = @modified_ids[command.parameters[4]]
end
when 202 # 设置事件位置
if @modified_ids.has_key?(command.parameters[0])
command.parameters[0] = @modified_ids[command.parameters[0]]
end
if command.parameters[1] == 2 and
@modified_ids.has_key?(command.parameters[2])
command.parameters[2] = @modified_ids[command.parameters[2]]
end
when 207, 209 # 显示动画, 强制移动
if @modified_ids.has_key?(command.parameters[0])
command.parameters[0] = @modified_ids[command.parameters[0]]
end
when 355, 655 # 脚本
# 暂不支持
end
end
end
end
end
end
#--------------------------------------------------------------------------
# ● 保存地图
#--------------------------------------------------------------------------
def save
if @map_name != ""
save_data(@map, @map_name)
end
end
end
复制代码
作者:
DeathKing
时间:
2010-7-21 10:05
mark && 求第一弹
作者:
dbshy
时间:
2010-7-21 10:13
在下是来膜拜LZ的,敢问LZ大人是否清华计算机系毕业,那里各种神牛
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1