diff --git a/src/mars_patcher/constants/credits.py b/src/mars_patcher/constants/credits.py new file mode 100644 index 0000000..ce6a97d --- /dev/null +++ b/src/mars_patcher/constants/credits.py @@ -0,0 +1,43 @@ +from enum import Enum + + +class LineType(Enum): + BLANK = 0 + BLUE = 1 + RED = 2 + WHITE1 = 3 + WHITE2 = 4 + COPYRIGHT1 = 5 + COPYRIGHT2 = 6 + COPYRIGHT3 = 7 + COPYRIGHT4 = 8 + END = 9 + + +LINE_TYPE_VALS = { + LineType.BLANK: 0x5, + LineType.BLUE: 0x0, + LineType.RED: 0x1, + LineType.WHITE1: 0x3, + LineType.WHITE2: 0x2, + LineType.COPYRIGHT1: 0xA, + LineType.COPYRIGHT2: 0xB, + LineType.COPYRIGHT3: 0xC, + LineType.COPYRIGHT4: 0xD, + LineType.END: 0x6, +} + +LINE_TYPE_HEIGHTS = { + LineType.BLANK: 1, + LineType.BLUE: 1, + LineType.RED: 1, + LineType.WHITE1: 1, + LineType.WHITE2: 2, + LineType.COPYRIGHT1: 1, + LineType.COPYRIGHT2: 1, + LineType.COPYRIGHT3: 1, + LineType.COPYRIGHT4: 1, + LineType.END: 0, +} + +TEXT_LINE_TYPES = {LineType.BLUE, LineType.RED, LineType.WHITE1, LineType.WHITE2} diff --git a/src/mars_patcher/credits.py b/src/mars_patcher/credits.py index 6c6f460..bd79d58 100644 --- a/src/mars_patcher/credits.py +++ b/src/mars_patcher/credits.py @@ -1,17 +1,12 @@ -from mars_patcher.mf.auto_generated_types import MarsschemamfCreditstextItem -from mars_patcher.mf.constants.credits_lines import ( - FUSION_STAFF_LINES, +from mars_patcher.constants.credits import ( LINE_TYPE_HEIGHTS, LINE_TYPE_VALS, - MARS_CREDITS, - RDV_CREDITS, TEXT_LINE_TYPES, LineType, ) +from mars_patcher.mf.auto_generated_types import MarsschemamfCreditstextItem from mars_patcher.rom import Rom -CREDITS_ADDR = 0x74B0B0 -CREDITS_LEN = 0x2B98 FULL_LINE_LEN = 36 LINE_WIDTH = 30 @@ -46,26 +41,10 @@ def from_json(cls, data: MarsschemamfCreditstextItem) -> "CreditsLine": return CreditsLine(line_type, blank_lines, text, centered) -def write_credits(rom: Rom, data: list[MarsschemamfCreditstextItem]) -> None: - writer = CreditsWriter(rom) - # Write MARS credits - lines = [CreditsLine(*line) for line in MARS_CREDITS] - writer.write_lines(lines) - # Write RDV credits - lines = [CreditsLine(*line) for line in RDV_CREDITS] - writer.write_lines(lines) - # Write custom credits - lines = [CreditsLine.from_json(d) for d in data] - writer.write_lines(lines) - # Write fusion staff credits - lines = [CreditsLine(*line) for line in FUSION_STAFF_LINES] - writer.write_lines(lines) - - class CreditsWriter: - def __init__(self, rom: Rom): + def __init__(self, rom: Rom, addr: int): self.rom = rom - self.addr = CREDITS_ADDR + self.addr = addr self.num_lines = 0 def write_lines(self, lines: list[CreditsLine]) -> None: diff --git a/src/mars_patcher/mf/constants/credits_lines.py b/src/mars_patcher/mf/constants/credits_lines.py index 85a8cf2..4380eb5 100644 --- a/src/mars_patcher/mf/constants/credits_lines.py +++ b/src/mars_patcher/mf/constants/credits_lines.py @@ -1,46 +1,4 @@ -from enum import Enum - - -class LineType(Enum): - BLANK = 0 - BLUE = 1 - RED = 2 - WHITE1 = 3 - WHITE2 = 4 - COPYRIGHT1 = 5 - COPYRIGHT2 = 6 - COPYRIGHT3 = 7 - COPYRIGHT4 = 8 - END = 9 - - -LINE_TYPE_VALS = { - LineType.BLANK: 0x5, - LineType.BLUE: 0x0, - LineType.RED: 0x1, - LineType.WHITE1: 0x3, - LineType.WHITE2: 0x2, - LineType.COPYRIGHT1: 0xA, - LineType.COPYRIGHT2: 0xB, - LineType.COPYRIGHT3: 0xC, - LineType.COPYRIGHT4: 0xD, - LineType.END: 0x6, -} - -LINE_TYPE_HEIGHTS = { - LineType.BLANK: 1, - LineType.BLUE: 1, - LineType.RED: 1, - LineType.WHITE1: 1, - LineType.WHITE2: 2, - LineType.COPYRIGHT1: 1, - LineType.COPYRIGHT2: 1, - LineType.COPYRIGHT3: 1, - LineType.COPYRIGHT4: 1, - LineType.END: 0, -} - -TEXT_LINE_TYPES = {LineType.BLUE, LineType.RED, LineType.WHITE1, LineType.WHITE2} +from mars_patcher.constants.credits import LineType MARS_CREDITS = [ (LineType.WHITE2, 4, "MARS Development"), diff --git a/src/mars_patcher/mf/credits.py b/src/mars_patcher/mf/credits.py new file mode 100644 index 0000000..cea23f0 --- /dev/null +++ b/src/mars_patcher/mf/credits.py @@ -0,0 +1,30 @@ +from mars_patcher.credits import CreditsLine, CreditsWriter +from mars_patcher.mf.auto_generated_types import MarsschemamfCreditstextItem +from mars_patcher.mf.constants.credits_lines import ( + FUSION_STAFF_LINES, + MARS_CREDITS, + RDV_CREDITS, +) +from mars_patcher.rom import Rom + +CREDITS_ADDR = 0x74B0B0 +CREDITS_LEN = 0x2B98 + + +def write_credits(rom: Rom, data: list[MarsschemamfCreditstextItem]) -> None: + writer = CreditsWriter(rom, CREDITS_ADDR) + # Write MARS credits + lines = [CreditsLine(*line) for line in MARS_CREDITS] + writer.write_lines(lines) + # Write RDV credits + lines = [CreditsLine(*line) for line in RDV_CREDITS] + writer.write_lines(lines) + # Write custom credits + lines = [CreditsLine.from_json(d) for d in data] + writer.write_lines(lines) + # Write fusion staff credits + lines = [CreditsLine(*line) for line in FUSION_STAFF_LINES] + writer.write_lines(lines) + # Verify that credits don't exceed existing space + if writer.addr > CREDITS_ADDR + CREDITS_LEN: + raise ValueError("Credits exceeded existing space") diff --git a/src/mars_patcher/mf/patcher.py b/src/mars_patcher/mf/patcher.py index 19a2816..9234dec 100644 --- a/src/mars_patcher/mf/patcher.py +++ b/src/mars_patcher/mf/patcher.py @@ -1,10 +1,10 @@ from collections.abc import Callable from os import PathLike -from mars_patcher.credits import write_credits from mars_patcher.level_edits import apply_level_edits from mars_patcher.mf.auto_generated_types import MarsSchemaMF from mars_patcher.mf.connections import Connections +from mars_patcher.mf.credits import write_credits from mars_patcher.mf.door_locks import set_door_locks from mars_patcher.mf.item_patcher import ( ItemPatcher,