checksums for ntsc 1.2 JP and US, accept both as baserom (#2030)

This commit is contained in:
Dragorn421 2024-08-15 00:53:39 +02:00 committed by GitHub
parent eaf955ad22
commit c8ec6042e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 37 additions and 14 deletions

View File

@ -27,7 +27,7 @@ COMPILER ?= ido
# gc-eu-mq GameCube Europe/PAL Master Quest
# gc-eu-mq-dbg GameCube Europe/PAL Master Quest Debug (default)
# The following versions are work-in-progress and not yet matching:
# ntsc-1.2 N64 NTSC 1.2 (Japan)
# ntsc-1.2 N64 NTSC 1.2 (Japan/US depending on REGION)
VERSION ?= gc-eu-mq-dbg
# Number of threads to extract and compress with
N_THREADS ?= $(shell nproc)
@ -45,8 +45,10 @@ CFLAGS ?=
CPPFLAGS ?=
CPP_DEFINES ?=
REGIONAL_CHECKSUM := 0
# Version-specific settings
ifeq ($(VERSION),ntsc-1.2)
REGIONAL_CHECKSUM := 1
REGION ?= JP
PLATFORM := N64
PAL := 0
@ -470,13 +472,21 @@ all: rom compress
rom: $(ROM)
ifneq ($(COMPARE),0)
@md5sum $(ROM)
ifneq ($(REGIONAL_CHECKSUM),0)
@md5sum -c $(BASEROM_DIR)/checksum-$(REGION).md5
else
@md5sum -c $(BASEROM_DIR)/checksum.md5
endif
endif
compress: $(ROMC)
ifneq ($(COMPARE),0)
@md5sum $(ROMC)
ifneq ($(REGIONAL_CHECKSUM),0)
@md5sum -c $(BASEROM_DIR)/checksum-$(REGION)-compressed.md5
else
@md5sum -c $(BASEROM_DIR)/checksum-compressed.md5
endif
endif
clean:

View File

@ -0,0 +1 @@
57a9719ad547c516342e1a15d5c28c3d build/ntsc-1.2/oot-ntsc-1.2-compressed.z64

View File

@ -0,0 +1 @@
12fcafeba93992facaf65c2ba00f3089 build/ntsc-1.2/oot-ntsc-1.2.z64

View File

@ -1,3 +1,6 @@
checksums:
- checksum-JP
- checksum-US
dmadata_start: 0x7960
text_lang_pal: false
incbins:

View File

@ -10,6 +10,7 @@ import hashlib
import io
from pathlib import Path
import struct
from typing import Iterable
import crunch64
import ipl3checksum
@ -101,10 +102,10 @@ def get_str_hash(byte_array):
return str(hashlib.md5(byte_array).hexdigest())
def check_existing_rom(rom_path: Path, correct_str_hash: str):
def check_existing_rom(rom_path: Path, correct_str_hashes: Iterable[str]):
# If the baserom exists and is correct, we don't need to change anything
if rom_path.exists():
if get_str_hash(rom_path.read_bytes()) == correct_str_hash:
if get_str_hash(rom_path.read_bytes()) in correct_str_hashes:
return True
return False
@ -176,12 +177,17 @@ def main():
config = version_config.load_version_config(version)
dmadata_start = config.dmadata_start
compressed_str_hash = (
(baserom_dir / "checksum-compressed.md5").read_text().split()[0]
)
decompressed_str_hash = (baserom_dir / "checksum.md5").read_text().split()[0]
compressed_str_hashes = []
decompressed_str_hashes = []
for checksum_stem in config.checksums:
compressed_str_hashes.append(
(baserom_dir / f"{checksum_stem}-compressed.md5").read_text().split()[0]
)
decompressed_str_hashes.append(
(baserom_dir / f"{checksum_stem}.md5").read_text().split()[0]
)
if check_existing_rom(uncompressed_path, decompressed_str_hash):
if check_existing_rom(uncompressed_path, decompressed_str_hashes):
print("Found valid baserom - exiting early")
return
@ -220,12 +226,12 @@ def main():
# Check to see if the ROM is a "vanilla" ROM
str_hash = get_str_hash(file_content)
if version == "gc-eu-mq-dbg":
correct_str_hash = decompressed_str_hash
correct_str_hashes = decompressed_str_hashes
else:
correct_str_hash = compressed_str_hash
if str_hash != correct_str_hash:
correct_str_hashes = compressed_str_hashes
if str_hash not in correct_str_hashes:
print(
f"Error: Expected a hash of {correct_str_hash} but got {str_hash}. The baserom has probably been tampered, find a new one"
f"Error: Expected a hash of {' or '.join(correct_str_hashes)} but got {str_hash}. The baserom has probably been tampered, find a new one"
)
if version == "gc-eu-mq-dbg":
@ -247,9 +253,9 @@ def main():
# Double check the hash
str_hash = get_str_hash(file_content)
if str_hash != decompressed_str_hash:
if str_hash not in decompressed_str_hashes:
print(
f"Error: Expected a hash of {decompressed_str_hash} after decompression but got {str_hash}!"
f"Error: Expected a hash of {' or '.join(decompressed_str_hashes)} after decompression but got {str_hash}!"
)
exit(1)

View File

@ -20,6 +20,7 @@ PROJECT_ROOT = Path(__file__).parent.parent
class VersionConfig:
# Version name
version: str
checksums: list[str]
# ROM offset to start of DMA table
dmadata_start: int
# Whether the languages are PAL (EN/DE/FR) or not (JP/EN)
@ -89,6 +90,7 @@ def load_version_config(version: str) -> VersionConfig:
return VersionConfig(
version=version,
checksums=config.get("checksums", ["checksum"]),
dmadata_start=config["dmadata_start"],
text_lang_pal=config["text_lang_pal"],
dmadata_segments=load_dmadata_segments(version),