90 lines
2.9 KiB
Python
90 lines
2.9 KiB
Python
from ..backgroundEditor import BackgroundEditor
|
|
import subprocess
|
|
import binascii
|
|
|
|
|
|
CHAR_MAP = {'z': 0x3E, '-': 0x3F, '.': 0x39, ':': 0x42, '?': 0x3C, '!': 0x3D}
|
|
|
|
|
|
def _encode(s):
|
|
result = bytearray()
|
|
for char in s:
|
|
if ord("A") <= ord(char) <= ord("Z"):
|
|
result.append(ord(char) - ord("A"))
|
|
elif ord("a") <= ord(char) <= ord("y"):
|
|
result.append(ord(char) - ord("a") + 26)
|
|
elif ord("0") <= ord(char) <= ord("9"):
|
|
result.append(ord(char) - ord("0") + 0x70)
|
|
else:
|
|
result.append(CHAR_MAP.get(char, 0x7E))
|
|
return result
|
|
|
|
|
|
def setRomInfo(rom, seed, settings, player_name, player_id):
|
|
#try:
|
|
# version = subprocess.run(['git', 'describe', '--tags', '--dirty=-D'], stdout=subprocess.PIPE).stdout.strip().decode("ascii", "replace")
|
|
#except:
|
|
# version = ""
|
|
|
|
try:
|
|
seednr = int(seed, 16)
|
|
except:
|
|
import hashlib
|
|
seednr = int(hashlib.md5(seed.encode('ascii', 'replace')).hexdigest(), 16)
|
|
|
|
if settings.race:
|
|
seed = "Race"
|
|
if isinstance(settings.race, str):
|
|
seed += " " + settings.race
|
|
rom.patch(0x00, 0x07, "00", "01")
|
|
else:
|
|
rom.patch(0x00, 0x07, "00", "52")
|
|
|
|
line_1_hex = _encode(seed)
|
|
#line_2_hex = _encode(seed[16:])
|
|
BASE_DRAWING_AREA = 0x98a0
|
|
LINE_WIDTH = 0x20
|
|
player_id_text = f"Player {player_id}:"
|
|
for n in (3, 4):
|
|
be = BackgroundEditor(rom, n)
|
|
ba = BackgroundEditor(rom, n, attributes=True)
|
|
|
|
for n, v in enumerate(_encode(player_id_text)):
|
|
be.tiles[BASE_DRAWING_AREA + LINE_WIDTH * 5 + 2 + n] = v
|
|
ba.tiles[BASE_DRAWING_AREA + LINE_WIDTH * 5 + 2 + n] = 0x00
|
|
for n, v in enumerate(_encode(player_name)):
|
|
be.tiles[BASE_DRAWING_AREA + LINE_WIDTH * 6 + 0x13 - len(player_name) + n] = v
|
|
ba.tiles[BASE_DRAWING_AREA + LINE_WIDTH * 6 + 0x13 - len(player_name) + n] = 0x00
|
|
for n, v in enumerate(line_1_hex):
|
|
be.tiles[0x9a20 + n] = v
|
|
ba.tiles[0x9a20 + n] = 0x00
|
|
|
|
for n in range(0x09, 0x14):
|
|
be.tiles[0x9820 + n] = 0x7F
|
|
be.tiles[0x9840 + n] = 0xA0 + (n % 2)
|
|
be.tiles[0x9860 + n] = 0xA2
|
|
sn = seednr
|
|
for n in range(0x0A, 0x14):
|
|
tilenr = sn % 30
|
|
sn //= 30
|
|
if tilenr > 12:
|
|
tilenr += 2
|
|
if tilenr > 16:
|
|
tilenr += 1
|
|
if tilenr > 19:
|
|
tilenr += 3
|
|
if tilenr > 27:
|
|
tilenr += 1
|
|
if tilenr > 29:
|
|
tilenr += 2
|
|
if tilenr > 35:
|
|
tilenr += 1
|
|
be.tiles[0x9800 + n] = tilenr * 2
|
|
be.tiles[0x9820 + n] = tilenr * 2 + 1
|
|
pal = sn % 8
|
|
sn //= 8
|
|
ba.tiles[0x9800 + n] = 0x08 | pal
|
|
ba.tiles[0x9820 + n] = 0x08 | pal
|
|
be.store(rom)
|
|
ba.store(rom)
|