Files
gtav-src/tools_ng/script/art/data_repackage_drawables.rb
2025-09-29 00:52:08 +02:00

133 lines
5.5 KiB
Ruby
Executable File

#
# File:: %RS_TOOLSROOT%/script/art/data_repackage_drawables.rb
# Description:: Repackage export drawable dictionary zips into drawables.
#
# Author:: David Muir <david.muir@rockstarnorth.com>
# Date:: 23 November 2011
#
#----------------------------------------------------------------------------
# Uses
#----------------------------------------------------------------------------
require 'pipeline/config/projects'
require 'pipeline/os/getopt'
require 'pipeline/os/path'
require 'pipeline/projectutil/data_convert'
require 'pipeline/projectutil/data_map'
require 'pipeline/projectutil/data_zip'
include Pipeline
#----------------------------------------------------------------------------
# Constants
#----------------------------------------------------------------------------
OPTIONS = [
[ '--level', '-l', Getopt::REQUIRED, 'process a single level map data (e.g. mdtestbed).' ],
[ '--group', '-g', Getopt::REQUIRED, 'process a group (folder) of map data (e.g. _citye, downtown_01).' ],
[ '--map', '-m', Getopt::REQUIRED, 'process a single map (e.g. v_int_1).' ],
]
#----------------------------------------------------------------------------
# Functions
#----------------------------------------------------------------------------
# Repackage the mapzip file.
def repackage_mapzip( log, project, p4, mapzip )
p4.run_sync( mapzip.filename )
drawable_dictionary_list = ProjectUtil::data_zip_filelist( mapzip.filename ).collect do |filename|
filename if ( File::fnmatch?( '*.idd.zip', filename ) )
end
drawable_dictionary_list.delete( nil )
if ( 0 == drawable_dictionary_list.size )
log.info( "Skipping map #{mapzip.name} as there are no drawable dictionaries." )
return
end
log.info( " Drawable Dictionaries: #{drawable_dictionary_list.size}" )
config = Pipeline::Config::instance()
cache_dir = OS::Path::combine( config.temp(), 'repackage_drawables', mapzip.name )
files = ProjectUtil::data_zip_extract( mapzip.filename, cache_dir, true )
edit_result = p4.run_edit( mapzip.filename ).shift
if ( edit_result.is_a?( String ) and edit_result.include?( "can't edit exclusive file already opened" ) )
log.warn( "Skipping because its exclusively checked out by someone else." )
return
end
files_to_pack = []
files.each do |filename|
if ( File::fnmatch( '*.idd.zip', filename ) ) then
# We'll unpack this and repack its components.
drawable_cache_dir = OS::Path::combine( cache_dir, OS::Path::get_basename( filename ) )
current_drawable = ''
drawable_files = {} # Hash of new drawables to create.
ProjectUtil::data_zip_extract( filename, drawable_cache_dir, true ) do |file|
if ( 0 != current_drawable.casecmp( OS::Path::get_directory( file ) ) ) then
# File in new drawable definition.
current_drawable = OS::Path::get_directory( file )
drawable_files[current_drawable] = [] \
unless ( drawable_files.has_key?( current_drawable ) )
drawable_files[current_drawable] << file
else
# File in current drawable definition.
drawable_files[current_drawable] << file
end
end
drawable_files.each_pair do |drawable, files|
drawable_name = OS::Path::get_basename(drawable)
log.info( " Building drawable #{drawable_name}..." )
drawable_filename = OS::Path::combine( cache_dir, "#{drawable_name}.idr.zip" )
ProjectUtil::data_zip_create( drawable_filename, files, false )
FileUtils::rm( filename ) if ( File::exists?( filename ) )
files_to_pack << drawable_filename
end
else
# We'll just repack this file as-is.
files_to_pack << filename
end
end
ProjectUtil::data_zip_create( mapzip.filename, files_to_pack )
## ProjectUtil::data_convert_file( mapzip.filename )
end
#----------------------------------------------------------------------------
# Implementation
#----------------------------------------------------------------------------
if ( __FILE__ == $0 ) then
log = Log::new( OS::Path::get_basename( __FILE__ ) )
project = Pipeline::Config::instance().project
project.load_config()
opts, trailing = OS::Getopt.getopts( OPTIONS )
if ( opts['help'] ) then
puts OS::Getopt.usage( OPTIONS )
exit( 1 )
end
level = opts['level'].nil? ? nil : opts['level']
group = opts['group'].nil? ? nil : opts['group']
mapname = opts['map'].nil? ? nil : opts['map']
p4 = project.scm()
begin
ProjectUtil::data_map_for_each( project, level, group ) do |mapzip|
map = mapzip.inputs[0]
next unless ( map.exportdefinitions and map.exportinstances )
if ( not mapname.nil? ) then
next unless ( mapname == mapzip.name )
end
log.info( "Processing Map: #{mapzip.name}..." )
repackage_mapzip( log, project, p4, mapzip ) \
if ( File::exists?( mapzip.filename ) )
end
rescue Exception => ex
log.exception( ex, 'Unhandled exception repacking drawable dictionaries.' )
end
end
# %RS_TOOLSROOT%/script/art/data_repackage_drawables.rb