import os file_name = "1" if not os.path.exists(file_name): print(f"파일을 찾을 수 없습니다: '{file_name}'")else: with open(file_name, "rb") as f: data = bytearray(f.read()) print("--- 삼국지2 세이브 에디트 시작 ---") # 1. 장수 '주민' 능력치 수정 (77, 63, 100 -> 100, 100, 100) target_jumin = b'\xC1\xD6\xB9\xCE' # '주민' 이름의 EUC-KR 헥스값 offset_jumin = data.find(target_jumin) if offset_jumin != -1: # 0x4D(77), 0x3F(63), 0x64(100) 찾기 patched = False for i in range(offset_jumin - 30, offset_jumin): if data[i] == 0x4D and data[i+1] == 0x3F and data[i+2] == 0x64: data[i] = 0x64 data[i+1] = 0x64 data[i+2] = 0x64 print("[성공] 주민의 능력치를 100, 100, 100으로 수정했습니다.") patched = True break if not patched: print("[실패] 주민의 능력치(77, 63, 100) 배열을 찾지 못했습니다.") else: print("[실패] 주민의 데이터를 찾을 수 없습니다.") # 2. 장수 '전혜' 능력치 수정 (66, 85, 75 -> 100, 100, 100) target_jeonhye = b'\xC0\xFC\xC7\xFD' # '전혜' 이름의 EUC-KR 헥스값 offset_jeonhye = data.find(target_jeonhye) if offset_jeonhye != -1: # 0x42(66), 0x55(85), 0x4B(75) 찾기 patched = False for i in range(offset_jeonhye - 30, offset_jeonhye): if data[i] == 0x42 and data[i+1] == 0x55 and data[i+2] == 0x4B: data[i] = 0x64 data[i+1] = 0x64 data[i+2] = 0x64 print("[성공] 전혜의 능력치를 100, 100, 100으로 수정했습니다.") patched = True break if not patched: print("[실패] 전혜의 능력치(66, 85, 75) 배열을 찾지 못했습니다.") else: print("[실패] 전혜의 데이터를 찾을 수 없습니다.") # 3. 군주 '주민' 신임도 수정 (45 -> 100) # 다른 군주들은 50(0x32)인데 주민만 45(0x2D)인 점을 이용해 완벽히 저격합니다. ff_blocks = [] for i in range(len(data) - 4): if data[i:i+5] == b'\xFF\xFF\xFF\xFF\xFF': if not ff_blocks or i > ff_blocks[-1] + 5: ff_blocks.append(i) if len(ff_blocks) >= 2: # 세력 데이터가 모여있는 첫 FF 블록과 마지막 FF 블록 사이 구간을 설정 search_start = ff_blocks[0] search_end = ff_blocks[-1] # 해당 구간에서 45(0x2D)인 값을 모두 찾음 found_2d = [] for i in range(search_start, search_end): if data[i] == 0x2D: found_2d.append(i) if len(found_2d) == 1: # 45가 단 하나뿐이라면 100% 신임도입니다. data[found_2d[0]] = 0x64 print(f"[성공] 군주 주민의 신임도(45->100)를 정확히 적용했습니다! (번지: {hex(found_2d[0])})") elif len(found_2d) > 1: # 45가 여러 개 발견될 경우, 주변에 다른 군주들의 신임도인 50(0x32)이 있는 값을 진짜 신임도로 확정 patched = False for idx in found_2d: nearby = data[max(0, idx-15) : min(len(data), idx+15)] if 0x32 in nearby: data[idx] = 0x64 print(f"[성공] 군주 주민의 신임도(45->100)를 안전하게 적용했습니다! (번지: {hex(idx)})") patched = True break if not patched: print("[실패] 45(0x2D)를 찾았으나 다른 군주 신임도(50)와 연관성을 찾지 못해 안전을 위해 수정하지 않았습니다.") else: print("[실패] 세력 블록 내에서 주민의 신임도 45(0x2D)를 찾지 못했습니다.") else: print("[실패] 세력 데이터 구분자(FF FF FF FF FF)를 충분히 찾지 못했습니다.") # 파일 저장 with open(file_name, "wb") as f: f.write(data) print("--- 패치 작업 종료 ---")
rtk2 에디터 만드는 코드
file_name = "1"
if not os.path.exists(file_name): print(f"파일을 찾을 수 없습니다: '{file_name}'")else: with open(file_name, "rb") as f: data = bytearray(f.read()) print("--- 삼국지2 세이브 에디트 시작 ---")
# 1. 장수 '주민' 능력치 수정 (77, 63, 100 -> 100, 100, 100) target_jumin = b'\xC1\xD6\xB9\xCE' # '주민' 이름의 EUC-KR 헥스값 offset_jumin = data.find(target_jumin) if offset_jumin != -1: # 0x4D(77), 0x3F(63), 0x64(100) 찾기 patched = False for i in range(offset_jumin - 30, offset_jumin): if data[i] == 0x4D and data[i+1] == 0x3F and data[i+2] == 0x64: data[i] = 0x64 data[i+1] = 0x64 data[i+2] = 0x64 print("[성공] 주민의 능력치를 100, 100, 100으로 수정했습니다.") patched = True break if not patched: print("[실패] 주민의 능력치(77, 63, 100) 배열을 찾지 못했습니다.") else: print("[실패] 주민의 데이터를 찾을 수 없습니다.")
# 2. 장수 '전혜' 능력치 수정 (66, 85, 75 -> 100, 100, 100) target_jeonhye = b'\xC0\xFC\xC7\xFD' # '전혜' 이름의 EUC-KR 헥스값 offset_jeonhye = data.find(target_jeonhye) if offset_jeonhye != -1: # 0x42(66), 0x55(85), 0x4B(75) 찾기 patched = False for i in range(offset_jeonhye - 30, offset_jeonhye): if data[i] == 0x42 and data[i+1] == 0x55 and data[i+2] == 0x4B: data[i] = 0x64 data[i+1] = 0x64 data[i+2] = 0x64 print("[성공] 전혜의 능력치를 100, 100, 100으로 수정했습니다.") patched = True break if not patched: print("[실패] 전혜의 능력치(66, 85, 75) 배열을 찾지 못했습니다.") else: print("[실패] 전혜의 데이터를 찾을 수 없습니다.")
# 3. 군주 '주민' 신임도 수정 (45 -> 100) # 다른 군주들은 50(0x32)인데 주민만 45(0x2D)인 점을 이용해 완벽히 저격합니다. ff_blocks = [] for i in range(len(data) - 4): if data[i:i+5] == b'\xFF\xFF\xFF\xFF\xFF': if not ff_blocks or i > ff_blocks[-1] + 5: ff_blocks.append(i)
if len(ff_blocks) >= 2: # 세력 데이터가 모여있는 첫 FF 블록과 마지막 FF 블록 사이 구간을 설정 search_start = ff_blocks[0] search_end = ff_blocks[-1] # 해당 구간에서 45(0x2D)인 값을 모두 찾음 found_2d = [] for i in range(search_start, search_end): if data[i] == 0x2D: found_2d.append(i) if len(found_2d) == 1: # 45가 단 하나뿐이라면 100% 신임도입니다. data[found_2d[0]] = 0x64 print(f"[성공] 군주 주민의 신임도(45->100)를 정확히 적용했습니다! (번지: {hex(found_2d[0])})") elif len(found_2d) > 1: # 45가 여러 개 발견될 경우, 주변에 다른 군주들의 신임도인 50(0x32)이 있는 값을 진짜 신임도로 확정 patched = False for idx in found_2d: nearby = data[max(0, idx-15) : min(len(data), idx+15)] if 0x32 in nearby: data[idx] = 0x64 print(f"[성공] 군주 주민의 신임도(45->100)를 안전하게 적용했습니다! (번지: {hex(idx)})") patched = True break if not patched: print("[실패] 45(0x2D)를 찾았으나 다른 군주 신임도(50)와 연관성을 찾지 못해 안전을 위해 수정하지 않았습니다.") else: print("[실패] 세력 블록 내에서 주민의 신임도 45(0x2D)를 찾지 못했습니다.") else: print("[실패] 세력 데이터 구분자(FF FF FF FF FF)를 충분히 찾지 못했습니다.")
# 파일 저장 with open(file_name, "wb") as f: f.write(data) print("--- 패치 작업 종료 ---")