应用补丁

This commit is contained in:
Lannamokia
2025-10-18 16:59:45 +00:00
parent def04b4551
commit 5aad221a75
2 changed files with 58 additions and 1 deletions
+2
View File
@@ -0,0 +1,2 @@
__pycache__/segafs_gui.cpython-313.pyc
test_version_fix.py
+56 -1
View File
@@ -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: