mirror of
https://forgejo.xatacraft.ru/Sunshine/mkxp-sunshine.git
synced 2026-08-22 23:06:18 +00:00
Added the script builder tool
This commit is contained in:
parent
302ec6dd02
commit
ed34ca3f01
1 changed files with 108 additions and 0 deletions
108
rpgscript.rb
Executable file
108
rpgscript.rb
Executable file
|
|
@ -0,0 +1,108 @@
|
||||||
|
#!/usr/bin/ruby
|
||||||
|
require 'zlib'
|
||||||
|
|
||||||
|
def usage
|
||||||
|
STDERR.puts "usage: rpgscript.rb scripts_dir game_dir [x]"
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
|
||||||
|
usage if ARGV.length < 2
|
||||||
|
scripts_dir = ARGV[0]
|
||||||
|
game_dir = ARGV[1]
|
||||||
|
if ARGV.length >= 3
|
||||||
|
usage if ARGV[2] != 'x'
|
||||||
|
extract = true
|
||||||
|
else
|
||||||
|
extract = false
|
||||||
|
end
|
||||||
|
|
||||||
|
# Determine version of game engine
|
||||||
|
game_data_dir = File.join(game_dir, 'Data')
|
||||||
|
unless Dir.exist? game_data_dir
|
||||||
|
STDERR.puts "error: #{game_dir} does not have a Data subdirectory"
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
|
||||||
|
target_path = nil
|
||||||
|
Dir.entries(game_data_dir).each do |e|
|
||||||
|
ext = File.extname(e)
|
||||||
|
if ext =~ /\.r[xv]data2?/
|
||||||
|
target_path = File.join(game_data_dir, 'xScripts' + ext)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
unless target_path
|
||||||
|
STDERR.puts "error: could not determine game engine version"
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
|
||||||
|
# Generate path of script list
|
||||||
|
list_path = File.join(scripts_dir, '_scripts.txt')
|
||||||
|
|
||||||
|
if extract
|
||||||
|
# Make sure the script directory exists
|
||||||
|
Dir.mkdir(scripts_dir) unless Dir.exists? scripts_dir
|
||||||
|
|
||||||
|
# Keep track of names of scripts extracted so we can warn about duplicates
|
||||||
|
names = Hash.new(0)
|
||||||
|
|
||||||
|
# Read scripts
|
||||||
|
File.open(target_path, 'rb') do |fin|
|
||||||
|
File.open(list_path, 'w') do |flist|
|
||||||
|
Marshal.load(fin).each_with_index do |script, index|
|
||||||
|
name = script[1].strip
|
||||||
|
data = Zlib::Inflate.inflate(script[2]).rstrip
|
||||||
|
.gsub(/[ \t]*(?:$|\r\n?)/, "\n")
|
||||||
|
|
||||||
|
# Make sure this file doesn't already exist
|
||||||
|
if name.empty?
|
||||||
|
if data.empty? || data == "\n"
|
||||||
|
flist.puts
|
||||||
|
next
|
||||||
|
else
|
||||||
|
name = 'UNTITLED'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
names[name] += 1
|
||||||
|
if names[name] > 1
|
||||||
|
name << " (#{names[name]})"
|
||||||
|
end
|
||||||
|
|
||||||
|
if data.empty? || data == "\n"
|
||||||
|
# Treat this like a comment
|
||||||
|
flist.puts('# ' + name)
|
||||||
|
else
|
||||||
|
# Write to file order list
|
||||||
|
flist.puts(name)
|
||||||
|
|
||||||
|
# Write script file
|
||||||
|
File.open(File.join(scripts_dir, name + '.rb'), 'wb') do |fout|
|
||||||
|
fout.write(data)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
puts "#{target_path} extracted."
|
||||||
|
else
|
||||||
|
# Write scripts
|
||||||
|
scripts = []
|
||||||
|
|
||||||
|
IO.foreach(list_path) do |name|
|
||||||
|
name.strip!
|
||||||
|
next if name.empty? || name.start_with?('#')
|
||||||
|
|
||||||
|
data = File.read(File.join(scripts_dir, name + '.rb')).rstrip.gsub("\n", "\r\n")
|
||||||
|
|
||||||
|
script = Array.new(3)
|
||||||
|
script[0] = 0
|
||||||
|
script[1] = name
|
||||||
|
script[2] = Zlib.deflate(data)
|
||||||
|
scripts << script
|
||||||
|
end
|
||||||
|
|
||||||
|
File.open(target_path, 'wb') { |f| f.write(Marshal.dump(scripts)) }
|
||||||
|
puts "#{target_path} written."
|
||||||
|
end
|
||||||
Loading…
Reference in a new issue