stuff
parent
e8c81933f1
commit
1477d5263e
@ -1,119 +0,0 @@
|
||||
Giants Map Objects Extractor
|
||||
============================
|
||||
|
||||
This tool is used to get what objects are in a map. It outputs the objects model and coords and doesn't do anything else yet.
|
||||
|
||||
How it works
|
||||
------------
|
||||
|
||||
Basically maps are just a zip file that contains a terrain file (.gti) and a meta file (.bin) which stores objects on the map.
|
||||
|
||||
Objects in this file are stored using the following format:
|
||||
```
|
||||
...
|
||||
2a -> static byte which indicate the start of an object definition
|
||||
model -> 4 bytes long value to indicate the model of the object
|
||||
x -> 4 bytes float value
|
||||
y -> 4 bytes float value
|
||||
z -> 4 bytes float value
|
||||
angle -> 4 bytes float value
|
||||
...
|
||||
```
|
||||
|
||||
Usage
|
||||
----
|
||||
|
||||
```
|
||||
C:\Projects\gck-map-extract-objects> python .\extract.py
|
||||
usage: extract.py [-h] map_file
|
||||
extract.py: error: the following arguments are required: map_file
|
||||
```
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
```
|
||||
extract.py "MvM - Ultimate Winter Duel.gck"
|
||||
2019-05-24 11:00:00,229 - __main__ - INFO - Opening MvM - Ultimate Winter Duel.gck
|
||||
2019-05-24 11:00:00,230 - __main__ - INFO - Found file default.gti
|
||||
2019-05-24 11:00:00,230 - __main__ - INFO - Found file w_M_Mecc_Ultimate Winter Duel.bin
|
||||
2019-05-24 11:00:00,230 - __main__ - INFO - Found BIN file w_M_Mecc_Ultimate Winter Duel.bin
|
||||
2019-05-24 11:00:00,230 - __main__ - INFO - Opening w_M_Mecc_Ultimate Winter Duel.bin
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=49 x=-469.0 y=-859.0 z=0.0 angle=0.0
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=679 x=-7.300000190734863 y=-652.510009765625 z=83.86000061035156 angle=-35.0
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=679 x=-19.989999771118164 y=-88.2699966430664 z=4.239999771118164 angle=0.0
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=1319 x=-195.02000427246094 y=-850.3099975585938 z=175.27999877929688 angle=0.0
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=679 x=-188.91000366210938 y=-23.510000228881836 z=4.239999771118164 angle=0.0
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=679 x=193.85000610351562 y=-23.510000228881836 z=4.239999771118164 angle=0.0
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=679 x=-271.79998779296875 y=-937.969970703125 z=180.5800018310547 angle=-312.0
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=1285 x=-4.340000152587891 y=108.41000366210938 z=33.72999954223633 angle=0.0
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=522 x=18.65999984741211 y=116.0999984741211 z=34.0099983215332 angle=0.0
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=679 x=323.6099853515625 y=-876.6900024414062 z=201.82000732421875 angle=-151.6699981689453
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=1319 x=344.6300048828125 y=-904.1099853515625 z=201.82000732421875 angle=0.0
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=679 x=-260.9599914550781 y=132.4199981689453 z=4.239999771118164 angle=0.0
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=679 x=-153.16000366210938 y=-1101.010009765625 z=83.86000061035156 angle=-322.6700134277344
|
||||
2019-05-24 11:00:00,231 - __main__ - INFO - Object model=679 x=-172.30999755859375 y=273.4100036621094 z=4.239999771118164 angle=0.0
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=679 x=285.4599914550781 y=197.58999633789062 z=1.2899999618530273 angle=0.0
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=1051 x=398.67999267578125 y=131.8300018310547 z=4.239999771118164 angle=0.0
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=679 x=152.89999389648438 y=308.9200134277344 z=5.579999923706055 angle=0.0
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=679 x=3.630000114440918 y=342.75 z=4.239999771118164 angle=0.0
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=1319 x=711.719970703125 y=-443.30999755859375 z=48.470001220703125 angle=0.0
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=679 x=6.340000152587891 y=-1206.72998046875 z=83.86000061035156 angle=-191.0
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=1050 x=741.4400024414062 y=-413.0400085449219 z=48.470001220703125 angle=-127.66999816894531
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=981 x=8.890000343322754 y=-1259.68994140625 z=83.86000061035156 angle=180.0
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=1317 x=-893.8900146484375 y=-381.3900146484375 z=0.0 angle=0.0
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=1306 x=-267.07000732421875 y=479.6000061035156 z=4.239999771118164 angle=0.0
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=1050 x=-676.7000122070312 y=379.6300048828125 z=83.86000061035156 angle=81.66999816894531
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=1320 x=-646.2100219726562 y=403.239990234375 z=83.86000061035156 angle=0.0
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=679 x=-399.5199890136719 y=-1388.6600341796875 z=169.30999755859375 angle=-207.3300018310547
|
||||
2019-05-24 11:00:00,232 - __main__ - INFO - Object model=1317 x=994.530029296875 y=-537.030029296875 z=0.0 angle=0.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=257 x=-497.5 y=685.260009765625 z=48.130001068115234 angle=56.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=1308 x=-382.2799987792969 y=-1584.050048828125 z=93.37999725341797 angle=0.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=679 x=139.1699981689453 y=-1660.030029296875 z=269.6499938964844 angle=-191.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=1319 x=178.2899932861328 y=-1661.4200439453125 z=269.6499938964844 angle=0.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=679 x=77.22000122070312 y=919.5399780273438 z=83.86000061035156 angle=36.66999816894531
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=1319 x=-316.8699951171875 y=950.2999877929688 z=78.8499984741211 angle=0.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=1319 x=209.67999267578125 y=1057.9200439453125 z=175.27999877929688 angle=0.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=1317 x=1045.1500244140625 y=585.3200073242188 z=0.0 angle=0.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=679 x=-261.4700012207031 y=1129.1199951171875 z=201.82000732421875 angle=144.6699981689453
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=1319 x=-318.7300109863281 y=1154.6800537109375 z=201.82000732421875 angle=0.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=679 x=288.1300048828125 y=1146.27001953125 z=176.6199951171875 angle=-135.6699981689453
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=1317 x=869.0900268554688 y=-1661.699951171875 z=0.0 angle=0.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=1317 x=-887.760009765625 y=929.8800048828125 z=0.0 angle=0.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=1317 x=-983.75 y=-1688.030029296875 z=0.0 angle=0.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=1319 x=-111.12000274658203 y=-2063.580078125 z=169.3800048828125 angle=0.0
|
||||
2019-05-24 11:00:00,235 - __main__ - INFO - Object model=679 x=188.22000122070312 y=1288.4100341796875 z=83.86000061035156 angle=-135.6699981689453
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=679 x=47.5 y=1457.300048828125 z=83.86000061035156 angle=-5.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=981 x=46.77000045776367 y=1507.9599609375 z=83.86000061035156 angle=0.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=679 x=468.04998779296875 y=1627.6600341796875 z=169.3800048828125 angle=-77.66999816894531
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=1317 x=64.48999786376953 y=-2515.27001953125 z=0.0 angle=0.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=1308 x=422.0299987792969 y=1821.6500244140625 z=89.43000030517578 angle=0.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=679 x=-90.0 y=1902.81005859375 z=269.6499938964844 angle=-5.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=1319 x=-70.79000091552734 y=1924.3399658203125 z=269.6499938964844 angle=0.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=1317 x=1032.449951171875 y=1683.0 z=0.0 angle=0.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=1317 x=-779.9600219726562 y=2074.550048828125 z=0.0 angle=0.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=1317 x=328.82000732421875 y=2709.030029296875 z=0.0 angle=0.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=830 x=61.81365966796875 y=43.321990966796875 z=33.72548294067383 angle=30.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=830 x=-69.09912109375 y=63.499755859375 z=33.72548294067383 angle=270.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=830 x=111.51863098144531 y=117.34283447265625 z=33.72548294067383 angle=180.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=830 x=99.72610473632812 y=189.97406005859375 z=33.72548294067383 angle=59.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=830 x=-57.904052734375 y=136.96914672851562 z=33.72548294067383 angle=80.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=830 x=-30.401458740234375 y=187.08465576171875 z=33.72548294067383 angle=270.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=830 x=-15.68878173828125 y=63.614349365234375 z=33.72548294067383 angle=180.0
|
||||
2019-05-24 11:00:00,236 - __main__ - INFO - Object model=830 x=37.35343933105469 y=188.96652221679688 z=33.72548294067383 angle=270.0
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Number of objects: 62
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 679 was found 22 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 1317 was found 10 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 1319 was found 9 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 830 was found 8 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 1050 was found 2 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 981 was found 2 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 1308 was found 2 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 49 was found 1 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 1285 was found 1 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 522 was found 1 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 1051 was found 1 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 1306 was found 1 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 1320 was found 1 times
|
||||
2019-05-24 11:00:00,237 - __main__ - INFO - Model 257 was found 1 times
|
||||
```
|
@ -0,0 +1,173 @@
|
||||
import argparse
|
||||
import os.path
|
||||
|
||||
from lib.fileutils import *
|
||||
from lib.packet import Packet
|
||||
|
||||
|
||||
def ftell(fp):
|
||||
return hex(fp.tell())
|
||||
|
||||
|
||||
def read_bin(_input: str, _output: str):
|
||||
with open(_input, "rb") as fp:
|
||||
# read 0x30 bytes
|
||||
fileversion = read_int(fp)
|
||||
render_data = read_int(fp)
|
||||
texturesmemory_size = read_int(fp)
|
||||
unk2_size = read_int(fp)
|
||||
objects_size = read_int(fp)
|
||||
some_bytes = read_int(fp)
|
||||
fx_size = read_int(fp)
|
||||
world_size = read_int(fp)
|
||||
huds_size = read_int(fp)
|
||||
worldflags_size = read_int(fp)
|
||||
unk = read_int(fp)
|
||||
unk = read_int(fp)
|
||||
|
||||
print("[%s] Game is %s bytes" % (ftell(fp), render_data))
|
||||
read_bytes(fp, render_data)
|
||||
|
||||
print("[%s] World is %s bytes..." % (ftell(fp), world_size))
|
||||
read_bytes(fp, world_size)
|
||||
|
||||
print("[%s] Texturesmemory is %s bytes..." % (ftell(fp), texturesmemory_size))
|
||||
texturesmemory = read_bytes(fp, texturesmemory_size)
|
||||
|
||||
print("[%s] FX %s bytes..." % (ftell(fp), fx_size))
|
||||
read_bytes(fp, fx_size)
|
||||
|
||||
print("[%s] unk2 %s bytes..." % (ftell(fp), unk2_size))
|
||||
read_bytes(fp, unk2_size)
|
||||
|
||||
print("[%s] worldflags %s bytes..." % (ftell(fp), worldflags_size))
|
||||
read_bytes(fp, worldflags_size)
|
||||
|
||||
print("[%s] huds %s bytes..." % (ftell(fp), huds_size))
|
||||
read_bytes(fp, huds_size)
|
||||
|
||||
print("[%s] objects %s bytes..." % (ftell(fp), objects_size))
|
||||
objects = read_bytes(fp, objects_size)
|
||||
|
||||
print("[%s] textures_attributes? %s bytes..." % (ftell(fp), some_bytes))
|
||||
# textures_attributes = read_bytes(fp, some_bytes)
|
||||
|
||||
first_int = read_int(fp)
|
||||
print("[%s] First int: %s" % (ftell(fp), first_int))
|
||||
|
||||
second_int = read_int(fp)
|
||||
print("Second int: %s" % second_int)
|
||||
|
||||
with open(_output, "wb") as fp:
|
||||
fp.write(texturesmemory)
|
||||
|
||||
print("Done")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("input_bin", help="PS2 bin file to read")
|
||||
parser.add_argument("output_file", help="output bin for objects")
|
||||
args = parser.parse_args()
|
||||
read_bin(args.input_bin, args.output_file)
|
||||
|
||||
|
||||
def read_textures(file_input):
|
||||
print("Reading %s" % file_input)
|
||||
|
||||
curr = 0
|
||||
|
||||
with open(file_input, "rb") as fp:
|
||||
content = fp.read()
|
||||
|
||||
while curr < len(content):
|
||||
byte_index = content.find(b"END-OF-FIL", curr)
|
||||
if byte_index != -1:
|
||||
byte_index += 0xc
|
||||
print("content: %s (%s)" % (content[byte_index], hex(content[byte_index])))
|
||||
while content[byte_index] == 0x2a or content[byte_index] == 0x00:
|
||||
byte_index += 1
|
||||
|
||||
print("found texture at %s: %s %s" % (hex(byte_index), hex(content[byte_index]), hex(content[byte_index+1])))
|
||||
# after CLUTS
|
||||
byte_index += 0x20
|
||||
p = Packet(content)
|
||||
p.seek(byte_index)
|
||||
# psm = p.get_short()
|
||||
psm = content[byte_index]
|
||||
psm = psm << 8 & 0x3f
|
||||
|
||||
d_comp = p.get_long()
|
||||
d_comp = p.get_long()
|
||||
is_compressed = d_comp >> 0x12 & 0xf
|
||||
compare = d_comp >> 0xe & 0xf
|
||||
|
||||
if is_compressed != compare:
|
||||
print(hex(d_comp))
|
||||
new_compare = compare - is_compressed
|
||||
if new_compare <= 0:
|
||||
print("ERROOOOOOOOOR")
|
||||
if new_compare == 1:
|
||||
decomp_bytes = 2
|
||||
elif new_compare == 2:
|
||||
decomp_bytes = 3
|
||||
elif new_compare == 3:
|
||||
decomp_bytes = 4
|
||||
else:
|
||||
print("ERROOOOOOOOOOR: %s" % new_compare)
|
||||
print("decomp_bytes: %s" % decomp_bytes)
|
||||
print("psm: %s -> %s (compressed: %s, compare: %s)" % (psm, get_pixel_format(psm), is_compressed, compare))
|
||||
|
||||
curr = byte_index+1
|
||||
else:
|
||||
curr = len(content)
|
||||
|
||||
|
||||
def get_pixel_format(psm) -> str:
|
||||
_data = {
|
||||
0: "PSMCT32",
|
||||
1: "PSMCT24",
|
||||
2: "PSMCT16",
|
||||
10: "PSMCT16S",
|
||||
19: "PSMT8",
|
||||
20: "PSMT4",
|
||||
27: "PSMT8H",
|
||||
26: "PSMT4HL",
|
||||
44: "PSMT4HH",
|
||||
48: "PSMZ32",
|
||||
49: "PSMZ24",
|
||||
50: "PSMZ16",
|
||||
58: "PSMZ16S",
|
||||
}
|
||||
|
||||
return _data.get(psm, "UNKNOWN")
|
||||
|
||||
|
||||
def read_sizes():
|
||||
print("=====================================================================================")
|
||||
print("=====================================================================================")
|
||||
print("=====================================================================================")
|
||||
print("=====================================================================================")
|
||||
print("=====================================================================================")
|
||||
print("=====================================================================================")
|
||||
print("=====================================================================================")
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("input_bin", help="PS2 bin file to read")
|
||||
args = parser.parse_args()
|
||||
|
||||
all_num = 0
|
||||
|
||||
if os.path.isdir(args.input_bin):
|
||||
for currdir, dirs, files in os.walk(args.input_bin):
|
||||
for file in files:
|
||||
if file.lower().endswith(".bin"):
|
||||
read_textures(currdir+"/"+file)
|
||||
else:
|
||||
read_textures(args.input_bin)
|
||||
|
||||
print("textures:%s" % all_num)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# main()
|
||||
read_sizes()
|
Loading…
Reference in New Issue