DIR
From mgsdevwiki
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