Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Ubisoft .SMx files - splits them up into single map SMx files
- # Script for QuickBMS: https://aluigi.altervista.org/quickbms.htm
- # Detect endianness
- goto 0x08
- get ENDIAN_TEST long
- endian guess ENDIAN_TEST
- goto 0x00
- get VERSION long
- get HEADER_SIZE long
- get SECTIONS long
- goto HEADER_SIZE
- # Detect maps format version
- xmath MAJOR_VERSION "(VERSION & 0xFFFF0000) >> 16"
- xmath MINOR_VERSION "VERSION & 0x0000FFFF"
- if MAJOR_VERSION >= 0x0A # First seen in Batman: Rise of Sin Tzu
- if MAJOR_VERSION >= 0x16 # First seen in Splinter Cell: Double Agent
- math MAP_VERSION = 3
- else
- math MAP_VERSION = 2
- endif
- else
- math MAP_VERSION = 1
- endif
- # Detect padding
- if HEADER_SIZE > 0x0c
- set PADDING_SIZE HEADER_SIZE
- else
- set PADDING_SIZE long 0
- endif
- for i = 0 < SECTIONS
- get SEC_TYPE long
- get ZERO long
- get SEC_OFF long
- get SEC_SIZE long
- getdstring SEC_NAME 0x20
- if MAP_VERSION > 1
- get SEC_DUMMY long
- endif
- # Grab values from section header.
- savepos HEADER_OFF
- goto SEC_OFF
- if MAP_VERSION < 3
- get ZERO long
- get SEC1_OFF long
- get SEC1_NUM long
- get SEC2_OFF long
- get SEC2_NUM long
- get SEC3_OFF long
- get SEC3_NUM long
- get EXTRA_OFF long
- get EXTRA_SIZE long
- else
- get ZERO long
- get SEC1_OFF long
- get SEC1_NUM long
- get SEC2_OFF long
- get SEC2_NUM long
- get SEC4_OFF long
- get SEC4_NUM long
- get SEC3_OFF long
- get SEC3_NUM long
- get EXTRA_OFF long
- get EXTRA_SIZE long
- endif
- # Make a new SMx header.
- log MEMORY_FILE 0 0
- put VERSION long MEMORY_FILE
- put HEADER_SIZE long MEMORY_FILE
- put 1 long MEMORY_FILE
- # Allocate space for section table.
- callfunction WRITE_PADDING 1
- if MAP_VERSION < 2
- putdstring "" 0x30 MEMORY_FILE
- else
- putdstring "" 0x34 MEMORY_FILE
- endif
- callfunction WRITE_PADDING 1
- savepos WRITE_SEC_OFF MEMORY_FILE
- # Write section header.
- append
- log MEMORY_FILE SEC_OFF SEC_SIZE
- append
- # Write all internal sounds.
- xmath SEC3_OFF_ABS "SEC3_OFF + SEC_OFF"
- goto SEC3_OFF_ABS
- for j = 0 < SEC3_NUM
- get ID long
- get TABLE_OFF long
- get TABLE_NUM long
- get TABLE2_OFF long
- get TABLE2_NUM long
- math TABLE2_OFF + SEC3_OFF_ABS
- savepos SEC3_HEADER_OFF
- goto TABLE2_OFF
- for k = 0 < TABLE2_NUM
- get SUBID long
- get SND_SIZE_PADDED long
- get SND_SIZE long
- get SND_OFFSET long
- # Fix offset in the target file.
- xmath WRITE_OFF "TABLE2_OFF - SEC_OFF + WRITE_SEC_OFF + k * 0x10 + 0x0c"
- get WRITE_VAL asize MEMORY_FILE
- goto WRITE_OFF MEMORY_FILE
- put WRITE_VAL long MEMORY_FILE
- append
- log MEMORY_FILE SND_OFFSET SND_SIZE
- append
- callfunction WRITE_PADDING 1
- next k
- goto SEC3_HEADER_OFF
- next j
- # Write the section table properly now that we know the offset.
- goto HEADER_SIZE MEMORY_FILE
- put SEC_TYPE long MEMORY_FILE
- put ZERO long MEMORY_FILE
- put WRITE_SEC_OFF long MEMORY_FILE
- put SEC_SIZE long MEMORY_FILE
- putdstring SEC_NAME 0x20 MEMORY_FILE
- if MAP_VERSION > 1
- put SEC_DUMMY long MEMORY_FILE
- endif
- get EXT extension
- string NAME p "%s.%s" SEC_NAME EXT
- get SIZE asize MEMORY_FILE
- log NAME 0 SIZE MEMORY_FILE
- goto HEADER_OFF
- next i
- startfunction WRITE_PADDING
- if PADDING_SIZE != 0
- get TMP_CUR_OFFSET asize MEMORY_FILE
- xmath TMP_OFFSET "TMP_CUR_OFFSET x PADDING_SIZE"
- if TMP_OFFSET > TMP_CUR_OFFSET
- math TMP_OFFSET - 1
- putvarchr MEMORY_FILE TMP_OFFSET 0
- math TMP_OFFSET + 1
- goto TMP_OFFSET MEMORY_FILE
- endif
- endif
- endfunction
Add Comment
Please, Sign In to add comment