Skip to content

Commit 0303531

Browse files
refactor(meta info): signature added in xcod
1 parent e706662 commit 0303531

File tree

12 files changed

+60
-62
lines changed

12 files changed

+60
-62
lines changed

system/languages/en-EU.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@
7070
"resizing": "Resizing...",
7171
"split_pic": "Splitting picture...",
7272
"writing_pic": "Writing pixels...",
73-
"header_done": "Header wrote!",
7473
"compressing_with": "Compressing texture with %s...",
7574
"compression_error": "Compression failed",
7675
"compression_done": "Compression done!",

system/languages/ru-RU.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@
7070
"resizing": "Изменяем размер...",
7171
"split_pic": "Разделяем картинку...",
7272
"writing_pic": "Конвертируем пиксели...",
73-
"header_done": "Заголовок записан!",
7473
"compressing_with": "Сохраняем с применением %s сжатия...",
7574
"compression_error": "Сжатие не удалось",
7675
"compression_done": "Сжатие прошло успешно!",

system/languages/ua-UA.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@
7070
"resizing": "змінюємо розмір...",
7171
"split_pic": "Розділюємо зоображення...",
7272
"writing_pic": "Записуємо пікселі...",
73-
"header_done": "Написали Header!",
7473
"compressing_with": "Запаковуємо з %s...",
7574
"compression_error": "Запаковування не вдалося",
7675
"compression_done": "Запаковування виконане!",

system/lib/features/cut_sprites.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,3 @@ def render_objects(swf: SupercellSWF, output_folder: Path):
7575
movie_clip_index,
7676
movie_clip_count,
7777
)
78-
79-
print()

system/lib/features/files.py

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,43 +7,24 @@
77
from system.localization import locale
88

99

10-
def write_sc(output_filename: str | os.PathLike, buffer: bytes, use_lzham: bool):
10+
def write_sc(
11+
output_filename: str | os.PathLike,
12+
buffer: bytes,
13+
signature: Signatures,
14+
version: int | None = None,
15+
):
1116
with open(output_filename, "wb") as file_out:
12-
logger.info(locale.header_done)
17+
file_out.write(compress(buffer, signature, version))
1318

14-
if use_lzham:
15-
logger.info(locale.compressing_with % "LZHAM")
16-
# Why is this here? It's included in the compression module
17-
# file_out.write(struct.pack("<4sBI", b"SCLZ", 18, len(buffer)))
18-
compressed = compress(buffer, Signatures.SCLZ)
19-
20-
file_out.write(compressed)
21-
else:
22-
logger.info(locale.compressing_with % "LZMA")
23-
compressed = compress(buffer, Signatures.SC, 3)
24-
file_out.write(compressed)
25-
logger.info(locale.compression_done)
26-
print()
27-
28-
29-
def open_sc(input_filename: str) -> tuple[bytes, bool]:
30-
use_lzham = False
3119

20+
def open_sc(input_filename: str) -> tuple[bytes, Signatures]:
3221
with open(input_filename, "rb") as f:
3322
file_data = f.read()
3423

3524
try:
3625
if b"START" in file_data:
3726
file_data = file_data[: file_data.index(b"START")]
38-
decompressed_data, signature = decompress(file_data)
39-
40-
if signature.name != Signatures.NONE:
41-
logger.info(locale.detected_comp % signature.name.upper())
42-
43-
if signature == Signatures.SCLZ:
44-
use_lzham = True
27+
return decompress(file_data)
4528
except TypeError:
4629
logger.info(locale.decompression_error)
4730
exit(1)
48-
49-
return decompressed_data, use_lzham

system/lib/features/sc/__init__.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,12 @@ def compile_sc(
5555

5656
sc.write(bytes(5))
5757

58-
write_sc(output_folder / f"{file_info.name}.sc", sc.getvalue(), file_info.use_lzham)
58+
logger.info(locale.compressing_with % file_info.signature.name.upper())
59+
write_sc(
60+
output_folder / f"{file_info.name}.sc",
61+
sc.getvalue(),
62+
file_info.signature,
63+
file_info.signature_version,
64+
)
65+
logger.info(locale.compression_done)
66+
print()

system/lib/features/sc/decode.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
from pathlib import Path
44

55
from loguru import logger
6+
from sc_compression import Signatures
67

8+
from system.bytestream import Writer
79
from system.lib.features.cut_sprites import render_objects
810
from system.lib.swf import SupercellSWF
911
from system.localization import locale
@@ -25,7 +27,7 @@ def decode_textures_only():
2527
swf = SupercellSWF()
2628
base_name = os.path.basename(file).rsplit(".", 1)[0]
2729
try:
28-
texture_loaded, use_lzham = swf.load(f"{input_folder / file}")
30+
texture_loaded, signature = swf.load(f"{input_folder / file}")
2931
if not texture_loaded:
3032
logger.error(locale.not_found % f"{base_name}_tex.sc")
3133
continue
@@ -37,7 +39,7 @@ def decode_textures_only():
3739
)
3840

3941
_save_meta_file(
40-
swf, objects_output_folder, base_name.rstrip("_"), use_lzham
42+
swf, objects_output_folder, base_name.rstrip("_"), signature
4143
)
4244
_save_textures(swf, objects_output_folder, base_name)
4345
except Exception as exception:
@@ -66,7 +68,7 @@ def decode_and_render_objects():
6668
base_name = os.path.basename(file).rsplit(".", 1)[0]
6769

6870
swf = SupercellSWF()
69-
texture_loaded, use_lzham = swf.load(input_folder / file)
71+
texture_loaded, signature = swf.load(input_folder / file)
7072
if not texture_loaded:
7173
logger.error(locale.not_found % f"{base_name}_tex.sc")
7274
continue
@@ -79,7 +81,7 @@ def decode_and_render_objects():
7981

8082
_save_textures(swf, objects_output_folder / "textures", base_name)
8183
render_objects(swf, objects_output_folder)
82-
_save_meta_file(swf, objects_output_folder, base_name, use_lzham)
84+
_save_meta_file(swf, objects_output_folder, base_name, signature)
8385
except Exception as exception:
8486
logger.exception(
8587
locale.error
@@ -113,10 +115,16 @@ def _save_textures(swf: SupercellSWF, textures_output: Path, base_name: str) ->
113115

114116

115117
def _save_meta_file(
116-
swf: SupercellSWF, objects_output_folder: Path, base_name: str, use_lzham: bool
118+
swf: SupercellSWF,
119+
objects_output_folder: Path,
120+
base_name: str,
121+
signature: Signatures,
117122
) -> None:
118-
with open(objects_output_folder / f"{base_name}.xcod", "wb") as xcod_file:
119-
xcod_file.write(b"XCOD")
120-
xcod_file.write(bool.to_bytes(use_lzham, 1, "big"))
121-
xcod_file.write(int.to_bytes(len(swf.textures), 1, "big"))
122-
xcod_file.write(swf.xcod_writer.getvalue())
123+
writer = Writer()
124+
writer.write(b"XCOD")
125+
writer.write_string(signature.name)
126+
writer.write_ubyte(len(swf.textures))
127+
writer.write(swf.xcod_writer.getvalue())
128+
129+
with open(objects_output_folder / f"{base_name}.xcod", "wb") as file:
130+
file.write(writer.getvalue())

system/lib/images.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@ def load_texture(reader: Reader, pixel_type: int, img: Image.Image) -> None:
123123

124124
with open("pixel_buffer", "wb") as pixel_buffer:
125125
pixel_buffer.write(channel_count.to_bytes(1, "little"))
126-
print()
127126

128127
width, height = img.size
129128
point = -1

system/lib/objects/shape/region.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,3 @@ def get_y(self, index: int):
132132

133133
def calculate_bounds(self, matrix: Matrix2x3 | None = None) -> Rect:
134134
return get_rect(apply_matrix(self._xy_points, matrix))
135-
136-
@property
137-
def xy_points(self):
138-
return self._xy_points

system/lib/swf.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from pathlib import Path
33

44
from loguru import logger
5+
from sc_compression import Signatures
56

67
from system.bytestream import Reader, Writer
78
from system.lib.features.files import open_sc
@@ -53,32 +54,37 @@ def __init__(self):
5354
self._matrix_banks: list[MatrixBank] = []
5455
self._matrix_bank: MatrixBank | None = None
5556

56-
def load(self, filepath: str | os.PathLike) -> tuple[bool, bool]:
57+
def load(self, filepath: str | os.PathLike) -> tuple[bool, Signatures]:
5758
self._filepath = Path(filepath)
5859

59-
texture_loaded, use_lzham = self._load_internal(
60+
texture_loaded, signature = self._load_internal(
6061
self._filepath, self._filepath.name.endswith("_tex.sc")
6162
)
6263

6364
if not texture_loaded:
6465
if self._use_uncommon_texture:
65-
texture_loaded, use_lzham = self._load_internal(
66+
texture_loaded, signature = self._load_internal(
6667
self._uncommon_texture_path, True
6768
)
6869
else:
6970
texture_path = str(self._filepath)[:-3] + SupercellSWF.TEXTURE_EXTENSION
70-
texture_loaded, use_lzham = self._load_internal(texture_path, True)
71+
texture_loaded, signature = self._load_internal(texture_path, True)
7172

72-
return texture_loaded, use_lzham
73+
return texture_loaded, signature
7374

7475
def _load_internal(
7576
self, filepath: str | os.PathLike, is_texture_file: bool
76-
) -> tuple[bool, bool]:
77+
) -> tuple[bool, Signatures]:
7778
self.filename = os.path.basename(filepath)
7879

7980
logger.info(locale.collecting_inf % self.filename)
8081

81-
decompressed_data, use_lzham = open_sc(filepath)
82+
decompressed_data, signature = open_sc(filepath)
83+
84+
if signature.name != Signatures.NONE:
85+
logger.info(locale.detected_comp % signature.name.upper())
86+
print()
87+
8288
self.reader = Reader(decompressed_data)
8389
del decompressed_data
8490

@@ -127,7 +133,7 @@ def _load_internal(
127133
if isinstance(movie_clip, MovieClip):
128134
movie_clip.export_name = export_name
129135

130-
return loaded, use_lzham
136+
return loaded, signature
131137

132138
def _load_tags(self, is_texture_file: bool) -> bool:
133139
has_texture = True
@@ -163,6 +169,7 @@ def _load_tags(self, is_texture_file: bool) -> bool:
163169
texture.height,
164170
)
165171
)
172+
print()
166173

167174
self.xcod_writer.write_ubyte(tag)
168175
self.xcod_writer.write_ubyte(texture.pixel_type)

0 commit comments

Comments
 (0)