Merge remote-tracking branch 'origin/master'

This commit is contained in:
Fabian Dill 2020-10-20 20:35:43 +02:00
commit 1d2d17537a
3 changed files with 31 additions and 10 deletions

View File

@ -188,7 +188,7 @@ def main(args, seed=None):
patch_enemizer(world, player, rom, args.enemizercli) patch_enemizer(world, player, rom, args.enemizercli)
if args.race: if args.race:
patch_race_rom(rom) patch_race_rom(rom, world, player)
world.spoiler.hashes[(player, team)] = get_hash_string(rom.hash) world.spoiler.hashes[(player, team)] = get_hash_string(rom.hash)

36
Rom.py
View File

@ -11,6 +11,7 @@ import struct
import sys import sys
import subprocess import subprocess
import threading import threading
import xxtea
import concurrent.futures import concurrent.futures
from typing import Optional from typing import Optional
@ -58,6 +59,31 @@ class LocalRom(object):
def write_bytes(self, startaddress: int, values): def write_bytes(self, startaddress: int, values):
self.buffer[startaddress:startaddress + len(values)] = values self.buffer[startaddress:startaddress + len(values)] = values
def encrypt_range(self, startaddress: int, length: int, key: bytes):
for i in range(0, length, 8):
data = bytes(self.read_bytes(startaddress + i, 8))
data = xxtea.encrypt(data, key, padding=False)
self.write_bytes(startaddress + i, bytearray(data))
def encrypt(self, world, player):
local_random = world.rom_seeds[player]
key = bytes(local_random.getrandbits(8 * 16).to_bytes(16, 'big'))
self.write_bytes(0x1800B0, bytearray(key))
self.write_int16(0x180087, 1)
itemtable = []
locationtable = []
for i in range(168):
itemtable.append(self.read_byte(0xE96E + (i * 3)))
locationtable.append(self.read_byte(0xe96C + (i * 3)))
locationtable.append(self.read_byte(0xe96D + (i * 3)))
self.write_bytes(0xE96C, locationtable)
self.write_bytes(0xE96C + 0x150, itemtable)
self.encrypt_range(0xE96C + 0x150, 168, key)
self.encrypt_range(0x180000, 32, key)
self.encrypt_range(0x180140, 32, key)
def write_to_file(self, file, hide_enemizer=False): def write_to_file(self, file, hide_enemizer=False):
with open(file, 'wb') as outfile: with open(file, 'wb') as outfile:
outfile.write(self.buffer) outfile.write(self.buffer)
@ -1422,16 +1448,10 @@ def patch_rom(world, rom, player, team, enemized):
return rom return rom
try:
import RaceRom
except ImportError:
RaceRom = None
def patch_race_rom(rom): def patch_race_rom(rom, world, player):
rom.write_bytes(0x180213, [0x01, 0x00]) # Tournament Seed rom.write_bytes(0x180213, [0x01, 0x00]) # Tournament Seed
rom.encrypt(world, player)
if 'RaceRom' in sys.modules:
RaceRom.encrypt(rom)
def write_custom_shops(rom, world, player): def write_custom_shops(rom, world, player):
shops = [shop for shop in world.shops if shop.custom and shop.region.player == player] shops = [shop for shop in world.shops if shop.custom and shop.region.player == player]

View File

@ -6,3 +6,4 @@ bsdiff4>=1.2.0
prompt_toolkit>=3.0.6 prompt_toolkit>=3.0.6
appdirs>=1.4.4 appdirs>=1.4.4
maseya-z3pr>=1.0.0rc1 maseya-z3pr>=1.0.0rc1
xxtea>=2.0.0