From 5e8d19824abb8abc0b8aef66062914957e19ab5c Mon Sep 17 00:00:00 2001 From: lifegpc Date: Sun, 20 Apr 2025 23:15:33 +0800 Subject: [PATCH] Update patch_bp.py --- patch_bp.py | 72 +++++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/patch_bp.py b/patch_bp.py index deddf64..172060a 100644 --- a/patch_bp.py +++ b/patch_bp.py @@ -38,6 +38,7 @@ class BPScript: break pos += 1 data = self.data[start_pos:pos] + data_len = len(data) try: data = data.decode('cp932') except UnicodeDecodeError: @@ -45,7 +46,7 @@ class BPScript: data = "utf8:" + data if not data: return None - return start_pos, self.iPos - 2 + return start_pos, self.iPos - 2, data_len def extract_values(self): str_pos = {} @@ -58,38 +59,19 @@ class BPScript: t = self.extract_string() if t is not None: if t[0] not in str_pos: - str_pos[t[0]] = [t[1]] + str_pos[t[0]] = (t[2], [t[1]]) else: - str_pos[t[0]].append(t[1]) + str_pos[t[0]][1].append(t[1]) except UnicodeDecodeError: self.iPos -= 2 return str_pos - - def extract_strings(self): - self.iPos = self.last_pos + 1 - while self.data[self.iPos] == 0: - self.iPos += 1 - strings = [] - start_pos = self.iPos - while self.iPos < self.len: - if self.data[self.iPos] == 0: - data = self.data[start_pos:self.iPos] - data_len = len(data) - try: - data = data.decode('cp932') - except UnicodeDecodeError: - data = data.decode('utf-8') - data = "utf8:" + data - if data: - strings.append((start_pos, data_len)) - start_pos = self.iPos + 1 - self.iPos += 1 - return dict(strings) - def setup_values(self, values: dict): + def setup_values(self, values: dict, append: bool = True): data = bytearray(self.data) goffsets = self.extract_values() - offsets = self.extract_strings() + offsets = {} + for k, v in goffsets.items(): + offsets[k] = v[0] print(offsets) self.iPos = self.header_size all_keys = list(int(i) for i in values.keys()) @@ -99,6 +81,7 @@ class BPScript: new_offsets[key] = key last_len = 0 last_key = all_keys[-1] + instr_size = self.instr_size for i in range(len(all_keys)): key = all_keys[i] ori_len = offsets[key] + 1 @@ -113,16 +96,30 @@ class BPScript: last_len = new_len if new_len == ori_len: continue - for j in range(i + 1, len(all_keys)): - off = all_keys[j] - new_offsets[off] += new_len - ori_len + if append: + new_offsets[key] = instr_size + self.header_size + instr_size += new_len + else: + for j in range(i + 1, len(all_keys)): + off = all_keys[j] + new_offsets[off] += new_len - ori_len print(new_offsets) old_len = last_key + last_len - new_len = new_offsets[last_key] + last_len + if append: + new_len = self.header_size + instr_size + else: + new_len = new_offsets[last_key] + last_len # 对齐到16字节 - new_len = new_len + (16 - new_len % 16) - data = bytearray(data + b'\0' * (new_len - self.len)) - self.len = new_len + # new_len = new_len + (16 - new_len % 16) + print(old_len, new_len, self.len) + if old_len == self.len: + data = bytearray(data + b'\0' * (new_len - self.len)) + else: + if append: + data = bytearray(data + b'\0' * (new_len - self.len)) + else: + data = bytearray(data[0:all_keys[0]] + b'\0' * (new_len - self.len) + data[all_keys[0]:]) + self.len = len(data) data[4:8] = struct.pack('= 3: @@ -159,5 +161,5 @@ print(scr.iPos) print(scr.last_pos) with open(json_f, "r", encoding="utf-8") as f: data = json.load(f) -scr.setup_values(data) +scr.setup_values(data, append) scr.save_as(output)