mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00

* SoE: new file naming also fixes test base deprecation * SoE: use options_dataclass * SoE: moar typing * SoE: no more multiworld.random * SoE: replace LogicMixin by SoEPlayerLogic object * SoE: add test that rocket parts always exist * SoE: Even moar typing * SoE: can haz apworld now * SoE: pep up test naming * SoE: use self.options for trap chances * SoE: remove unused import with outdated comment * SoE: move flag and trap extraction to dataclass as suggested by beauxq * SoE: test trap option parsing and item generation
45 lines
1.1 KiB
Python
45 lines
1.1 KiB
Python
import os
|
|
from typing import BinaryIO, Optional
|
|
|
|
import Utils
|
|
from worlds.Files import APDeltaPatch
|
|
|
|
|
|
USHASH = '6e9c94511d04fac6e0a1e582c170be3a'
|
|
|
|
|
|
class SoEDeltaPatch(APDeltaPatch):
|
|
hash = USHASH
|
|
game = "Secret of Evermore"
|
|
patch_file_ending = ".apsoe"
|
|
|
|
@classmethod
|
|
def get_source_data(cls) -> bytes:
|
|
with open(get_base_rom_path(), "rb") as stream:
|
|
return read_rom(stream)
|
|
|
|
|
|
def get_base_rom_path(file_name: Optional[str] = None) -> str:
|
|
options = Utils.get_options()
|
|
if not file_name:
|
|
file_name = options["soe_options"]["rom_file"]
|
|
if not file_name:
|
|
raise ValueError("Missing soe_options -> rom_file from host.yaml")
|
|
if not os.path.exists(file_name):
|
|
file_name = Utils.user_path(file_name)
|
|
return file_name
|
|
|
|
|
|
def read_rom(stream: BinaryIO, strip_header: bool=True) -> bytes:
|
|
"""Reads rom into bytearray and optionally strips off any smc header"""
|
|
data = stream.read()
|
|
if strip_header and len(data) % 0x400 == 0x200:
|
|
return data[0x200:]
|
|
return data
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
print('Please use ../../patch.py', file=sys.stderr)
|
|
sys.exit(1)
|