DIR

From mgsdevwiki
Jump to: navigation, search

Archive that contains stage files. PSX Version of MGS1

Tools

Ruby Script

  • undir | Extracts .stg files from STAGE.DIR
  • unstg | Extracts files from .stg into their directories

'To Do'

  • Combine extraction of .stg completely from .dir

undir Source

 1 require 'fileutils'
 2 
 3 # File to load
 4 file = "stage.dir"
 5 
 6 # Creating folder to save content
 7 FileUtils::mkdir_p "stage"
 8 
 9 # Get filenames chunk
10 dir_names_size = IO.binread(file, 4, 0).unpack("V*").join.to_i
11 
12 # Extracting files
13 for loop in 0..dir_names_size/12-1
14 
15  # Get data for extract
16  name = IO.binread(file, 8, 4 + (loop * 12)).delete("\000") # Filename
17  offset = IO.binread(file, 4, 12 + (loop * 12)).unpack("V*").join.to_i * 2048 # File start at...
18  size = IO.binread(file, 2, offset + 2).unpack("v*").join.to_i * 2048 # File size
19  puts name # Puts name on screen
20 
21  # Saving file
22  $extract = File.new("stage/#{name}.stg", "wb")
23  $extract.write IO.binread(file, size, offset)
24  $extract.close
25 end

unstg Source

  1 # Get the extension
  2 def getExtn(extension)
  3  extension_reference = {
  4   '61' => 'azm', '62' => 'bin', '63' => 'con', '64' => 'dar',
  5   '65' => 'efx', '67' => 'gcx', '68' => 'hzm', '69' => 'img',
  6   '6b' => 'kmd', '6c' => 'lit', '6d' => 'mt3', '6f' => 'oar',
  7   '70' => 'pcc', '72' => 'rar', '73' => 'sgt', '77' => 'wvx',
  8   '7a' => 'zmd', 'ff' => 'dar'
  9  }
 10  if extension_reference.assoc(extension)
 11   return extension_reference.assoc(extension)[1]
 12  else
 13   return extension
 14  end
 15 end
 16 
 17 # Requires
 18 require 'fileutils'
 19 
 20 # Showing info
 21 print "MGS_unStg v1.0
 22 
 23 Unpack *.stg files.
 24 Write the path and filename and hit enter.
 25 
 26 stg file to unpack: "
 27 
 28 # Get the filename
 29 file = gets.gsub('\\', '/').gsub(["0a"].pack("H*"), '')
 30 
 31 # Exist?
 32 if file == ""
 33  puts "No filename specified, hit enter to exit."
 34  gets
 35  exit
 36 elsif !File.file?(file)
 37  puts "The file \"#{file}\" don't exist, hit enter to exit."
 38  gets
 39  exit
 40 end
 41 
 42 # Creating folder to extract
 43 FileUtils::mkdir_p file.split(".")[0]
 44 
 45 # File Size
 46 total_size = IO.binread(file, 2, 2).unpack("v*").join.to_i * 2048
 47 
 48 # Reading table and assinging values
 49 offset = 4
 50 row = 0
 51 text = 0
 52 start_at = 2048 # First file starts at 2048 always
 53 while 0 == 0
 54  name = IO.binread(file, 3, offset + (row * 8)).unpack("H*").join
 55  extn = IO.binread(file, 1, offset + 3 + (row * 8)).unpack("H*").join
 56  if name == "000000" # End of table
 57   break
 58  elsif name[-2, 2] == "63" # Files within model pack
 59   remember = start_at
 60   # Creating folder to extract
 61   FileUtils::mkdir_p "#{file.split(".")[0]}/stg_mdl1"
 62   while 0 == 0
 63    name = IO.binread(file, 3, offset + (row * 8)).unpack("H*").join
 64    extn = IO.binread(file, 1, offset + 3 + (row * 8)).unpack("H*").join
 65    if name == "000063"
 66     start_at = remember
 67     break
 68    end
 69    puts "#{name}.#{getExtn(extn)} packed"
 70    size = IO.binread(file, 4, offset + 12 + (row * 8)).unpack("V*").join.to_i - IO.binread(file, 4, offset + 4 + (row * 8)).unpack("V*").join.to_i
 71    extract = File.new("#{file.split(".")[0]}/stg_mdl1/#{name}.#{getExtn(extn)}", "wb")
 72    extract.write IO.binread(file, size, start_at)
 73    start_at += size
 74    extract.close
 75    row += 1
 76   end
 77  elsif name == "00006e" && text == 1 # Texture 2 pack
 78   puts "#{name}.#{getExtn(extn)} text_2"
 79   text = 2
 80   size = IO.binread(file, 4, offset + 4 + (row * 8)).unpack("V*").join.to_i
 81   extract = File.new("#{file.split(".")[0]}/stg_tex2.#{getExtn(extn)}", "wb")
 82   extract.write IO.binread(file, size, start_at)
 83   extract.close
 84  elsif name == "00006e" && text == 2 # Texture 3 pack
 85   puts "#{name}.#{getExtn(extn)} text_3"
 86   text = 3
 87   size = IO.binread(file, 4, offset + 4 + (row * 8)).unpack("V*").join.to_i
 88   extract = File.new("#{file.split(".")[0]}/stg_tex3.#{getExtn(extn)}", "wb")
 89   extract.write IO.binread(file, size, start_at)
 90   extract.close
 91  elsif name == "00006e" # Texture 1 pack
 92   puts "#{name}.#{getExtn(extn)} text_1"
 93   text = 1
 94   size = IO.binread(file, 4, offset + 4 + (row * 8)).unpack("V*").join.to_i
 95   extract = File.new("#{file.split(".")[0]}/stg_tex1.#{getExtn(extn)}", "wb")
 96   extract.write IO.binread(file, size, start_at)
 97   extract.close
 98  else # Regular file
 99   puts "#{name}.#{getExtn(extn)}"
100   size = IO.binread(file, 4, offset + 4 + (row * 8)).unpack("V*").join.to_i
101   extract = File.new("#{file.split(".")[0]}/#{name}.#{getExtn(extn)}", "wb")
102   extract.write IO.binread(file, size, start_at)
103   extract.close
104  end
105  if name == "000063" # Model pack, no need to save
106   puts "#{name}.#{getExtn(extn)}"
107   size = IO.binread(file, 4, offset + 4 + (row * 8)).unpack("V*").join.to_i
108  end
109  row += 1
110  
111  start_at += size
112  if start_at % 2048 != 0
113   start_at += 2048 - start_at % 2048
114  end
115 end