From 5aad221a75ab21ecf5a494b58f642671304aef98 Mon Sep 17 00:00:00 2001 From: Lannamokia Date: Sat, 18 Oct 2025 16:59:45 +0000 Subject: [PATCH] =?UTF-8?q?=E5=BA=94=E7=94=A8=E8=A1=A5=E4=B8=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ segafs_gui.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07d538f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__/segafs_gui.cpython-313.pyc +test_version_fix.py diff --git a/segafs_gui.py b/segafs_gui.py index 3d952d9..8f87d21 100644 --- a/segafs_gui.py +++ b/segafs_gui.py @@ -468,7 +468,7 @@ class SegaFSGUI: 'second': self.second_var.get(), 'milli': 0, }, - 'game_version': {'release': 0, 'minor': 0, 'major': int(self.game_version_var.get()) if self.game_version_var.get().isdigit() else 0} if self.container_type_var.get() != 2 else self.game_version_var.get().encode('utf-8')[:4].ljust(4, b'\x00'), + 'game_version': self._parse_game_version() if self.container_type_var.get() != 2 else self.game_version_var.get().encode('utf-8')[:4].ljust(4, b'\x00'), 'block_size': int(self.block_size_var.get(), 16), 'header_block_count': 8, 'unk2': 0, @@ -489,6 +489,61 @@ class SegaFSGUI: } return config + def _parse_game_version(self): + """解析游戏版本号为Version结构 + + 支持多种格式: + - "A041" -> major=0x41, minor=0x0A, release=0x00 (字母+数字格式) + - "1.2.3" -> major=1, minor=2, release=3 (点分格式) + - "123" -> major=123, minor=0, release=0 (纯数字格式) + """ + version_str = self.game_version_var.get().strip() + + if not version_str: + return {'release': 0, 'minor': 0, 'major': 0} + + # 处理字母+数字格式 (如 "A041") + if len(version_str) >= 2 and version_str[0].isalpha(): + try: + # 第一个字符作为minor版本 (A=10, B=11, etc.) + minor = ord(version_str[0].upper()) - ord('A') + 10 + # 剩余数字作为major版本 + major_str = version_str[1:] + if major_str.isdigit(): + major = int(major_str) + else: + # 如果不是纯数字,尝试解析为十六进制 + major = int(major_str, 16) if all(c in '0123456789ABCDEFabcdef' for c in major_str) else 0 + return {'release': 0, 'minor': minor, 'major': major} + except (ValueError, IndexError): + pass + + # 处理点分格式 (如 "1.2.3") + if '.' in version_str: + try: + parts = version_str.split('.') + major = int(parts[0]) if len(parts) > 0 and parts[0].isdigit() else 0 + minor = int(parts[1]) if len(parts) > 1 and parts[1].isdigit() else 0 + release = int(parts[2]) if len(parts) > 2 and parts[2].isdigit() else 0 + return {'release': release, 'minor': minor, 'major': major} + except (ValueError, IndexError): + pass + + # 处理纯数字格式 + if version_str.isdigit(): + return {'release': 0, 'minor': 0, 'major': int(version_str)} + + # 尝试解析为十六进制 + try: + if all(c in '0123456789ABCDEFabcdef' for c in version_str): + major = int(version_str, 16) + return {'release': 0, 'minor': 0, 'major': major} + except ValueError: + pass + + # 默认返回 + return {'release': 0, 'minor': 0, 'major': 0} + def generate_container_thread(self): """在后台线程中生成容器""" try: