Files
dockipelago/worlds/dk64/randomizer/Patching/ASMPatcher.py
Jonathan Tinney 7971961166
Some checks failed
Analyze modified files / flake8 (push) Failing after 2m28s
Build / build-win (push) Has been cancelled
Build / build-ubuntu2204 (push) Has been cancelled
ctest / Test C++ ubuntu-latest (push) Has been cancelled
ctest / Test C++ windows-latest (push) Has been cancelled
Analyze modified files / mypy (push) Has been cancelled
Build and Publish Docker Images / Push Docker image to Docker Hub (push) Successful in 5m4s
Native Code Static Analysis / scan-build (push) Failing after 5m2s
type check / pyright (push) Successful in 1m7s
unittests / Test Python 3.11.2 ubuntu-latest (push) Failing after 16m23s
unittests / Test Python 3.12 ubuntu-latest (push) Failing after 28m19s
unittests / Test Python 3.13 ubuntu-latest (push) Failing after 14m49s
unittests / Test hosting with 3.13 on ubuntu-latest (push) Successful in 5m0s
unittests / Test Python 3.13 macos-latest (push) Has been cancelled
unittests / Test Python 3.11 windows-latest (push) Has been cancelled
unittests / Test Python 3.13 windows-latest (push) Has been cancelled
add schedule I, sonic 1/frontiers/heroes, spirit island
2026-04-02 23:46:36 -07:00

3126 lines
193 KiB
Python

"""Patches assembly instructions from the overlays rather than doing changes live."""
import js
import math
import io
import randomizer.ItemPool as ItemPool
from typing import Union
from randomizer.Patching.Library.Generic import Overlay, IsItemSelected, compatible_background_textures, CustomActors, MenuTextDim, Holidays, getHoliday, getHolidaySetting
from randomizer.Patching.Library.Image import getImageFile, TextureFormat, getRandomHueShift, ExtraTextures, getBonusSkinOffset, hueShiftImageFromAddress
from randomizer.Patching.Library.ASM import *
from randomizer.Settings import Settings
from randomizer.Enums.Settings import (
FasterChecksSelected,
RemovedBarriersSelected,
GalleonWaterSetting,
ActivateAllBananaports,
FreeTradeSetting,
HardModeSelected,
HardBossesSelected,
FungiTimeSetting,
MiscChangesSelected,
ColorblindMode,
DamageAmount,
RandomModels,
PuzzleRando,
WinConditionComplex,
ExtraCutsceneSkips,
ExcludedSongs,
ProgressiveHintItem,
WrinklyHints,
)
from randomizer.Patching.MiscSetupChanges import SpeedUpFungiRabbit
from randomizer.Enums.Maps import Maps
from randomizer.Enums.Levels import Levels
from randomizer.Lists.MapsAndExits import GetExitId, GetMapId
from randomizer.Enums.Models import Model, Sprite
from randomizer.Patching.Patcher import ROM, LocalROM
from randomizer.Enums.Settings import ShuffleLoadingZones
from randomizer.Enums.Types import Types
from randomizer.Enums.Transitions import Transitions
from randomizer.Enums.Items import Items
from PIL import Image
KEY_FLAG_ADDRESSES = [
0x800258FA,
0x8002C136,
0x80035676,
0x8002A0C2,
0x8002B3F6,
0x80025C4E,
0x800327EE,
]
REGULAR_BOSS_MAPS = [
Maps.JapesBoss,
Maps.AztecBoss,
Maps.FactoryBoss,
Maps.GalleonBoss,
Maps.FungiBoss,
Maps.CavesBoss,
Maps.CastleBoss,
]
NORMAL_KEY_FLAGS = [
0x1A, # Key 1
0x4A, # Key 2
0x8A, # Key 3
0xA8, # Key 4
0xEC, # Key 5
0x124, # Key 6
0x13D, # Key 7
0x17C, # Key 8
]
ENABLE_ALL_KONG_TRANSFORMS = False
ENABLE_HITSCAN = False
DISABLE_BORDERS = False
ENABLE_MINIGAME_SPRITE_RANDO = False
ENABLE_HELM_GBS = True
ENABLE_BLAST_LZR = False
POP_TARGETTING = True
UNSHROUDED_CASTLE = False
FARPLANE_VIEW = False
KLAPTRAPS_IN_SEARCHLIGHT_SEEK = 1
FAIRY_LOAD_FIX = True
CAMERA_RESET_REDUCTION = True
PAL_DOGADON_REMATCH_FIRE = True
REMOVE_CS_BARS = False
GREATER_CAMERA_CONTROL = True
JP_TEXTBOX_SIZES = True
FRAMEBUFFER_STORE_FIX = True
BLOCK_FILE_DELETION_ON_CHECKSUM_MISMATCH = False
WARPS_JAPES = [
0x20, # FLAG_WARP_JAPES_W1_PORTAL,
0x21, # FLAG_WARP_JAPES_W1_FAR,
0x22, # FLAG_WARP_JAPES_W2_HIGH,
0x23, # FLAG_WARP_JAPES_W2_LOW,
0x24, # FLAG_WARP_JAPES_W3_RIGHT,
0x25, # FLAG_WARP_JAPES_W3_LEFT,
0x28, # FLAG_WARP_JAPES_W4_CLOSE,
0x29, # FLAG_WARP_JAPES_W4_CRANKY,
0x26, # FLAG_WARP_JAPES_W5_SHELLHIVE,
0x27, # FLAG_WARP_JAPES_W5_TOP,
]
WARPS_AZTEC = [
0x4F, # FLAG_WARP_AZTEC_W1_PORTAL,
0x50, # FLAG_WARP_AZTEC_W1_CANDY,
0x51, # FLAG_WARP_AZTEC_W2_TEMPLE,
0x52, # FLAG_WARP_AZTEC_W2_TOTEM,
0x53, # FLAG_WARP_AZTEC_W3_CRANKY,
0x54, # FLAG_WARP_AZTEC_W3_TOTEM,
0x55, # FLAG_WARP_AZTEC_W4_TOTEM,
0x56, # FLAG_WARP_AZTEC_W4_FUNKY,
0x57, # FLAG_WARP_AZTEC_W5_TOTEM,
0x2F5, # AZTEC_SNOOPW5, # Custom Flag
0x58, # FLAG_WARP_LLAMA_W1_HIGH,
0x59, # FLAG_WARP_LLAMA_W1_LOW,
0x5A, # FLAG_WARP_LLAMA_W2_FAR,
0x5B, # FLAG_WARP_LLAMA_W2_LOW,
]
WARPS_FACTORY = [
0x8D, # FLAG_WARP_FACTORY_W1_FOYER,
0x8E, # FLAG_WARP_FACTORY_W1_STORAGE,
0x8F, # FLAG_WARP_FACTORY_W2_FOYER,
0x90, # FLAG_WARP_FACTORY_W2_RND,
0x91, # FLAG_WARP_FACTORY_W3_FOYER,
0x92, # FLAG_WARP_FACTORY_W3_SNIDE,
0x93, # FLAG_WARP_FACTORY_W4_TOP,
0x94, # FLAG_WARP_FACTORY_W4_BOTTOM,
0x95, # FLAG_WARP_FACTORY_W5_FUNKY,
0x96, # FLAG_WARP_FACTORY_W5_ARCADE,
]
WARPS_GALLEON = [
0xB1, # FLAG_WARP_GALLEON_W1_LIGHTHOUSE,
0xB2, # FLAG_WARP_GALLEON_W1_CRANKY,
0xAB, # FLAG_WARP_GALLEON_W2_2DS,
0xAC, # FLAG_WARP_GALLEON_W2_CRANKY,
0xAD, # FLAG_WARP_GALLEON_W3_SNIDE,
0xAE, # FLAG_WARP_GALLEON_W3_CRANKY,
0xAF, # FLAG_WARP_GALLEON_W4_SEAL,
0x2F6, # GALLEON_TOWERW4, # Activating the gold tower warp despawns Diddy's GB
0xA9, # FLAG_WARP_GALLEON_W5_5DS,
0xAA, # FLAG_WARP_GALLEON_W5_LIGHTHOUSE,
]
WARPS_FUNGI = [
0xED, # FLAG_WARP_FUNGI_W1_MILL,
0xEE, # FLAG_WARP_FUNGI_W1_CLOCK,
0xEF, # FLAG_WARP_FUNGI_W2_CLOCK,
0xF0, # FLAG_WARP_FUNGI_W2_FUNKY,
0xF1, # FLAG_WARP_FUNGI_W3_CLOCK,
0xF2, # FLAG_WARP_FUNGI_W3_MUSH,
0xF3, # FLAG_WARP_FUNGI_W4_CLOCK,
0xF4, # FLAG_WARP_FUNGI_W4_OWL,
0xF5, # FLAG_WARP_FUNGI_W5_LOW,
0xF6, # FLAG_WARP_FUNGI_W5_HIGH,
]
WARPS_CAVES = [
0x11B, # FLAG_WARP_CAVES_W1_5DI,
0x11C, # FLAG_WARP_CAVES_W1_PORTAL,
0x11D, # FLAG_WARP_CAVES_W2_PORTAL,
0x11E, # FLAG_WARP_CAVES_W2_FAR,
0x123, # FLAG_WARP_CAVES_W3_5DI,
0x2F7, # CAVES_HIDDENW3,
0x11F, # FLAG_WARP_CAVES_W4_FAR,
0x120, # FLAG_WARP_CAVES_W4_5DI,
0x121, # FLAG_WARP_CAVES_W5_5DC,
0x122, # FLAG_WARP_CAVES_W5_PILLAR,
]
WARPS_CASTLE = [
0x147, # FLAG_WARP_CASTLE_W1_HUB,
0x148, # FLAG_WARP_CASTLE_W1_FAR,
0x149, # FLAG_WARP_CASTLE_W2_HUB,
0x14A, # FLAG_WARP_CASTLE_W2_HIGH,
0x14B, # FLAG_WARP_CASTLE_W3_HUB,
0x14C, # FLAG_WARP_CASTLE_W3_HIGH,
0x14D, # FLAG_WARP_CASTLE_W4_HUB,
0x14E, # FLAG_WARP_CASTLE_W4_HIGH,
0x14F, # FLAG_WARP_CASTLE_W5_HUB,
0x150, # FLAG_WARP_CASTLE_W5_HIGH,
0x151, # FLAG_WARP_CRYPT_W1_CLOSE,
0x152, # FLAG_WARP_CRYPT_W1_FAR,
0x153, # FLAG_WARP_CRYPT_W2_CLOSE,
0x154, # FLAG_WARP_CRYPT_W2_FAR,
0x155, # FLAG_WARP_CRYPT_W3_CLOSE,
0x156, # FLAG_WARP_CRYPT_W3_FAR,
]
WARPS_ISLES = [
0x1B1, # FLAG_WARP_ISLES_W1_RING,
0x1B2, # FLAG_WARP_ISLES_W1_FAR,
0x1B3, # FLAG_WARP_ISLES_W2_RING,
0x1B4, # FLAG_WARP_ISLES_W2_FAR,
0x1B5, # FLAG_WARP_ISLES_W3_RING,
0x1B6, # FLAG_WARP_ISLES_W3_FAR,
0x1B7, # FLAG_WARP_ISLES_W4_RING,
0x1B8, # FLAG_WARP_ISLES_W4_HIGH,
0x1BA, # FLAG_WARP_ISLES_W5_RING,
0x1B9, # FLAG_WARP_ISLES_W5_FAR,
]
WARPS_HELM_LOBBY = [
0x1A1, # Near Warp
0x1A2, # Far Warp
]
WARPS_TOTAL = [
WARPS_JAPES,
WARPS_AZTEC,
WARPS_FACTORY,
WARPS_GALLEON,
WARPS_FUNGI,
WARPS_CAVES,
WARPS_CASTLE,
WARPS_ISLES,
WARPS_HELM_LOBBY,
]
class ColorBlindCrosshair:
"""Store all information regarding a colorblind crosshair color data."""
def __init__(self, regular: int, homing: int, sniper: int):
"""Initialize with given parameters."""
self.regular = regular
self.homing = homing
self.sniper = sniper
def writeRGBColors(self, ROM_COPY, offset_dict: dict, value: int, upper_address: int, lower_address: int):
"""Write the RGB colors to ROM."""
hi = value >> 8
lo = ((value & 0xFF) << 8) | 0xFF
writeValue(ROM_COPY, upper_address, Overlay.Static, hi, offset_dict)
writeValue(ROM_COPY, lower_address, Overlay.Static, lo, offset_dict)
CROSSHAIRS = {
ColorblindMode.off: ColorBlindCrosshair(0xC80000, 0x00C800, 0xFFD700),
ColorblindMode.prot: ColorBlindCrosshair(0x0072FF, 0xFFFFFF, 0xFDE400),
ColorblindMode.deut: ColorBlindCrosshair(0x318DFF, 0xFFFFFF, 0xE3A900),
ColorblindMode.trit: ColorBlindCrosshair(0xC72020, 0xFFFFFF, 0x13C4D8),
}
def fixLankyIncompatibility(ROM_COPY: ROM):
"""Ensure compatibility with .lanky files created during a specific time frame."""
offset_dict = populateOverlayOffsets(ROM_COPY)
if readValue(ROM_COPY, 0x80602AB0, Overlay.Static, offset_dict, 4) != 0x0C180917:
writeValue(ROM_COPY, 0x80602AAC, Overlay.Static, 0x27A40018, offset_dict, 4) # addiu $a0, $sp, 0x18
def patchAssemblyCosmetic(ROM_COPY: ROM, settings: Settings, has_dom: bool = True):
"""Patch assembly instructions that pertain to cosmetic changes."""
offset_dict = populateOverlayOffsets(ROM_COPY)
holiday = getHoliday(settings)
troff_light = 1 if settings.troff_brighten else 0.15
writeFloat(ROM_COPY, 0x8075B8B0, Overlay.Static, troff_light, offset_dict)
if settings.remove_water_oscillation:
writeValue(ROM_COPY, 0x80661B54, Overlay.Static, 0, offset_dict, 4) # Remove Ripple Timer 0
writeValue(ROM_COPY, 0x80661B64, Overlay.Static, 0, offset_dict, 4) # Remove Ripple Timer 1
writeValue(ROM_COPY, 0x8068BDF4, Overlay.Static, 0, offset_dict, 4) # Disable rocking in Seasick Ship
writeValue(ROM_COPY, 0x8068BDFC, Overlay.Static, 0x1000, offset_dict) # Disable rocking in Mech Fish
writeValue(ROM_COPY, 0x805FCCEE, Overlay.Static, 0, offset_dict) # Disable seasick camera effect
writeValue(ROM_COPY, 0x8075F602, Overlay.Static, settings.caves_tomato_model + 1, offset_dict)
writeValue(ROM_COPY, 0x8075F4E2, Overlay.Static, settings.fungi_tomato_model + 1, offset_dict)
writeValue(ROM_COPY, 0x806F0376, Overlay.Static, settings.bother_klaptrap_model + 1, offset_dict)
writeValue(ROM_COPY, 0x806C8B42, Overlay.Static, settings.bother_klaptrap_model + 1, offset_dict)
if settings.rabbit_model == Model.Beetle:
writeValue(ROM_COPY, 0x8075F242, Overlay.Static, Model.Beetle + 1, offset_dict) # Rabbit Race
# Animation scale
writeValue(ROM_COPY, 0x806BE942, Overlay.Static, 0x285, offset_dict)
writeValue(ROM_COPY, 0x806BEFC2, Overlay.Static, 0x282, offset_dict)
writeValue(ROM_COPY, 0x806BF052, Overlay.Static, 0x282, offset_dict)
writeValue(ROM_COPY, 0x806BF066, Overlay.Static, 0x282, offset_dict)
writeValue(ROM_COPY, 0x806BF0C2, Overlay.Static, 0x281, offset_dict)
writeValue(ROM_COPY, 0x806BF1D2, Overlay.Static, 0x281, offset_dict)
writeValue(ROM_COPY, 0x806BEA8A, Overlay.Static, 0x281, offset_dict)
writeValue(ROM_COPY, 0x806BEB6A, Overlay.Static, 0x282, offset_dict)
writeValue(ROM_COPY, 0x806BF1DE, Overlay.Static, 0x282, offset_dict)
writeValue(ROM_COPY, 0x8075F244, Overlay.Static, 0x282, offset_dict)
writeValue(ROM_COPY, 0x806BE9B2, Overlay.Static, 0x287, offset_dict)
writeValue(ROM_COPY, 0x806BED5E, Overlay.Static, 0x288, offset_dict)
SpeedUpFungiRabbit(ROM_COPY, 1.62)
# Chunky 5DI
writeValue(ROM_COPY, 0x8075F3F2, Overlay.Static, Model.Beetle + 1, offset_dict)
writeValue(ROM_COPY, 0x806B23C6, Overlay.Static, 0x287, offset_dict)
# Misc Model Swaps
writeValue(ROM_COPY, 0x8002A55E, Overlay.Bonus, settings.panic_klaptrap_model + 1, offset_dict)
writeValue(ROM_COPY, 0x8002C22E, Overlay.Bonus, settings.seek_klaptrap_model + 1, offset_dict)
writeValue(ROM_COPY, 0x80028776, Overlay.Bonus, settings.turtle_model + 1, offset_dict)
writeValue(ROM_COPY, 0x8002A656, Overlay.Bonus, settings.panic_fairy_model + 1, offset_dict)
writeValue(ROM_COPY, 0x8074F212, Overlay.Static, settings.piano_burp_model + 1, offset_dict)
writeValue(ROM_COPY, 0x8075F122, Overlay.Static, settings.spotlight_fish_model + 1, offset_dict)
writeValue(ROM_COPY, 0x80755758, Overlay.Static, settings.candy_cutscene_model + 1, offset_dict)
writeValue(ROM_COPY, 0x8075575A, Overlay.Static, settings.funky_cutscene_model + 1, offset_dict)
writeValue(ROM_COPY, 0x8075578C, Overlay.Static, settings.boot_cutscene_model + 1, offset_dict)
# Refill Count
if ENABLE_MINIGAME_SPRITE_RANDO:
projectile_mapping = {
Sprite.BouncingMelon: Sprite.VerticalRollingMelon,
Sprite.BouncingOrange: Sprite.Orange,
}
is_new_sprite = settings.minigame_melon_sprite != Sprite.BouncingMelon
projectile_sprite = projectile_mapping.get(settings.minigame_melon_sprite, settings.minigame_melon_sprite)
is_small_sprite = settings.minigame_melon_sprite in (Sprite.BouncingMelon, Sprite.BouncingOrange)
hi = getHi(int(settings.minigame_melon_sprite)) if is_new_sprite else 0x8072
lo = getLo(int(settings.minigame_melon_sprite)) if is_new_sprite else 0xFFD4
proj_hi = getHi(int(projectile_sprite)) if is_new_sprite else 0x8072
proj_lo = getLo(int(projectile_sprite)) if is_new_sprite else 0x0020
writeValue(ROM_COPY, 0x8002737E, Overlay.Bonus, hi, offset_dict)
writeValue(ROM_COPY, 0x8002739A, Overlay.Bonus, lo, offset_dict)
writeValue(ROM_COPY, 0x80027366, Overlay.Bonus, 0x3F80 if is_small_sprite else 0x3F33, offset_dict)
writeValue(ROM_COPY, 0x8069274E, Overlay.Static, proj_hi, offset_dict)
writeValue(ROM_COPY, 0x8069275A, Overlay.Static, proj_lo, offset_dict)
writeValue(ROM_COPY, 0x80027448, Overlay.Bonus, 0x3C073F80, offset_dict, 4) # Ensure melon sfx is always usual pitch
# Skybox Handler
skybox_rgba = None
random_skybox = False
if settings.colorblind_mode != ColorblindMode.off:
skybox_rgba = [0x31, 0x33, 0x38]
elif getHolidaySetting(settings):
skybox_rgba = [0, 0, 0]
elif settings.misc_cosmetics:
random_skybox = True
if skybox_rgba is not None or random_skybox:
for x in range(8):
used_arr = skybox_rgba
if random_skybox:
used_arr = [settings.random.randint(0, 255), settings.random.randint(0, 255), settings.random.randint(0, 255)]
if used_arr is not None:
for zi, z in enumerate(used_arr):
writeValue(ROM_COPY, 0x80754EF8 + (12 * x) + zi, Overlay.Static, z, offset_dict, 1)
# Calculate secondary blend
backup_rgb = used_arr.copy()
exceeded = False
for y in range(3):
used_arr[y] = int(used_arr[y] * 1.2)
if used_arr[y] > 255:
exceeded = True
if exceeded:
for y in range(3):
used_arr[y] = int(backup_rgb[y] * 0.8)
# Write secondary blend
for y in range(3):
for zi, z in enumerate(used_arr):
writeValue(ROM_COPY, 0x80754EF8 + (12 * x) + ((y + 1) * 3) + zi, Overlay.Static, z, offset_dict, 1)
writeValue(ROM_COPY, 0x8075E1EC, Overlay.Static, 0x80708234, offset_dict, 4)
writeValue(ROM_COPY, 0x8064F052, Overlay.Static, settings.wrinkly_rgb[0], offset_dict)
writeValue(ROM_COPY, 0x8064F04A, Overlay.Static, settings.wrinkly_rgb[1], offset_dict)
writeValue(ROM_COPY, 0x8064F046, Overlay.Static, settings.wrinkly_rgb[2], offset_dict)
if settings.misc_cosmetics:
# Menu Background
if settings.menu_texture_index is not None:
writeValue(ROM_COPY, 0x8070761A, Overlay.Static, 0, offset_dict)
dimensions = compatible_background_textures[settings.menu_texture_index].dim
if dimensions == MenuTextDim.size_w32_h32:
writeValue(ROM_COPY, 0x8070762E, Overlay.Static, 0xFFE0, offset_dict)
writeValue(ROM_COPY, 0x8070727E, Overlay.Static, 0xC07C, offset_dict)
writeValue(ROM_COPY, 0x80707222, Overlay.Static, 0x073F, offset_dict)
elif dimensions == MenuTextDim.size_w64_h32:
writeValue(ROM_COPY, 0x8070762E, Overlay.Static, 0xFFE0, offset_dict)
writeValue(ROM_COPY, 0x8070727E, Overlay.Static, 0xC07C, offset_dict)
writeValue(ROM_COPY, 0x80707616, Overlay.Static, 0x40, offset_dict)
writeValue(ROM_COPY, 0x80707272, Overlay.Static, 0xF, offset_dict)
writeValue(ROM_COPY, 0x80707226, Overlay.Static, 0xF080, offset_dict)
writeValue(ROM_COPY, 0x8070725A, Overlay.Static, 0x2000, offset_dict)
writeValue(ROM_COPY, 0x807072A2, Overlay.Static, 0x0100, offset_dict)
writeValue(
ROM_COPY,
0x80707126,
Overlay.Static,
compatible_background_textures[settings.menu_texture_index].table,
offset_dict,
)
menu_background_rgba = 0x505050FF
if compatible_background_textures[settings.menu_texture_index].is_color:
menu_background_rgba = 0x000020FF # TODO: Get colors working properly
writeValue(ROM_COPY, 0x8075EAE4, Overlay.Static, menu_background_rgba, offset_dict, 4)
writeValue(ROM_COPY, 0x80754CEC, Overlay.Static, settings.menu_texture_index, offset_dict)
crosshair_img = 113 if settings.crosshair_outline else 0x38
writeValue(ROM_COPY, 0x806FFAFE, Overlay.Static, crosshair_img, offset_dict)
writeValue(ROM_COPY, 0x806FF116, Overlay.Static, crosshair_img, offset_dict)
writeValue(ROM_COPY, 0x806B78DA, Overlay.Static, crosshair_img, offset_dict)
if IsItemSelected(settings.songs_excluded, settings.excluded_songs_selected, ExcludedSongs.pause_music, False):
writeValue(ROM_COPY, 0x805FC890, Overlay.Static, 0, offset_dict, 4) # Pause Theme
writeValue(ROM_COPY, 0x805FC89C, Overlay.Static, 0, offset_dict, 4) # Pause Start Theme
if IsItemSelected(settings.songs_excluded, settings.excluded_songs_selected, ExcludedSongs.wrinkly, False):
writeValue(ROM_COPY, 0x8064F180, Overlay.Static, 0, offset_dict, 4) # Wrinkly Theme
if IsItemSelected(settings.songs_excluded, settings.excluded_songs_selected, ExcludedSongs.transformation, False):
writeValue(ROM_COPY, 0x8067E9E4, Overlay.Static, 0, offset_dict, 4) # Transform Theme
writeValue(ROM_COPY, 0x8067F7C0, Overlay.Static, 0, offset_dict, 4) # Transform Theme
if IsItemSelected(settings.songs_excluded, settings.excluded_songs_selected, ExcludedSongs.sub_areas, False):
# writeValue(ROM_COPY, 0x806025BC, Overlay.Static, 0, offset_dict, 4) # Disable `playLevelMusic` - Map Load
writeValue(ROM_COPY, 0x8061DF74, Overlay.Static, 0, offset_dict, 4) # Disable `playLevelMusic`
writeValue(ROM_COPY, 0x806DB98C, Overlay.Static, 0, offset_dict, 4) # Disable `playLevelMusic`
writeValue(ROM_COPY, 0x806034F2, Overlay.Static, 0, offset_dict) # Set Japes count to 0
writeValue(ROM_COPY, 0x80603556, Overlay.Static, 0, offset_dict) # Set Az Beetle count to 0
writeValue(ROM_COPY, 0x80603542, Overlay.Static, 0, offset_dict) # Set Factory count to 0
writeValue(ROM_COPY, 0x8060356A, Overlay.Static, 0, offset_dict) # Set Factory Car count to 0
writeValue(ROM_COPY, 0x8060351A, Overlay.Static, 0, offset_dict) # Set Galleon count to 0
# writeValue(ROM_COPY, 0x80603592, Overlay.Static, 0, offset_dict) # Set Isles count to 0
writeValue(ROM_COPY, 0x80603506, Overlay.Static, 0, offset_dict) # Set Aztec count to 0
writeValue(ROM_COPY, 0x8060352E, Overlay.Static, 0, offset_dict) # Set Galleon Seal count to 0
writeValue(ROM_COPY, 0x806035C6, Overlay.Static, 0, offset_dict) # Set Fungi count to 0
writeValue(ROM_COPY, 0x8060357E, Overlay.Static, 0, offset_dict) # Set Fungi Cart count to 0
writeValue(ROM_COPY, 0x806035BA, Overlay.Static, 0, offset_dict) # Set TGrounds count to 0
if settings.music_disable_reverb:
# Disable volume changes that would counteract the dynamic reverb's volume loss
writeValue(ROM_COPY, 0x80603DB8, Overlay.Static, 0x10000011, offset_dict, 4) # B 80603E00
# Holiday Mode Stuff
if holiday == Holidays.Halloween:
writeValue(ROM_COPY, 0x800271F2, Overlay.Bonus, Model.Krossbones + 1, offset_dict) # Green
writeValue(ROM_COPY, 0x80027216, Overlay.Bonus, Model.RoboKremling + 1, offset_dict) # Red
writeValue(ROM_COPY, 0x8075E0B8, Overlay.Static, 0x807080E0, offset_dict, 4) # Makes isles reference Castle skybox data
# Chains
writeValue(ROM_COPY, 0x8069901A, Overlay.Static, 0xE, offset_dict) # Vine param
writeValue(ROM_COPY, 0x8069903A, Overlay.Static, 0xE, offset_dict) # Vine param
writeValue(ROM_COPY, 0x80698754, Overlay.Static, 0, offset_dict, 4) # Cancel branch
writeValue(ROM_COPY, 0x80698B6C, Overlay.Static, 0, offset_dict, 4) # Cancel branch
writeValue(ROM_COPY, 0x80698B74, Overlay.Static, 0x1000, offset_dict) # Force branch
elif holiday == Holidays.Christmas:
# Make santa visit Isles
writeValue(ROM_COPY, 0x8070637E, Overlay.Static, 115, offset_dict) # Moon Image
writeValue(ROM_COPY, 0x8075E0B8, Overlay.Static, 0x807080E0, offset_dict, 4) # Makes isles reference Castle skybox data
writeValue(ROM_COPY, 0x806682C8, Overlay.Static, 0x240E0004, offset_dict, 4) # Set ground sfx to snow
writeValue(ROM_COPY, 0x806682CC, Overlay.Static, 0x240C0004, offset_dict, 4) # Set ground sfx to snow
writeValue(ROM_COPY, 0x806682DC, Overlay.Static, 0x240E0004, offset_dict, 4) # Set ground sfx to snow
elif holiday == Holidays.Anniv25:
# Change barrel base sprite
writeValue(ROM_COPY, 0x80721458, Overlay.Static, getBonusSkinOffset(ExtraTextures.Anniv25Barrel), offset_dict)
# Smoother Camera
if settings.smoother_camera:
camera_change_cooldown = 5
writeValue(ROM_COPY, 0x806EA238, Overlay.Static, 0, offset_dict, 4) # Disable it requiring a new input
writeValue(ROM_COPY, 0x806EA2A4, Overlay.Static, 0, offset_dict, 4) # Disable it requiring a new input
camera_change_amount = 5 * (camera_change_cooldown - 2)
addr = getROMAddress(0x806EA25E, Overlay.Static, offset_dict)
ROM_COPY.seek(addr)
val = int.from_bytes(ROM_COPY.readBytes(2), "big")
if (val & 0x8000) == 0: # Is Mirror Mode
camera_change_amount = -camera_change_amount
writeValue(ROM_COPY, 0x806EA256, Overlay.Static, camera_change_cooldown, offset_dict)
writeValue(ROM_COPY, 0x806EA25E, Overlay.Static, -camera_change_amount, offset_dict, 2, True)
writeValue(ROM_COPY, 0x806EA2C2, Overlay.Static, camera_change_cooldown, offset_dict)
writeValue(ROM_COPY, 0x806EA2CA, Overlay.Static, camera_change_amount, offset_dict, 2, True)
if GREATER_CAMERA_CONTROL:
NULL_FUNCTION = 0x806E1864
TURN_FUNCTION = 0x806EA628
FUNCTION_TABLE = {
# 0x24: 0x806E607C, # R_FUNCTION
0x34: 0x806EA200, # CL_FUNCTION
0x38: 0x806EA26C, # CR_FUNCTION
}
for x in range(107):
if x in (0, 4):
continue
rom_base_addr = getROMAddress(0x80751004 + (0x44 * x), Overlay.Static, offset_dict)
ROM_COPY.seek(rom_base_addr + 4)
always_function = int.from_bytes(ROM_COPY.readBytes(4), "big")
if always_function == TURN_FUNCTION:
# If you can turn the camera with the control stick, ban using the C buttons for that
continue
for offset in FUNCTION_TABLE:
ROM_COPY.seek(rom_base_addr + offset)
original_function = int.from_bytes(ROM_COPY.readBytes(4), "big")
if original_function == NULL_FUNCTION:
ROM_COPY.seek(rom_base_addr + offset)
ROM_COPY.writeMultipleBytes(FUNCTION_TABLE[offset], 4)
# Crosshair
if settings.colorblind_mode != ColorblindMode.off:
writeValue(ROM_COPY, 0x8069E974, Overlay.Static, 0x1000, offset_dict) # Force first option
writeValue(ROM_COPY, 0x8069E9B0, Overlay.Static, 0, offset_dict, 4) # Prevent write
writeValue(ROM_COPY, 0x8069E9B4, Overlay.Static, 0, offset_dict, 4) # Prevent write
writeValue(ROM_COPY, 0x8069E9BC, Overlay.Static, 0, offset_dict, 4) # Prevent write
ref_crosshair = CROSSHAIRS[settings.colorblind_mode]
ref_crosshair.writeRGBColors(ROM_COPY, offset_dict, ref_crosshair.sniper, 0x806FFA92, 0x806FFA96)
ref_crosshair.writeRGBColors(ROM_COPY, offset_dict, ref_crosshair.homing, 0x806FFA76, 0x806FFA7A)
ref_crosshair.writeRGBColors(ROM_COPY, offset_dict, ref_crosshair.regular, 0x806FF0C6, 0x806FF0CA)
ref_crosshair.writeRGBColors(ROM_COPY, offset_dict, ref_crosshair.homing, 0x806FF0AA, 0x806FF0AE)
if has_dom:
if settings.override_cosmetics:
enemy_setting = RandomModels[js.document.getElementById("random_enemy_colors").value]
else:
enemy_setting = settings.random_enemy_colors
if enemy_setting != RandomModels.off:
# Jumpman and DK
jumpman_addresses = [
0x8003B180,
0x8003B3C8,
0x8003B858,
0x8003BAA0,
0x8003BCE8,
0x8003BF30,
0x8003C178,
0x8003C3C0,
0x8003C608,
0x8003C850,
0x8003CA98,
0x8003CCE0,
0x8003B610,
0x8003CF28,
0x8003D170,
0x8003D3B8,
0x8003D600,
0x8003D848,
0x8003DA90, # 8px version
]
dk_addresses = [
0x8003E9F0,
0x800424D0,
0x800463F0,
0x800473B8,
0x80048380,
0x80049348,
0x80040540,
0x80041508,
0x80043498,
0x80044460,
0x80045428,
]
jumpman_shift = getRandomHueShift() # 16x16 except for 1 image
dk_shift = getRandomHueShift() # 48x48
for addr in jumpman_addresses:
width = 16
if addr == 0x8003DA90:
width = 8
rom_addr = getROMAddress(addr, Overlay.Arcade, offset_dict)
hueShiftImageFromAddress(ROM_COPY, rom_addr, width, width, TextureFormat.RGBA5551, jumpman_shift)
for addr in dk_addresses:
rom_addr = getROMAddress(addr, Overlay.Arcade, offset_dict)
hueShiftImageFromAddress(ROM_COPY, rom_addr, 48, 41, TextureFormat.RGBA5551, dk_shift)
def isFasterCheckEnabled(spoiler, fast_check: FasterChecksSelected):
"""Determine if a faster check setting is enabled."""
return IsItemSelected(spoiler.settings.faster_checks_enabled, spoiler.settings.faster_checks_selected, fast_check)
def isQoLEnabled(spoiler, misc_change: MiscChangesSelected):
"""Determine if a faster check setting is enabled."""
return IsItemSelected(spoiler.settings.quality_of_life, spoiler.settings.misc_changes_selected, misc_change)
FLAG_ABILITY_CAMERA = 0x2FD
def expandSaveFile(ROM_COPY: LocalROM, static_expansion: int, actor_count: int, offset_dict: dict):
"""Expand Save file."""
expansion = static_expansion + actor_count
flag_block_size = 0x320 + expansion
targ_gb_bits = 7 # Max 127
GB_LEVEL_COUNT = 9 if ENABLE_HELM_GBS else 8
added_bits = (targ_gb_bits - 3) * 8
if ENABLE_HELM_GBS:
added_bits += targ_gb_bits + 7 + 7
kong_var_size = 0xA1 + added_bits
file_info_location = flag_block_size + (5 * kong_var_size)
file_default_size = file_info_location + 0x72
# Flag Block Size
writeValue(ROM_COPY, 0x8060E36A, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060E31E, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060E2C6, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060D54A, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060D4A2, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060D45E, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060D3C6, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060D32E, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060D23E, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060CF62, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060CC52, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060C78A, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060C352, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060BF96, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060BA7A, Overlay.Static, file_default_size, offset_dict)
writeValue(ROM_COPY, 0x8060BEC6, Overlay.Static, file_info_location, offset_dict)
# Increase GB Storage Size
writeValue(ROM_COPY, 0x8060BE12, Overlay.Static, targ_gb_bits, offset_dict) # Bit Size
writeValue(ROM_COPY, 0x8060BE06, Overlay.Static, targ_gb_bits * GB_LEVEL_COUNT, offset_dict) # Allocation for all levels
writeValue(ROM_COPY, 0x8060BE26, Overlay.Static, 0x40C0, offset_dict) # SLL 2 -> SLL 3
writeValue(ROM_COPY, 0x8060BCC0, Overlay.Static, 0x24090000 | kong_var_size, offset_dict, 4) # ADDIU $t1, $r0, kong_var_size
writeValue(ROM_COPY, 0x8060BCC4, Overlay.Static, 0x01C90019, offset_dict, 4) # MULTU $t1, $t6
writeValue(ROM_COPY, 0x8060BCC8, Overlay.Static, 0x00004812, offset_dict, 4) # MFLO $t1
writeValue(ROM_COPY, 0x8060BCCC, Overlay.Static, 0, offset_dict, 4) # NOP
writeValue(ROM_COPY, 0x8060BE3A, Overlay.Static, 7 * GB_LEVEL_COUNT, offset_dict)
writeValue(ROM_COPY, 0x8060BE6E, Overlay.Static, 7 * GB_LEVEL_COUNT, offset_dict)
writeValue(ROM_COPY, 0x8060DFDE, Overlay.Static, GB_LEVEL_COUNT, offset_dict)
writeValue(ROM_COPY, 0x8060DD42, Overlay.Static, GB_LEVEL_COUNT, offset_dict)
writeValue(ROM_COPY, 0x806FB42E, Overlay.Static, int(math.ceil(GB_LEVEL_COUNT / 4) * 4), offset_dict)
writeValue(ROM_COPY, 0x80029982, Overlay.Menu, int(math.ceil(GB_LEVEL_COUNT / 4) * 4), offset_dict)
# Model 2 Start
writeValue(ROM_COPY, 0x8060C2F2, Overlay.Static, flag_block_size, offset_dict)
writeValue(ROM_COPY, 0x8060BCDE, Overlay.Static, flag_block_size, offset_dict)
# Reallocate Balloons + Patches
writeValue(ROM_COPY, 0x80688BCE, Overlay.Static, 0x320 + static_expansion, offset_dict) # Reallocated to just before model 2 block
class MinigameImageLoader:
"""Class to store information regarding the image loader for an 8-bit minigame reward."""
def __init__(
self,
file_name: str = None,
table_index: int = 0,
file_index: int = 0,
width: int = 0,
height: int = 0,
tex_format: TextureFormat = TextureFormat.RGBA5551,
):
"""Initialize with given parameters."""
self.pull_from_repo = file_name is not None
if self.pull_from_repo:
self.file_name = file_name
else:
self.table_index = table_index
self.file_index = file_index
self.width = width
self.height = height
self.tex_format = tex_format
def getImageBytes(self, ROM_COPY: Union[LocalROM, ROM], sub_dir: str, targ_width: int, targ_height: int, output_format: TextureFormat, flip: bool = True) -> bytes:
"""Convert associated image to bytes that can be written to ROM."""
output_image = None
if self.pull_from_repo:
output_image = Image.open(io.BytesIO(js.getFile(f"base-hack/assets/arcade_jetpac/{sub_dir}/{self.file_name}.png")))
else:
new_im = getImageFile(ROM_COPY, self.table_index, self.file_index, self.table_index != 7, self.width, self.height, self.tex_format)
if self.width != self.height:
dim = max(self.width, self.height)
dx = int((dim - self.width) / 2)
dy = int((dim - self.height) / 2)
temp_im = Image.new(mode="RGBA", size=(dim, dim))
temp_im.paste(new_im, (dx, dy), new_im)
new_im = temp_im
output_image = new_im.resize((targ_width, targ_height))
if flip:
output_image = output_image.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
if output_image is None:
return None
px = output_image.load()
by_data = []
for y in range(targ_height):
for x in range(targ_width):
px_data = px[x, y]
if output_format == TextureFormat.RGBA5551:
# Arcade
val = 1 if px_data[3] > 128 else 0
for c in range(3):
local_channel = (px_data[c] >> 3) & 0x1F
shift = 1 + (5 * (2 - c))
val |= local_channel << shift
v0 = (val >> 8) & 0xFF
v1 = val & 0xFF
by_data.extend([v0, v1])
elif output_format == TextureFormat.I8:
# Jetpac
total = 0
for c in range(3):
total += px_data[c]
intensity = int(total / 3)
by_data.append(intensity & 0xFF)
return bytes(bytearray(by_data))
class Minigame8BitImage:
"""Class to store information regarding the image processing for an 8-bit minigame reward."""
def __init__(self, permissable_items: list[Items], arcade_image: MinigameImageLoader, jetpac_image: MinigameImageLoader):
"""Initialize with given parameters."""
self.permissable_items = permissable_items.copy()
self.arcade_image = arcade_image
self.jetpac_image = jetpac_image
def alter8bitRewardImages(ROM_COPY, offset_dict: dict, arcade_item: Items = Items.NintendoCoin, jetpac_item: Items = Items.RarewareCoin):
"""Alter the image that is displayed in DK Arcade/Jetpac for their respective rewards."""
colorless_potions = (
ItemPool.ImportantSharedMoves + ItemPool.JunkSharedMoves + ItemPool.TrainingBarrelAbilities() + ItemPool.ClimbingAbilities() + [Items.Shockwave, Items.Camera, Items.CameraAndShockwave]
)
# Image.open(f"{hash_dir}rw_coin.png").resize(dim).save(f"{arcade_dir}rwcoin.png") # Rareware Coin
# Image.open(f"{hash_dir}melon_slice.png").resize(dim).save(f"{arcade_dir}melon.png") # Watermelon Slice
db = [
Minigame8BitImage([Items.Donkey], MinigameImageLoader("dk"), MinigameImageLoader("kong")),
Minigame8BitImage([Items.Diddy], MinigameImageLoader("diddy"), MinigameImageLoader("kong")),
Minigame8BitImage([Items.Lanky], MinigameImageLoader("lanky"), MinigameImageLoader("kong")),
Minigame8BitImage([Items.Tiny], MinigameImageLoader("tiny"), MinigameImageLoader("kong")),
Minigame8BitImage([Items.Chunky], MinigameImageLoader("chunky"), MinigameImageLoader("kong")),
Minigame8BitImage([Items.Bean], MinigameImageLoader("bean"), MinigameImageLoader("bean")),
Minigame8BitImage([Items.Pearl], MinigameImageLoader("pearl"), MinigameImageLoader("pearl")),
Minigame8BitImage(ItemPool.DonkeyMoves, MinigameImageLoader("potion_dk"), MinigameImageLoader("potion")),
Minigame8BitImage(ItemPool.DiddyMoves, MinigameImageLoader("potion_diddy"), MinigameImageLoader("potion")),
Minigame8BitImage(ItemPool.LankyMoves, MinigameImageLoader("potion_lanky"), MinigameImageLoader("potion")),
Minigame8BitImage(ItemPool.TinyMoves, MinigameImageLoader("potion_tiny"), MinigameImageLoader("potion")),
Minigame8BitImage(ItemPool.ChunkyMoves, MinigameImageLoader("potion_chunky"), MinigameImageLoader("potion")),
Minigame8BitImage(colorless_potions, MinigameImageLoader("potion_any"), MinigameImageLoader("potion")),
Minigame8BitImage([Items.BattleCrown], MinigameImageLoader(None, 25, 5893, 44, 44), MinigameImageLoader("crown")),
Minigame8BitImage(
[Items.BananaFairy],
MinigameImageLoader(None, 25, 0x16ED, 32, 32, TextureFormat.RGBA32),
MinigameImageLoader("fairy"),
),
Minigame8BitImage([Items.GoldenBanana], MinigameImageLoader(None, 25, 5468, 44, 44), MinigameImageLoader("gb")),
Minigame8BitImage(ItemPool.Blueprints(), MinigameImageLoader(None, 25, 0x1593, 48, 42), MinigameImageLoader("blueprint")),
Minigame8BitImage(ItemPool.Keys(), MinigameImageLoader(None, 25, 5877, 44, 44), MinigameImageLoader("key")),
Minigame8BitImage([Items.BananaMedal], MinigameImageLoader(None, 25, 0x156C, 44, 44), MinigameImageLoader("medal")),
Minigame8BitImage([Items.JunkMelon], MinigameImageLoader(None, 7, 0x142, 48, 42), MinigameImageLoader("melon")),
Minigame8BitImage([Items.NintendoCoin], None, MinigameImageLoader("nintendo")),
Minigame8BitImage([Items.RarewareCoin], MinigameImageLoader(None, 25, 5905, 44, 44), None),
Minigame8BitImage([Items.RainbowCoin], MinigameImageLoader(None, 25, 5963, 48, 44), MinigameImageLoader("rainbow")),
Minigame8BitImage(
ItemPool.HintItems(),
MinigameImageLoader(None, 25, 0x1775, 64, 64, TextureFormat.IA8),
MinigameImageLoader("hint"),
),
Minigame8BitImage([Items.ArchipelagoItem], MinigameImageLoader("ap"), MinigameImageLoader("ap")),
]
arcade_image_data = None
jetpac_image_data = None
for item in db:
if arcade_item in item.permissable_items:
arcade_image_data = item.arcade_image
if jetpac_item in item.permissable_items:
jetpac_image_data = item.jetpac_image
im_data = {
"arcade": arcade_image_data,
"jetpac": jetpac_image_data,
}
for minigame in im_data:
if im_data[minigame] is None:
continue
dim = 20
ovl = Overlay.Arcade
addr = 0x8003AE58
bytes_per_px = 2
output_format = TextureFormat.RGBA5551
if minigame == "jetpac":
dim = 16
ovl = Overlay.Jetpac
addr = 0x8002D868
bytes_per_px = 1
output_format = TextureFormat.I8
write = im_data[minigame].getImageBytes(ROM_COPY, minigame, dim, dim, output_format)
output_addr = getROMAddress(addr, ovl, offset_dict)
if len(write) > math.ceil(dim * dim * bytes_per_px):
raise Exception(
f"Cannot write 8-bit minigame image to ROM. Too big. Minigame: {minigame}, Arcade Item: {arcade_item}, Jetpac Item: {jetpac_item}, Size: {len(write)}, cap: {math.ceil(dim * dim * bytes_per_px)}"
)
ROM_COPY.seek(output_addr)
ROM_COPY.writeBytes(write)
def writeActorHealth(ROM_COPY, actor_index: int, new_health: int):
"""Write actor health value."""
start = getSym("actor_health_damage") + (4 * actor_index)
writeValue(ROM_COPY, start, Overlay.Custom, new_health, {})
def updateActorFunctionInt(ROM_COPY, actor_index: int, new_function: int):
"""Update the actor function in the table based on a int value."""
start = getSym("actor_functions") + (4 * actor_index)
writeValue(ROM_COPY, start, Overlay.Custom, new_function, {}, 4)
def updateActorFunction(ROM_COPY, actor_index: int, new_function_sym: str):
"""Update the actor function in the table based on a sym value."""
start = getSym("actor_functions") + (4 * actor_index)
writeLabelValue(ROM_COPY, start, Overlay.Custom, new_function_sym, {})
def writeSingleOwnership(ROM_COPY, index, kong):
"""Write the ownership of a particular item to a kong."""
start = getSym("new_flag_mapping") + (index * 8) + 6
writeValue(ROM_COPY, start, Overlay.Custom, kong + 2, {}, 1)
def writeKongItemOwnership(ROM_COPY, settings: Settings):
"""Write the item ownership for kong rando."""
starting_kong = settings.starting_kong
diddy_freer = settings.diddy_freeing_kong
lanky_freer = settings.lanky_freeing_kong
tiny_freer = settings.tiny_freeing_kong
chunky_freer = settings.chunky_freeing_kong
no_arcade_r1 = IsItemSelected(settings.faster_checks_enabled, settings.faster_checks_selected, FasterChecksSelected.factory_arcade_round_1)
writeSingleOwnership(ROM_COPY, 1, diddy_freer)
writeSingleOwnership(ROM_COPY, 2, diddy_freer)
writeSingleOwnership(ROM_COPY, 22, tiny_freer)
writeSingleOwnership(ROM_COPY, 27, lanky_freer)
writeSingleOwnership(ROM_COPY, 39, chunky_freer)
writeSingleOwnership(ROM_COPY, 97, starting_kong)
if no_arcade_r1:
start = getSym("new_flag_mapping") + (41 * 8)
writeValue(ROM_COPY, start, Overlay.Custom, Maps.FactoryBaboonBlast, {}, 1)
writeValue(ROM_COPY, start + 2, Overlay.Custom, 0, {})
def disableDynamicReverb(ROM_COPY: ROM):
"""Disable the dynamic FXMix (Reverb) that would otherwise be applied in tunnels and underwater."""
for index in range(1, 175):
offset_dict = populateOverlayOffsets(ROM_COPY)
ram_address = 0x80745658 + (index * 2)
rom_address = getROMAddress(ram_address, Overlay.Static, offset_dict)
ROM_COPY.seek(rom_address)
original_value = int.from_bytes(ROM_COPY.readBytes(2), "big")
original_value &= 0xFFFE
writeValue(ROM_COPY, 0x80745658 + (index * 2), Overlay.Static, original_value, offset_dict)
boss_maps = [
Maps.JapesBoss,
Maps.AztecBoss,
Maps.FactoryBoss,
Maps.GalleonBoss,
Maps.FungiBoss,
Maps.CavesBoss,
Maps.CastleBoss,
Maps.KroolDonkeyPhase,
Maps.KroolDiddyPhase,
Maps.KroolLankyPhase,
Maps.KroolTinyPhase,
Maps.KroolChunkyPhase,
Maps.KroolShoe,
]
k_rool_maps = [
Maps.KroolDonkeyPhase,
Maps.KroolDiddyPhase,
Maps.KroolLankyPhase,
Maps.KroolTinyPhase,
Maps.KroolChunkyPhase,
]
IS_FINAL_BOSS_BIT = 0x200
def fixBossProperties(ROM_COPY: LocalROM, offset_dict: dict, settings: Settings):
"""Fix all boss map properties to account for the correct attributes."""
# 02
writeValue(ROM_COPY, 0x805FF476, Overlay.Static, IS_FINAL_BOSS_BIT, offset_dict) # 805ff474 - Transition song playing (checks bit is not set)
# 80618640 - SFX play from actor (checks bit is not set)
# 806206fc - something with mini
# 80621790 - rocket something
# 80621888 - ????
# 80621A30 - ????
# 80621AC8 - ????
# 80622248 - ????
# 806223C4 - ????
# 80624718 - ????
# 806286DC - Warp actor to vehicle
# 8067EA94 - Barrel code
# 8067F3A4 - Play transform barrel song
# 8067F7E8 - Transform cooldown
# 80680200 - Cannon Barrel
# 806802AC - Cannon Barrel
# 80680434 - Cannon Barrel
# 8068210C - Rocketbarrel HUD
# 806C3008 - Cutscene Models
# 806C308C - Cutscene Models
# 806C7FD4 - Refilling health if dead (if not set)
# 806D2EAC - Rocketbarrel something
# 806D3164 - Rocketbarrel something
# 806D7ABC - Play "knockout" sfx on death
# 806D9A04 - Noclip for instrument
# 806D9A7C - Trombone volume
# 806E5430 - Noclip for instrument
# 806EA0D8 - Zoom level
# 806ECD24 - Jump Y Vel
# 806ECDF8 - Damage take
# 806EE804 - Cancel trombone music
# 806EE83C - Damage take something
# 806F058C - Play instrument cutscene
# 806F12C8 - Play gone song
writeValue(ROM_COPY, 0x8071288A, Overlay.Static, IS_FINAL_BOSS_BIT, offset_dict) # 80712888 - Deathwarp location (should change this)
# 80712C34 - Helm Timer init
# 80712F34 - Warp after beating KR in main menu
# 80726CDC - If off, and enemy id != 4 and actor_type != fairy, set props bitfield
# 20
# 8061bfb0 - Camera stuff
writeHook(ROM_COPY, 0x806A895C, Overlay.Static, "checkKRoolPause", offset_dict)
writeValue(ROM_COPY, 0x806A8970, Overlay.Static, 0x10200009, offset_dict, 4) # beqz $at, 0x9
for map_id in boss_maps:
check_map = map_id
if check_map == Maps.KroolShoe:
check_map = Maps.KroolTinyPhase
rom_address = getROMAddress(0x8074482C + (12 * map_id) + 4, Overlay.Static, offset_dict)
ROM_COPY.seek(rom_address)
raw_value = int.from_bytes(ROM_COPY.readBytes(4), "big")
is_final_boss = check_map in settings.krool_order
is_krool = check_map in k_rool_maps
is_shoe = map_id == Maps.KroolShoe
if is_final_boss:
raw_value |= IS_FINAL_BOSS_BIT
ROM_COPY.seek(rom_address)
ROM_COPY.writeMultipleBytes(raw_value, 4)
def patchVersionStack(ROM_COPY: LocalROM, settings: Settings):
"""Patch the version number into the stack trace."""
offset_dict = populateOverlayOffsets(ROM_COPY)
VERSION_STRING_START = getSym("version_string")
source_string = settings.branch.upper()[0]
if source_string is None:
source_string = "U"
major = settings.version.split(".")[0]
addr = getROMAddress(VERSION_STRING_START, Overlay.Custom, offset_dict)
string_to_write = f"DK64R {major}.0{source_string}\n"
if len(string_to_write) >= 0x10:
raise Exception("Invalid stack trace string")
ROM_COPY.seek(addr)
ROM_COPY.writeBytes(bytes(string_to_write, "ascii"))
def patchAssembly(ROM_COPY, spoiler):
"""Patch all assembly instructions."""
patchVersionStack(ROM_COPY, spoiler.settings)
offset_dict = populateOverlayOffsets(ROM_COPY)
settings = spoiler.settings
file_init_flags = [
0x167, # FLAG_TNS_0,
0x188, # FLAG_TNS_1,
0x311, # FLAG_TNS_2,
0x175, # FLAG_BUY_INSTRUMENT,
0x176, # FLAG_BUY_GUNS,
0x6D, # FLAG_HATCH,
0x00, # FLAG_FIRSTJAPESGATE,
0x17E, # FLAG_FTT_BLOCKER,
0x18C, # FLAG_FIRST_COIN_COLLECTION
0x164, # BBlast first time cutscene
]
ACTOR_DEF_START = getSym("actor_defs")
ACTOR_MASTER_TYPE_START = getSym("actor_master_types")
ACTOR_COLLISION_START = getSym("actor_collisions")
ACTOR_HEALTH_START = getSym("actor_health_damage")
alter8bitRewardImages(ROM_COPY, offset_dict, spoiler.arcade_item_reward, spoiler.jetpac_item_reward)
fixBossProperties(ROM_COPY, offset_dict, settings)
writeValue(ROM_COPY, 0x8060E04C, Overlay.Static, 0, offset_dict, 4) # Prevent moves overwrite
writeValue(ROM_COPY, 0x8060DDAA, Overlay.Static, 0, offset_dict) # Writes readfile data to moves
writeValue(ROM_COPY, 0x806C9CDE, Overlay.Static, 7, offset_dict) # GiveEverything, write to bitfield. Seems to be unused but might as well
writeValue(ROM_COPY, 0x8074DC84, Overlay.Static, 0x53, offset_dict) # Increase PAAD size
writeValue(ROM_COPY, 0x8060EEE0, Overlay.Static, 0x240E0000, offset_dict, 4) # Disable Graphical Debugger. ADDIU $t6, $r0, 0
writeValue(ROM_COPY, 0x806416BC, Overlay.Static, 0, offset_dict, 4) # Prevent parent map check in cross-map object change communications
writeValue(ROM_COPY, 0x806AF75C, Overlay.Static, 0x1000, offset_dict) # New Kop Code
writeValue(ROM_COPY, 0x806CBD78, Overlay.Static, 0x18400005, offset_dict, 4) # BLEZ $v0, 0x5 - Decrease in health occurs if trap bubble active
writeValue(ROM_COPY, 0x806A65B8, Overlay.Static, 0x240A0006, offset_dict, 4) # Always ensure chunky bunch sprite (Rock Bunch)
writeValue(ROM_COPY, 0x806A64B0, Overlay.Static, 0x240A0004, offset_dict, 4) # Always ensure lanky coin sprite (Rabbit Race 1 Reward)
writeValue(ROM_COPY, 0x8060036A, Overlay.Static, 0xFF, offset_dict) # Fix game crash upon exiting a bonus with no parent
writeValue(ROM_COPY, 0x806F88A8, Overlay.Static, 0x1000, offset_dict) # Force disable coin cheat
writeValue(ROM_COPY, 0x805FEA14, Overlay.Static, 0, offset_dict, 4) # Prevent Enguarde arena setting kong as Enguarde
writeValue(ROM_COPY, 0x805FEA08, Overlay.Static, 0, offset_dict, 4) # Prevent Rambi arena setting kong as Rambi
writeFunction(ROM_COPY, 0x805FC164, Overlay.Static, "cFuncLoop", offset_dict) # Main Function Loop
writeFunction(ROM_COPY, 0x8060CB7C, Overlay.Static, "fixChimpyCamBug", offset_dict) # Fix bug with PJ
writeFunction(ROM_COPY, 0x805FEBC0, Overlay.Static, "parseCutsceneData", offset_dict) # modifyCutsceneHook
writeFunction(ROM_COPY, 0x807313A4, Overlay.Static, "checkVictory_flaghook", offset_dict) # perm flag set hook
writeFunction(ROM_COPY, 0x806C3B5C, Overlay.Static, "mermaidCheck", offset_dict) # Mermaid Check
writeFunction(ROM_COPY, 0x806ADA70, Overlay.Static, "HandleSpiderSilkSpawn", offset_dict) # Fix some silk memes
if ENABLE_HITSCAN:
writeFunction(ROM_COPY, 0x80694FAC, Overlay.Static, "movePelletWrapper", offset_dict)
if DISABLE_BORDERS:
writeValue(ROM_COPY, 0x805FBAB4, Overlay.Static, 0x1000FFC7, offset_dict, 4) # Disable borders around game. Has "quirks"
if UNSHROUDED_CASTLE:
# Credit: Retroben
writeFloatUpper(ROM_COPY, 0x80663CB6, Overlay.Static, 8000, offset_dict)
if FARPLANE_VIEW:
# Credit: Retroben
writeValue(ROM_COPY, 0x80663D24, Overlay.Static, 0x240B1F40, offset_dict, 4)
writeValue(ROM_COPY, 0x80663D30, Overlay.Static, 0x240B1F40, offset_dict, 4)
writeValue(ROM_COPY, 0x8062F09C, Overlay.Static, 0x240F1F40, offset_dict, 4)
# Kong Model Swap handlers
writeFunction(ROM_COPY, 0x806C871C, Overlay.Static, "adjustGunBone", offset_dict)
writeFunction(ROM_COPY, 0x806E2A34, Overlay.Static, "adjustGunBone", offset_dict)
writeFunction(ROM_COPY, 0x80683194, Overlay.Static, "updateKongTB", offset_dict)
writeFunction(ROM_COPY, 0x80031DE4, Overlay.Boss, "updateActorHandStates", offset_dict)
writeFunction(ROM_COPY, 0x80031F68, Overlay.Boss, "updateActorHandStates", offset_dict)
writeFunction(ROM_COPY, 0x80682FC4, Overlay.Static, "updateActorHandStates", offset_dict)
writeFunction(ROM_COPY, 0x806839FC, Overlay.Static, "updateActorHandStates", offset_dict)
writeFunction(ROM_COPY, 0x806BFC5C, Overlay.Static, "updateActorHandStates", offset_dict)
writeFunction(ROM_COPY, 0x806C1A50, Overlay.Static, "updateActorHandStates", offset_dict)
writeFunction(ROM_COPY, 0x806C1B8C, Overlay.Static, "updateActorHandStates", offset_dict)
writeFunction(ROM_COPY, 0x806C1D4C, Overlay.Static, "updateActorHandStates", offset_dict)
writeFunction(ROM_COPY, 0x806C88CC, Overlay.Static, "updateActorHandStates", offset_dict)
writeFunction(ROM_COPY, 0x80029F78, Overlay.Bonus, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x8002CBD4, Overlay.Menu, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x80026904, Overlay.Multiplayer, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x8062806C, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x8068F128, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806BFB64, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806C10D8, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806C2FA0, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806E2A1C, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806EAC54, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806EC060, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806ED12C, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806EDE60, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806F114C, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806F11D4, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806F11F0, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806F120C, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806F1228, Overlay.Static, "clearGunHandler", offset_dict)
writeLabelValue(ROM_COPY, 0x80746D8C, Overlay.Static, "clearGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806BFB40, Overlay.Static, "pullOutGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806C8C54, Overlay.Static, "pullOutGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806EAC44, Overlay.Static, "pullOutGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806EB850, Overlay.Static, "pullOutGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806EDE24, Overlay.Static, "pullOutGunHandler", offset_dict)
writeFunction(ROM_COPY, 0x806F77EC, Overlay.Static, "pullOutGunHandler", offset_dict)
writeLabelValue(ROM_COPY, 0x80746D90, Overlay.Static, "pullOutGunHandler", offset_dict)
writeHook(ROM_COPY, 0x8063EE08, Overlay.Static, "InstanceScriptCheck", offset_dict)
writeHook(ROM_COPY, 0x80731168, Overlay.Static, "checkFlag_ItemRando", offset_dict)
writeHook(ROM_COPY, 0x807312F8, Overlay.Static, "setFlag_ItemRando", offset_dict)
writeHook(ROM_COPY, 0x8069840C, Overlay.Static, "VineCode", offset_dict)
writeHook(ROM_COPY, 0x80698420, Overlay.Static, "VineShowCode", offset_dict)
writeHook(ROM_COPY, 0x8063ED7C, Overlay.Static, "HandleSlamCheck", offset_dict)
writeHook(ROM_COPY, 0x806FF384, Overlay.Static, "ModifyCameraColor", offset_dict)
writeHook(ROM_COPY, 0x8061E684, Overlay.Static, "SkipCutscenePans", offset_dict)
writeHook(ROM_COPY, 0x80648364, Overlay.Static, "ShopImageHandler", offset_dict)
writeHook(ROM_COPY, 0x806EA70C, Overlay.Static, "InvertCameraControls", offset_dict)
writeHook(ROM_COPY, 0x8061CE38, Overlay.Static, "PlayCutsceneVelocity", offset_dict)
writeHook(ROM_COPY, 0x80677C14, Overlay.Static, "FixPufftossInvalidWallCollision", offset_dict)
writeHook(ROM_COPY, 0x8060DFF4, Overlay.Static, "SaveToFileFixes", offset_dict)
writeHook(ROM_COPY, 0x806F6EA0, Overlay.Static, "BarrelMovesFixes", offset_dict)
writeHook(ROM_COPY, 0x806E4930, Overlay.Static, "ChimpyChargeFix", offset_dict)
writeHook(ROM_COPY, 0x806E48AC, Overlay.Static, "OStandFix", offset_dict)
writeHook(ROM_COPY, 0x8067ECB8, Overlay.Static, "HunkyChunkyFix2", offset_dict)
writeHook(ROM_COPY, 0x805FC3FC, Overlay.Static, "EarlyFrameCode", offset_dict)
writeHook(ROM_COPY, 0x8071417C, Overlay.Static, "displayListCode", offset_dict)
writeHook(ROM_COPY, 0x806F8610, Overlay.Static, "GiveItemPointerToMulti", offset_dict)
writeHook(ROM_COPY, 0x8060005C, Overlay.Static, "getLobbyExit", offset_dict)
writeHook(ROM_COPY, 0x8060DEF4, Overlay.Static, "SaveHelmHurryCheck", offset_dict)
writeHook(ROM_COPY, 0x806F3E74, Overlay.Static, "AutowalkFix", offset_dict)
writeHook(ROM_COPY, 0x80610948, Overlay.Static, "DynamicCodeFixes", offset_dict)
writeHook(ROM_COPY, 0x80689534, Overlay.Static, "tagPreventCode", offset_dict)
writeHook(ROM_COPY, 0x806BD328, Overlay.Static, "KeyCompressionCode", offset_dict)
writeHook(ROM_COPY, 0x8067B684, Overlay.Static, "CannonForceCode", offset_dict)
writeHook(ROM_COPY, 0x806F9F88, Overlay.Static, "HUDDisplayCode", offset_dict)
writeHook(ROM_COPY, 0x806E22B0, Overlay.Static, "HomingDisable", offset_dict)
writeHook(ROM_COPY, 0x806EB574, Overlay.Static, "HomingHUDHandle", offset_dict)
writeHook(ROM_COPY, 0x806324C4, Overlay.Static, "DKCollectableFix", offset_dict)
writeHook(ROM_COPY, 0x806AF70C, Overlay.Static, "GuardDeathHandle", offset_dict)
writeHook(ROM_COPY, 0x806AE55C, Overlay.Static, "GuardAutoclear", offset_dict)
writeHook(ROM_COPY, 0x80637148, Overlay.Static, "ObjectRotate", offset_dict)
writeHook(ROM_COPY, 0x8063365C, Overlay.Static, "WriteDefaultShopBone", offset_dict)
writeHook(ROM_COPY, 0x806A86FC, Overlay.Static, "PauseControl_Control", offset_dict)
writeHook(ROM_COPY, 0x806AA414, Overlay.Static, "PauseControl_Sprite", offset_dict)
writeHook(ROM_COPY, 0x806A7474, Overlay.Static, "disableHelmKeyBounce", offset_dict)
writeHook(ROM_COPY, 0x80600674, Overlay.Static, "updateLag", offset_dict)
writeHook(ROM_COPY, 0x806FC990, Overlay.Static, "ApplyTextRecolorHints", offset_dict)
if CAMERA_RESET_REDUCTION:
# Credit: Retroben
writeValue(ROM_COPY, 0x8061BDF0, Overlay.Static, 0x1000, offset_dict)
writeValue(ROM_COPY, 0x8061BE12, Overlay.Static, 0x0001, offset_dict)
writeValue(ROM_COPY, 0x8061BE18, Overlay.Static, 0x1000, offset_dict)
if PAL_DOGADON_REMATCH_FIRE:
writeValue(ROM_COPY, 0x80691E36, Overlay.Static, 166, offset_dict) # PAL = 200 * (50 / 60)
if REMOVE_CS_BARS:
writeValue(ROM_COPY, 0x805FBC2C, Overlay.Static, 0x0060C825, offset_dict, 4) # Remove screen divisor capping
writeValue(ROM_COPY, 0x805FBC38, Overlay.Static, 0x00A04025, offset_dict, 4) # Remove screen divisor capping
# Boss stuff
writeHook(ROM_COPY, 0x80028CCC, Overlay.Boss, "KRoolLankyPhaseFix", offset_dict)
if IsItemSelected(settings.hard_bosses, settings.hard_bosses_selected, HardBossesSelected.kut_out_phase_rando, False):
writeHook(ROM_COPY, 0x80032570, Overlay.Boss, "KKOPhaseHandler", offset_dict)
writeHook(ROM_COPY, 0x80031B2C, Overlay.Boss, "KKOInitPhase", offset_dict)
writeValue(ROM_COPY, 0x8003259A, Overlay.Boss, 4, offset_dict, 2) # KKO Last Phase Check
writeValue(ROM_COPY, 0x80032566, Overlay.Boss, settings.kko_phase_order[1], offset_dict, 2) # KKO Last Phase Check
if settings.shorten_boss:
writeActorHealth(ROM_COPY, 185, 3) # Dillo Health 4 -> 3
writeActorHealth(ROM_COPY, 236, int(3 + (62 * (2 / 3)))) # Dogadon Health 65 -> 44
writeActorHealth(ROM_COPY, 251, 3) # Spider Boss Health 6 -> 3
writeHook(ROM_COPY, 0x80035120, Overlay.Boss, "MadJackShort", offset_dict)
writeValue(ROM_COPY, 0x800350D2, Overlay.Boss, 2, offset_dict, 2) # Mad Jack Cutscene Memery
writeHook(ROM_COPY, 0x80029AAC, Overlay.Boss, "PufftossShort", offset_dict)
writeHook(ROM_COPY, 0x8002ACB0, Overlay.Boss, "DogadonRematchShort", offset_dict)
writeHook(ROM_COPY, 0x800257CC, Overlay.Boss, "DilloRematchShort", offset_dict)
writeValue(ROM_COPY, 0x800322BA, Overlay.Boss, 2, offset_dict, 2) # Kut Out hit limit
writeHook(ROM_COPY, 0x8002DB10, Overlay.Boss, "DKPhaseShort", offset_dict)
writeValue(ROM_COPY, 0x8002E52A, Overlay.Boss, 2, offset_dict, 2) # Diddy Phase Hit Count
writeValue(ROM_COPY, 0x8002EF02, Overlay.Boss, 2, offset_dict, 2) # Lanky Phase Hit Count
writeHook(ROM_COPY, 0x80030370, Overlay.Boss, "TinyPhaseShort", offset_dict)
writeHook(ROM_COPY, 0x800314B4, Overlay.Boss, "ChunkyPhaseShort", offset_dict)
writeValue(ROM_COPY, 0x80031378, Overlay.Boss, 0x0C1837B2, offset_dict, 4) # Call save
# Change pause menu background design
writeValue(ROM_COPY, 0x806A84F4, Overlay.Static, 0, offset_dict, 4) # Enable framebuffer clear on pause menu
writeValue(ROM_COPY, 0x806A90E8, Overlay.Static, 0, offset_dict, 4) # Disable Screen Shake
writeValue(ROM_COPY, 0x806AC056, Overlay.Static, 120, offset_dict) # Changes darkness opacity
# Beaver Bother fix
writeHook(ROM_COPY, 0x806AD740, Overlay.Static, "unscareBeaver", offset_dict)
writeHook(ROM_COPY, 0x806AD728, Overlay.Static, "scareBeaver", offset_dict)
writeValue(ROM_COPY, 0x806B674E, Overlay.Static, 0xC, offset_dict) # Increase the scare duration
# T&S Div-by-0 error
writeHook(ROM_COPY, 0x8064D8E0, Overlay.Static, "tns_pad_height_patch", offset_dict)
writeHook(ROM_COPY, 0x8064D9D8, Overlay.Static, "tns_pad_height_patch_0", offset_dict)
writeHook(ROM_COPY, 0x806BE0FC, Overlay.Static, "scoff_patch", offset_dict)
for index, count in enumerate(settings.BossBananas):
writeValue(ROM_COPY, 0x807446C0 + (2 * index), Overlay.Static, count, offset_dict)
# Make chunky translucent during the HC section of Chunky Phase
writeHook(ROM_COPY, 0x806CB778, Overlay.Static, "makeKongTranslucent", offset_dict)
writeFunction(ROM_COPY, 0x80704568, Overlay.Static, "spawnOverlayText", offset_dict)
writeValue(ROM_COPY, 0x807563B4, Overlay.Static, 1, offset_dict, 1) # Enable stack trace
writeFunction(ROM_COPY, 0x806DF3F8, Overlay.Static, "getHomingCountWithAbilityCheck", offset_dict)
writeFunction(ROM_COPY, 0x806EB560, Overlay.Static, "getHomingCountWithAbilityCheck", offset_dict)
writeValue(ROM_COPY, 0x806F90C8, Overlay.Static, 0x24040000 | (20 * 150), offset_dict, 4) # set min coconuts to 3000 (20 crystals)
# Damage mask
damage_addrs = [0x806EE138, 0x806EE330, 0x806EE480, 0x806EEA20, 0x806EEEA4, 0x806EF910, 0x806EF9D0, 0x806F5860]
for addr in damage_addrs:
writeFunction(ROM_COPY, addr, Overlay.Static, "applyDamageMask", offset_dict)
writeFunction(ROM_COPY, 0x80031524, Overlay.Boss, "applyDamageMask", offset_dict)
writeFunction(ROM_COPY, 0x806D2FC0, Overlay.Static, "fixRBSlowTurn", offset_dict) # Slow Turn Fix
writeFunction(ROM_COPY, 0x80712EC4, Overlay.Static, "postKRoolSaveCheck", offset_dict) # LZ Save
writeFunction(ROM_COPY, 0x806380B0, Overlay.Static, "handleModelTwoOpacity", offset_dict) # Opacity Fixes
# Level Index Fixes
for map_index in (Maps.OrangeBarrel, Maps.BarrelBarrel, Maps.VineBarrel, Maps.DiveBarrel):
writeValue(ROM_COPY, 0x807445E0 + map_index, Overlay.Static, 9, offset_dict, 1) # Write Training level index to LEVEL_BONUS
# Mermaid
writeValue(ROM_COPY, 0x806C3B64, Overlay.Static, 0x1000, offset_dict) # Force to branch
writeValue(ROM_COPY, 0x806C3BD0, Overlay.Static, 0x1000, offset_dict) # Force to branch
writeValue(ROM_COPY, 0x806C3C20, Overlay.Static, 0, offset_dict, 4) # NOP - Cancel control state write
writeValue(ROM_COPY, 0x806C3C2C, Overlay.Static, 0, offset_dict, 4) # NOP - Cancel control state progress write
# Silk Memes
writeValue(ROM_COPY, 0x806ADA6C, Overlay.Static, 0, offset_dict, 4)
writeValue(ROM_COPY, 0x806ADA78, Overlay.Static, 0, offset_dict, 4)
# Fix Spider Crashes
writeValue(ROM_COPY, 0x8075F46C, Overlay.Static, 0x2F5, offset_dict)
writeValue(ROM_COPY, 0x806ADA26, Overlay.Static, 0x2F5, offset_dict) # This might fix spawning if set on non-init
writeValue(ROM_COPY, 0x806ADA2A, Overlay.Static, 0x2F5, offset_dict)
writeValue(ROM_COPY, 0x806ADA32, Overlay.Static, 0x2F5, offset_dict)
writeValue(ROM_COPY, 0x806ADBC6, Overlay.Static, 0x2F5, offset_dict)
writeValue(ROM_COPY, 0x806ADC66, Overlay.Static, 0x2F5, offset_dict)
writeValue(ROM_COPY, 0x806ADD3A, Overlay.Static, 0x2F5, offset_dict)
# Decouple Camera from Shockwave
writeValue(ROM_COPY, 0x806E9812, Overlay.Static, FLAG_ABILITY_CAMERA, offset_dict) # Usage
writeValue(ROM_COPY, 0x806AB0F6, Overlay.Static, FLAG_ABILITY_CAMERA, offset_dict) # Isles Fairies Display
writeValue(ROM_COPY, 0x806AAFB6, Overlay.Static, FLAG_ABILITY_CAMERA, offset_dict) # Other Fairies Display
writeValue(ROM_COPY, 0x806AA762, Overlay.Static, FLAG_ABILITY_CAMERA, offset_dict) # Film Display
writeValue(ROM_COPY, 0x8060D986, Overlay.Static, FLAG_ABILITY_CAMERA, offset_dict) # Film Refill
writeValue(ROM_COPY, 0x806F6F76, Overlay.Static, FLAG_ABILITY_CAMERA, offset_dict) # Film Refill
writeValue(ROM_COPY, 0x806F916A, Overlay.Static, FLAG_ABILITY_CAMERA, offset_dict) # Film max#
if settings.bonus_barrel_rando:
# Disable training pre-checks
writeValue(ROM_COPY, 0x80698386, Overlay.Static, 0, offset_dict) # Disable ability to use vines in vine barrel unless you have vines
writeValue(ROM_COPY, 0x806E426C, Overlay.Static, 0, offset_dict, 4) # Disable ability to pick up objects in barrel barrel unless you have barrels
writeValue(ROM_COPY, 0x806E7736, Overlay.Static, 0, offset_dict) # Disable ability to dive in dive barrel unless you have dive
writeValue(ROM_COPY, 0x806E2D8A, Overlay.Static, 0, offset_dict) # Disable ability to throw oranges in orange barrel unless you have oranges
writeFunction(ROM_COPY, 0x80698368, Overlay.Static, "checkFlagDuplicate", offset_dict) # Vines doesn't check FLUT
writeFunction(ROM_COPY, 0x8072F190, Overlay.Static, "checkFlagDuplicate", offset_dict) # Vines doesn't check FLUT
writeFunction(ROM_COPY, 0x806E4250, Overlay.Static, "checkFlagDuplicate", offset_dict) # Barrels doesn't check FLUT
writeFunction(ROM_COPY, 0x806E7718, Overlay.Static, "checkFlagDuplicate", offset_dict) # Dive doesn't check FLUT
writeFunction(ROM_COPY, 0x806E2D6C, Overlay.Static, "checkFlagDuplicate", offset_dict) # Oranges doesn't check FLUT
# Files
balloon_patch_count = 150
static_expansion = 0x100
if settings.enemy_drop_rando:
static_expansion += 427 # Total Enemies
if settings.archipelago:
static_expansion += 1000 # Archipelago Flag size
expandSaveFile(ROM_COPY, static_expansion, balloon_patch_count, offset_dict)
# 1-File Fixes
writeValue(ROM_COPY, 0x8060CF34, Overlay.Static, 0x240E0001, offset_dict, 4) # Slot 1
writeValue(ROM_COPY, 0x8060CF38, Overlay.Static, 0x240F0002, offset_dict, 4) # Slot 2
writeValue(ROM_COPY, 0x8060CF3C, Overlay.Static, 0x24180003, offset_dict, 4) # Slot 3
writeValue(ROM_COPY, 0x8060CF40, Overlay.Static, 0x240D0000, offset_dict, 4) # Slot 0
writeValue(ROM_COPY, 0x8060D3AC, Overlay.Static, 0, offset_dict, 4) # Prevent EEPROM Shuffle
writeValue(ROM_COPY, 0x8060DCE8, Overlay.Static, 0, offset_dict, 4) # Prevent EEPROM Shuffle
writeValue(ROM_COPY, 0x8060CD1A, Overlay.Static, 1, offset_dict) # File Loop Cancel 2
writeValue(ROM_COPY, 0x8060CE7E, Overlay.Static, 1, offset_dict) # File Loop Cancel 3
writeValue(ROM_COPY, 0x8060CE5A, Overlay.Static, 1, offset_dict) # File Loop Cancel 4
writeValue(ROM_COPY, 0x8060CF0E, Overlay.Static, 1, offset_dict) # File Loop Cancel 5
writeValue(ROM_COPY, 0x8060CF26, Overlay.Static, 1, offset_dict) # File Loop Cancel 6
writeValue(ROM_COPY, 0x8060D106, Overlay.Static, 1, offset_dict) # File Loop Cancel 8
writeValue(ROM_COPY, 0x8060D43E, Overlay.Static, 1, offset_dict) # File Loop Cancel 8
writeValue(ROM_COPY, 0x8060CD08, Overlay.Static, 0x26670000, offset_dict, 4) # Save to File - File Index
writeValue(ROM_COPY, 0x8060CE48, Overlay.Static, 0x26670000, offset_dict, 4) # Save to File - File Index
writeValue(ROM_COPY, 0x8060CF04, Overlay.Static, 0x26270000, offset_dict, 4) # Save to File - File Index
writeValue(ROM_COPY, 0x8060BFA4, Overlay.Static, 0x252A0000, offset_dict, 4) # Global Block after 1 file entry
writeValue(ROM_COPY, 0x8060E378, Overlay.Static, 0x258D0000, offset_dict, 4) # Global Block after 1 file entry
writeValue(ROM_COPY, 0x8060D33C, Overlay.Static, 0x254B0000, offset_dict, 4) # Global Block after 1 file entry
writeValue(ROM_COPY, 0x8060D470, Overlay.Static, 0x256C0000, offset_dict, 4) # Global Block after 1 file entry
writeValue(ROM_COPY, 0x8060D4B0, Overlay.Static, 0x252A0000, offset_dict, 4) # Global Block after 1 file entry
writeValue(ROM_COPY, 0x8060D558, Overlay.Static, 0x258D0000, offset_dict, 4) # Global Block after 1 file entry
writeValue(ROM_COPY, 0x8060CF74, Overlay.Static, 0x25090000, offset_dict, 4) # Global Block after 1 file entry
writeValue(ROM_COPY, 0x8060D24C, Overlay.Static, 0x25AE0000, offset_dict, 4) # Global Block after 1 file entry
writeValue(ROM_COPY, 0x8060C84C, Overlay.Static, 0xA02067C8, offset_dict, 4) # Force file 0
writeValue(ROM_COPY, 0x8060C654, Overlay.Static, 0x24040000, offset_dict, 4) # Force file 0 - Save
writeValue(ROM_COPY, 0x8060C664, Overlay.Static, 0xAFA00034, offset_dict, 4) # Force file 0 - Save
writeValue(ROM_COPY, 0x8060C6C4, Overlay.Static, 0x24040000, offset_dict, 4) # Force file 0 - Read
writeValue(ROM_COPY, 0x8060C6D4, Overlay.Static, 0xAFA00034, offset_dict, 4) # Force file 0 - Read
writeValue(ROM_COPY, 0x8060D294, Overlay.Static, 0, offset_dict, 4) # Cartridge EEPROM Wipe cancel
# File Select
writeValue(ROM_COPY, 0x80028CB0, Overlay.Menu, 0xA0600000, offset_dict, 4) # SB $r0, 0x0 (v0) - Always view file index 0
writeValue(ROM_COPY, 0x80028CC4, Overlay.Menu, 0, offset_dict, 4) # Prevent file index overwrite
writeValue(ROM_COPY, 0x80028F88, Overlay.Menu, 0, offset_dict, 4) # File 2 render
writeValue(ROM_COPY, 0x80028F60, Overlay.Menu, 0, offset_dict, 4) # File 2 Opacity
writeValue(ROM_COPY, 0x80028FCC, Overlay.Menu, 0, offset_dict, 4) # File 3 render
writeValue(ROM_COPY, 0x80028FA4, Overlay.Menu, 0, offset_dict, 4) # File 3 Opacity
writeValue(ROM_COPY, 0x80028DB8, Overlay.Menu, 0x1040000A, offset_dict, 4) # BEQ $v0, $r0, 0xA - Change text signal
writeValue(ROM_COPY, 0x80028CA6, Overlay.Menu, 5, offset_dict) # Change selecting orange to delete confirm screen
# Move Decoupling
# Strong Kong
writeValue(ROM_COPY, 0x8067ECFC, Overlay.Static, 0x30810002, offset_dict, 4) # ANDI $at $a0 2
writeValue(ROM_COPY, 0x8067ED00, Overlay.Static, 0x50200003, offset_dict, 4) # BEQL $at $r0 3
# Rocketbarrel
writeValue(ROM_COPY, 0x80682024, Overlay.Static, 0x31810002, offset_dict, 4) # ANDI $at $t4 2
writeValue(ROM_COPY, 0x80682028, Overlay.Static, 0x50200006, offset_dict, 4) # BEQL $at $r0 0x6
# OSprint
writeValue(ROM_COPY, 0x8067ECE0, Overlay.Static, 0x30810004, offset_dict, 4) # ANDI $at $a0 4
writeValue(ROM_COPY, 0x8067ECE4, Overlay.Static, 0x10200002, offset_dict, 4) # BEQZ $at, 2
# Mini Monkey
writeValue(ROM_COPY, 0x8067EC80, Overlay.Static, 0x30830001, offset_dict, 4) # ANDI $v1 $a0 1
writeValue(ROM_COPY, 0x8067EC84, Overlay.Static, 0x18600002, offset_dict, 4) # BLEZ $v1 2
# Hunky Chunky (Not Dogadon)
writeValue(ROM_COPY, 0x8067ECA0, Overlay.Static, 0x30810001, offset_dict, 4) # ANDI $at $a0 1
writeValue(ROM_COPY, 0x8067ECA4, Overlay.Static, 0x18200002, offset_dict, 4) # BLEZ $at 2
# PTT
writeValue(ROM_COPY, 0x806E20F0, Overlay.Static, 0x31010002, offset_dict, 4) # ANDI $at $t0 2
writeValue(ROM_COPY, 0x806E20F4, Overlay.Static, 0x5020000F, offset_dict, 4) # BEQL $at $r0 0xF
# PPunch
writeValue(ROM_COPY, 0x806E48F4, Overlay.Static, 0x31810002, offset_dict, 4) # ANDI $at $t4 2
writeValue(ROM_COPY, 0x806E48F8, Overlay.Static, 0x50200074, offset_dict, 4) # BEQL $at $r0 0xF
# Disable Sniper Scope Overlay
writeValue(ROM_COPY, 0x806FF80C, Overlay.Static, 0x00801025, offset_dict, 4) # OR $v0, $a0, $r0
writeValue(ROM_COPY, 0x806FF85C, Overlay.Static, 0x00801025, offset_dict, 4) # OR $v0, $a0, $r0
writeValue(ROM_COPY, 0x806FF8AC, Overlay.Static, 0x00801025, offset_dict, 4) # OR $v0, $a0, $r0
writeValue(ROM_COPY, 0x806FF8FC, Overlay.Static, 0x00801025, offset_dict, 4) # OR $v0, $a0, $r0
writeValue(ROM_COPY, 0x806FF940, Overlay.Static, 0x00801025, offset_dict, 4) # OR $v0, $a0, $r0
writeValue(ROM_COPY, 0x806FF988, Overlay.Static, 0x00801025, offset_dict, 4) # OR $v0, $a0, $r0
writeValue(ROM_COPY, 0x806FF9D0, Overlay.Static, 0x00801025, offset_dict, 4) # OR $v0, $a0, $r0
writeValue(ROM_COPY, 0x806FFA18, Overlay.Static, 0x00801025, offset_dict, 4) # OR $v0, $a0, $r0
writeValue(ROM_COPY, 0x806A7564, Overlay.Static, 0xC4440080, offset_dict, 4) # Crown default floor will be it's initial Y spawn position. Fixes a crash on N64
# Expand Display List
writeValue(ROM_COPY, 0x805FE56A, Overlay.Static, 8000, offset_dict)
writeValue(ROM_COPY, 0x805FE592, Overlay.Static, 0x4100, offset_dict) # SLL 4 (Doubles display list size)
# Sniper Scope Check
writeValue(ROM_COPY, 0x806D2988, Overlay.Static, 0x93190002, offset_dict, 4) # LBU $t9, 0x2 ($t8)
writeValue(ROM_COPY, 0x806D2990, Overlay.Static, 0x33210004, offset_dict, 4) # ANDI $at, $t9, 0x4
writeValue(ROM_COPY, 0x806D299C, Overlay.Static, 0x1020, offset_dict) # BEQ $at, $r0
# EEPROM Patch
writeValue(ROM_COPY, 0x8060D588, Overlay.Static, 0, offset_dict, 4) # NOP
# TEMPORARY FIX FOR SAVE BUG
writeValue(ROM_COPY, 0x8060D790, Overlay.Static, 0, offset_dict, 4) # NOP
# Cancel Tamper
writeValue(ROM_COPY, 0x8060AEFC, Overlay.Static, 0, offset_dict, 4) # NOP
writeValue(ROM_COPY, 0x80611788, Overlay.Static, 0, offset_dict, 4) # NOP
# Fix HUD if DK not free
writeValue(ROM_COPY, 0x806FA324, Overlay.Static, 0, offset_dict, 4) # NOP
writeValue(ROM_COPY, 0x807505AE, Overlay.Static, 385, offset_dict) # Set Flag to DK Flag
# Fix CB Spawning
writeValue(ROM_COPY, 0x806A7882, Overlay.Static, 385, offset_dict) # DK Balloon
# Fix Boss Doors if DK not free
writeValue(ROM_COPY, 0x80649358, Overlay.Static, 0, offset_dict, 4) # NOP
# Fix Pause Menu
writeValue(ROM_COPY, 0x806ABFF8, Overlay.Static, 0, offset_dict, 4) # NOP (Write of first slot to 1)
writeValue(ROM_COPY, 0x806AC002, Overlay.Static, 0x530, offset_dict)
writeValue(ROM_COPY, 0x806AC006, Overlay.Static, 0x5B0, offset_dict)
writeValue(ROM_COPY, 0x8075054D, Overlay.Static, 0xD7, offset_dict, 1) # Change DK Q Mark to #FFD700
if ENABLE_HELM_GBS:
writeValue(ROM_COPY, 0x806A9C80, Overlay.Static, 0, offset_dict, 4) # Level check NOP
writeValue(ROM_COPY, 0x806A9E54, Overlay.Static, 0, offset_dict, 4) # Level check NOP
# Kop Idle Guarantee
writeFunction(ROM_COPY, 0x806AF7F8, Overlay.Static, "setKopIdleGuarantee", offset_dict)
writeFunction(ROM_COPY, 0x806AF89C, Overlay.Static, "giveKopIdleGuarantee", offset_dict)
# Guard Animation Fix
writeValue(ROM_COPY, 0x806AF8C6, Overlay.Static, 0x2C1, offset_dict)
# Remove flare effect from guards
writeValue(ROM_COPY, 0x806AE440, Overlay.Static, 0, offset_dict, 4)
# Boost Diddy/Tiny's Barrel Speed
writeFloat(ROM_COPY, 0x807533A0, Overlay.Static, 240, offset_dict) # Diddy Ground
writeFloat(ROM_COPY, 0x807533A8, Overlay.Static, 240, offset_dict) # Tiny Ground
writeFloat(ROM_COPY, 0x807533DC, Overlay.Static, 260, offset_dict) # Lanky Air
writeFloat(ROM_COPY, 0x807533E0, Overlay.Static, 260, offset_dict) # Tiny Air
# Bump Model Two Allowance
writeValue(ROM_COPY, 0x80632026, Overlay.Static, 550, offset_dict) # Japes
writeValue(ROM_COPY, 0x80632006, Overlay.Static, 550, offset_dict) # Aztec
writeValue(ROM_COPY, 0x80631FF6, Overlay.Static, 550, offset_dict) # Factory
writeValue(ROM_COPY, 0x80632016, Overlay.Static, 550, offset_dict) # Galleon
writeValue(ROM_COPY, 0x80631FE6, Overlay.Static, 550, offset_dict) # Fungi
writeValue(ROM_COPY, 0x80632036, Overlay.Static, 550, offset_dict) # Others
writeFunction(ROM_COPY, 0x80732314, Overlay.Static, "CrashHandler", offset_dict)
writeFunction(ROM_COPY, 0x8073231C, Overlay.Static, "CrashHandler", offset_dict)
writeFunction(ROM_COPY, 0x807322DC, Overlay.Static, "getFaultedThread", offset_dict)
# Deathwarp Handle
writeFunction(ROM_COPY, 0x8071292C, Overlay.Static, "WarpHandle", offset_dict) # Check if in Helm, in which case, apply transition
writeFunction(ROM_COPY, 0x806AD750, Overlay.Static, "beaverExtraHitHandle", offset_dict) # Remove buff until we think of something better
if ENABLE_ALL_KONG_TRANSFORMS:
transform_barrel_collisions = [
0x8074B190, # Hunky
0x8074B1A0, # Mini
0x8074B1B0, # Rocket
0x8074B1C0, # OSprint
0x8074B1D0, # Strong Kong
]
for col in transform_barrel_collisions:
writeValue(ROM_COPY, col, Overlay.Static, 0xFFFF, offset_dict) # Set these barrels to check collisions with all kongs
writeValue(ROM_COPY, 0x8067EC58, Overlay.Static, 0x8CE20058, offset_dict, 4) # Move actor check earlier on
writeValue(ROM_COPY, 0x8067EC5C, Overlay.Static, 0x2C460007, offset_dict, 4) # SLTIU a2, v0, 0x7
writeValue(ROM_COPY, 0x8067EC60, Overlay.Static, 0x2C410007, offset_dict, 4) # SLTIU at, v0, 0x7
writeValue(ROM_COPY, 0x8067EC64, Overlay.Static, 0x2C4A0007, offset_dict, 4) # SLTIU t2, v0, 0x7
writeValue(ROM_COPY, 0x8067ECBC, Overlay.Static, 0x2C410007, offset_dict, 4) # SLTIU at, v0, 0x7
writeValue(ROM_COPY, 0x8067ECC4, Overlay.Static, 0x2C410007, offset_dict, 4) # SLTIU at, v0, 0x7
writeValue(ROM_COPY, 0x8067ECCC, Overlay.Static, 0x2C410007, offset_dict, 4) # SLTIU at, v0, 0x7
writeValue(ROM_COPY, 0x8067EC6C, Overlay.Static, 0x10200008, offset_dict, 4) # BEQZ at, 8 (mini)
writeValue(ROM_COPY, 0x8067EC90, Overlay.Static, 0x10C00007, offset_dict, 4) # BEQZ a2, 7 (hunky)
writeValue(ROM_COPY, 0x8067ECB0, Overlay.Static, 0x10C00006, offset_dict, 4) # BEQZ a2, 6 (hunky)
writeValue(ROM_COPY, 0x8067ECD0, Overlay.Static, 0x10C00007, offset_dict, 4) # BEQZ a2, 7 (sprint)
writeValue(ROM_COPY, 0x8067ECF0, Overlay.Static, 0x11400006, offset_dict, 4) # BEQZ t2, 6 (strong)
writeValue(ROM_COPY, 0x8067ED0C, Overlay.Static, 0x2C410007, offset_dict, 4) # SLTIU at, v0, 0x7
writeValue(ROM_COPY, 0x8067ECF0, Overlay.Static, 0x50200005, offset_dict, 4) # BEQZL at, 5 (enguarde)
writeValue(ROM_COPY, 0x80682008, Overlay.Static, 0x8D4B0058, offset_dict, 4) # Move actor check for RB earlier on
writeValue(ROM_COPY, 0x80682010, Overlay.Static, 0x2D610007, offset_dict, 4) # SLTIU at, t3, 0x7
writeValue(ROM_COPY, 0x80682014, Overlay.Static, 0x5020000B, offset_dict, 4) # BEQZL at, 0xB (RB)
if settings.cannons_require_blast:
# Make Cannon Barrels require BBlast
writeHook(ROM_COPY, 0x8067FE28, Overlay.Static, "makeCannonsRequireBlast", offset_dict)
writeHook(ROM_COPY, 0x806806B4, Overlay.Static, "fixCannonBlastNoclip", offset_dict)
# Item Rando
# Item Get
item_get_addrs = [
0x806F64C8,
0x806F6BA8,
0x806F7740,
0x806F7764,
0x806F7774,
0x806F7798,
0x806F77B0,
0x806F77C4,
0x806F7804,
0x806F781C,
]
for addr in item_get_addrs:
writeFunction(ROM_COPY, addr, Overlay.Static, "getItem", offset_dict) # Modify Function Call
writeFunction(ROM_COPY, 0x806F6350, Overlay.Static, "getObjectCollectability", offset_dict) # Modify Function Call
writeFunction(ROM_COPY, 0x8070E1F0, Overlay.Static, "handleDynamicItemText", offset_dict) # Handle Dynamic Text Item Name
writeFunction(ROM_COPY, 0x806A7AEC, Overlay.Static, "BalloonShoot", offset_dict) # Balloon Shoot Hook
# Rainbow Coins
writeFunction(ROM_COPY, 0x806A222C, Overlay.Static, "getPatchFlag", offset_dict) # Get Patch Flags
writeFunction(ROM_COPY, 0x806A2058, Overlay.Static, "getPatchFlag", offset_dict) # Get Patch Flags
writeValue(ROM_COPY, 0x80688C8E, Overlay.Static, 0x30, offset_dict) # Reduce scope of detecting if balloon or patch, so patches don't have dynamic flags
writeFunction(ROM_COPY, 0x80680AE8, Overlay.Static, "alterBonusVisuals", offset_dict) # Get Bonus Flag Check
writeFunction(ROM_COPY, 0x806A206C, Overlay.Static, "getDirtPatchSkin", offset_dict) # Get Dirt Flag Check
writeFunction(ROM_COPY, 0x80681854, Overlay.Static, "getBonusFlag", offset_dict) # Get Bonus Flag Check
writeFunction(ROM_COPY, 0x806C63A8, Overlay.Static, "getBonusFlag", offset_dict) # Get Bonus Flag Check
writeFunction(ROM_COPY, 0x806F78B8, Overlay.Static, "getKongFromBonusFlag", offset_dict) # Reward Table Kong Check
# Check Screen
writeFunction(ROM_COPY, 0x806A9F98, Overlay.Static, "pauseScreen3And4Header", offset_dict) # Header
writeFunction(ROM_COPY, 0x806AA03C, Overlay.Static, "pauseScreen3And4Counter", offset_dict) # Counter
writeFunction(ROM_COPY, 0x806A86BC, Overlay.Static, "changePauseScreen", offset_dict) # Change screen hook
writeFunction(ROM_COPY, 0x806A8D20, Overlay.Static, "changeSelectedLevel", offset_dict) # Change selected level on checks screen
writeFunction(ROM_COPY, 0x806A84F8, Overlay.Static, "checkItemDB", offset_dict) # Populate Item Databases
writeFunction(ROM_COPY, 0x806A9978, Overlay.Static, "displayHintRegion", offset_dict) # Display hint region
writeValue(ROM_COPY, 0x806A94CC, Overlay.Static, 0x2C610003, offset_dict, 4) # SLTIU $at, $v1, 0x3 (Changes render check for <3 rather than == 3)
writeValue(ROM_COPY, 0x806A94D0, Overlay.Static, 0x10200298, offset_dict, 4) # BEQZ $at, 0x298 (Changes render check for <3 rather than == 3)
writeValue(ROM_COPY, 0x806A932A, Overlay.Static, 12500, offset_dict) # Increase memory allocated for displaying the Pause menu (fixes hints corrupting the heap)
if settings.progressive_hint_item == ProgressiveHintItem.req_cb:
writeFunction(ROM_COPY, 0x806AB4C4, Overlay.Static, "displayCBCount", offset_dict)
# Restore unused events
writeValue(ROM_COPY, 0x800336A4, Overlay.Menu, 7, offset_dict) # Play cutscene 7 (Overwrites one of the leg shakes)
writeValue(ROM_COPY, 0x800336A6, Overlay.Menu, 150, offset_dict) # Set duration as 150
writeValue(ROM_COPY, 0x8003371A, Overlay.Menu, 8, offset_dict) # Play cutscene 8
writeValue(ROM_COPY, 0x8003371C, Overlay.Menu, 150, offset_dict) # Set duration as 150
writeFloatUpper(ROM_COPY, 0x800283D2, Overlay.Menu, 11, offset_dict) # Set randomization function to use 11 values
writeValue(ROM_COPY, 0x80028412, Overlay.Menu, 11 + 1, offset_dict) # Set cap to 12
writeValue(ROM_COPY, 0x8002845A, Overlay.Menu, 11 + 1, offset_dict) # Set cap to 12
if settings.shuffle_items:
writeHook(ROM_COPY, 0x806A6708, Overlay.Static, "SpriteFix", offset_dict)
writeFunction(ROM_COPY, 0x806A78A8, Overlay.Static, "checkFlagDuplicate", offset_dict) # Balloon: Kong Check
writeFunction(ROM_COPY, 0x806AAB3C, Overlay.Static, "checkFlagDuplicate", offset_dict) # Pause: BP Get
writeFunction(ROM_COPY, 0x806AAB9C, Overlay.Static, "checkFlagDuplicate", offset_dict) # Pause: BP In
writeFunction(ROM_COPY, 0x806AAD70, Overlay.Static, "checkFlagDuplicate", offset_dict) # Pause: Fairies
writeFunction(ROM_COPY, 0x806AAF70, Overlay.Static, "checkFlagDuplicate", offset_dict) # Pause: Crowns
writeFunction(ROM_COPY, 0x806AB064, Overlay.Static, "checkFlagDuplicate", offset_dict) # Pause: Isle Crown 1
writeFunction(ROM_COPY, 0x806AB0B4, Overlay.Static, "checkFlagDuplicate", offset_dict) # Pause: Isle Crown 2
writeFunction(ROM_COPY, 0x806ABF00, Overlay.Static, "checkFlagDuplicate", offset_dict) # File Percentage: Keys
writeFunction(ROM_COPY, 0x806ABF78, Overlay.Static, "checkFlagDuplicate", offset_dict) # File Percentage: Crowns
writeFunction(ROM_COPY, 0x806ABFA8, Overlay.Static, "checkFlagDuplicate", offset_dict) # File Percentage: NCoin
writeFunction(ROM_COPY, 0x806ABFBC, Overlay.Static, "checkFlagDuplicate", offset_dict) # File Percentage: RCoin
writeFunction(ROM_COPY, 0x806AC00C, Overlay.Static, "checkFlagDuplicate", offset_dict) # File Percentage: Kongs
writeFunction(ROM_COPY, 0x806BD304, Overlay.Static, "checkFlagDuplicate", offset_dict) # Key flag check: K. Lumsy
writeFunction(ROM_COPY, 0x80731A6C, Overlay.Static, "checkFlagDuplicate", offset_dict) # Count flag-kong array
writeFunction(ROM_COPY, 0x80731AE8, Overlay.Static, "checkFlagDuplicate", offset_dict) # Count flag array
writeFunction(ROM_COPY, 0x806B1E48, Overlay.Static, "countFlagsForKongFLUT", offset_dict) # Kasplat Check Flag
writeValue(ROM_COPY, 0x806F56F8, Overlay.Static, 0, offset_dict, 4) # Disable Flag Set for blueprints
writeFunction(ROM_COPY, 0x806F938C, Overlay.Static, "banana_medal_acquisition", offset_dict) # Medal Give
writeValue(ROM_COPY, 0x806F9394, Overlay.Static, 0, offset_dict, 4)
writeFunction(ROM_COPY, 0x806F5564, Overlay.Static, "itemGrabHook", offset_dict) # Item Get Hook - Post Flag
writeFunction(ROM_COPY, 0x806A6CA8, Overlay.Static, "canItemPersist", offset_dict) # Item Despawn Check
writeValue(ROM_COPY, 0x806A741C, Overlay.Static, 0, offset_dict, 4) # Prevent Key Twinkly Sound
writeFunction(ROM_COPY, 0x80688714, Overlay.Static, "setupHook", offset_dict) # Setup Load Hook
# Fairy Adjustments
writeFunction(ROM_COPY, 0x8072728C, Overlay.Static, "spawnCharSpawnerActor", offset_dict) # Spawn 1
writeValue(ROM_COPY, 0x80727290, Overlay.Static, 0x36050000, offset_dict, 4) # ORI $a1, $s0, 0x0 -> Change second parameter to the spawner
writeFunction(ROM_COPY, 0x8072777C, Overlay.Static, "spawnCharSpawnerActor", offset_dict) # Spawn 2
writeValue(ROM_COPY, 0x80727780, Overlay.Static, 0x36050000, offset_dict, 4) # ORI $a1, $s0, 0x0 -> Change second parameter to the spawner
writeFunction(ROM_COPY, 0x807277D0, Overlay.Static, "spawnCharSpawnerActor", offset_dict) # Spawn 3
writeValue(ROM_COPY, 0x807277D4, Overlay.Static, 0x36050000, offset_dict, 4) # ORI $a1, $s0, 0x0 -> Change second parameter to the spawner
writeFunction(ROM_COPY, 0x80727B88, Overlay.Static, "spawnCharSpawnerActor", offset_dict) # Spawn 4
writeValue(ROM_COPY, 0x80727B8C, Overlay.Static, 0x36050000, offset_dict, 4) # ORI $a1, $s0, 0x0 -> Change second parameter to the spawner
writeFunction(ROM_COPY, 0x80727C10, Overlay.Static, "spawnCharSpawnerActor", offset_dict) # Spawn 4
writeValue(ROM_COPY, 0x80727C14, Overlay.Static, 0x36050000, offset_dict, 4) # ORI $a1, $s0, 0x0 -> Change second parameter to the spawner
writeFunction(ROM_COPY, 0x806C5F04, Overlay.Static, "giveFairyItem", offset_dict) # Fairy Flag Set
# Rainbow Coins
writeFunction(ROM_COPY, 0x806A2268, Overlay.Static, "spawnDirtPatchReward", offset_dict) # Spawn Reward
# Mill GB
writeFunction(ROM_COPY, 0x806F633C, Overlay.Static, "isObjectTangible_detailed", offset_dict) # Change object tangibility check function
writeValue(ROM_COPY, 0x806C5C7C, Overlay.Static, 0, offset_dict, 4) # Cancel out fairy draw distance reduction
writeFunction(ROM_COPY, 0x806C63BC, Overlay.Static, "spawnRewardAtActor", offset_dict) # Spawn Squawks Reward
writeFunction(ROM_COPY, 0x806C4654, Overlay.Static, "spawnMinecartReward", offset_dict) # Spawn Squawks Reward - Minecart
writeFunction(ROM_COPY, 0x8002501C, Overlay.Bonus, "spawnCrownReward", offset_dict) # Crown Spawn
writeFunction(ROM_COPY, 0x80028650, Overlay.Boss, "spawnBossReward", offset_dict) # Key Spawn
writeFunction(ROM_COPY, 0x80027E68, Overlay.Critter, "fairyQueenCutsceneInit", offset_dict) # BFI, Init Cutscene Setup
writeFunction(ROM_COPY, 0x80028104, Overlay.Critter, "fairyQueenCutsceneCheck", offset_dict) # BFI, Cutscene Play
writeFunction(ROM_COPY, 0x80028014, Overlay.Critter, "fairyQueenCheckSpeedup", offset_dict) # BFI, Cutscene Prep
# Flag Stuff
writeFunction(ROM_COPY, 0x80024CF0, Overlay.Menu, "countFlagsDuplicate", offset_dict) # Flag change to FLUT
writeFunction(ROM_COPY, 0x80024854, Overlay.Menu, "checkFlagDuplicate", offset_dict) # Flag change to FLUT
writeFunction(ROM_COPY, 0x80024880, Overlay.Menu, "checkFlagDuplicate", offset_dict) # Flag change to FLUT
writeFunction(ROM_COPY, 0x800248B0, Overlay.Menu, "setFlagDuplicate", offset_dict) # Flag change to FLUT
# Pause Stuff
writeFunction(ROM_COPY, 0x806A9D50, Overlay.Static, "handleOutOfCounters", offset_dict) # Print out of counter, depending on item rando state
writeFunction(ROM_COPY, 0x806A9EFC, Overlay.Static, "handleOutOfCounters", offset_dict) # Print out of counter, depending on item rando state
writeValue(ROM_COPY, 0x806A9C80, Overlay.Static, 0, offset_dict, 4) # Show counter on Helm Menu - Kong specific screeen
writeValue(ROM_COPY, 0x806A9E54, Overlay.Static, 0, offset_dict, 4) # Show counter on Helm Menu - All Kongs screen
# writeValue(ROM_COPY, 0x806AA860, Overlay.Static, 0x31EF0007, offset_dict, 4) # ANDI $t7, $t7, 7 - Show GB (Kong Specific)
# writeValue(ROM_COPY, 0x806AADC4, Overlay.Static, 0x33390007, offset_dict, 4) # ANDI $t9, $t9, 7 - Show GB (All Kongs)
# writeValue(ROM_COPY, 0x806AADC8, Overlay.Static, 0xAFB90058, offset_dict, 4) # SW $t9, 0x58 ($sp) - Show GB (All Kongs)
# Actors with special spawning conditions
writeValue(ROM_COPY, 0x806B4E1A, Overlay.Static, getActorIndex(spoiler.aztec_vulture_actor), offset_dict)
writeValue(ROM_COPY, 0x8069C266, Overlay.Static, getActorIndex(spoiler.japes_rock_actor), offset_dict)
# Melon Crates
writeLabelValue(ROM_COPY, 0x80747EB0, Overlay.Static, "melonCrateItemHandler", offset_dict)
# Initialize fixed item scales
writeFunction(ROM_COPY, 0x806F4918, Overlay.Static, "writeItemScale", offset_dict) # Write scale to collision info
writeValue(ROM_COPY, 0x806F491C, Overlay.Static, 0x87A40066, offset_dict, 4)
# LH $a0, 0x66 ($sp)
writeValue(ROM_COPY, 0x806F4C6E, Overlay.Static, 0x20, offset_dict) # Change size
writeValue(ROM_COPY, 0x806F4C82, Overlay.Static, 0x20, offset_dict) # Change size
writeFunction(ROM_COPY, 0x806F515C, Overlay.Static, "writeItemActorScale", offset_dict) # Write actor scale to collision info
writeFunction(ROM_COPY, 0x80681910, Overlay.Static, "spawnBonusReward", offset_dict) # Spawn Bonus Reward
writeValue(ROM_COPY, 0x806C46AA, Overlay.Static, 0x4100, offset_dict) # Bring squawks closer to the player for minecarts (X)
writeValue(ROM_COPY, 0x806C46E2, Overlay.Static, 0x4100, offset_dict) # Bring squawks closer to the player for minecarts (Z)
writeValue(ROM_COPY, 0x806C45C2, Overlay.Static, 0x0013, offset_dict) # Y Offset squawks reward
if settings.fast_warps:
writeValue(ROM_COPY, 0x806EE692, Overlay.Static, 0x54, offset_dict)
writeFunction(ROM_COPY, 0x806DC2AC, Overlay.Static, "fastWarp", offset_dict) # Modify Function Call
# Collision fixes
QUAD_SIZE = 100
writeValue(ROM_COPY, 0x806F4ACA, Overlay.Static, QUAD_SIZE, offset_dict)
writeValue(ROM_COPY, 0x806F4BF0, Overlay.Static, 0x240A0000 | QUAD_SIZE, offset_dict, 4) # addiu $t2, $zero, QUAD_SIZE
writeValue(ROM_COPY, 0x806F4BF4, Overlay.Static, 0x01510019, offset_dict, 4) # multu $t2, $s1
writeValue(ROM_COPY, 0x806F4BF8, Overlay.Static, 0x00008812, offset_dict, 4) # mflo $s1
writeValue(ROM_COPY, 0x806F4BFC, Overlay.Static, 0, offset_dict, 4) # NOP
writeValue(ROM_COPY, 0x806F4C00, Overlay.Static, 0, offset_dict, 4) # NOP
writeValue(ROM_COPY, 0x806F4C16, Overlay.Static, QUAD_SIZE, offset_dict)
writeValue(ROM_COPY, 0x806F4C52, Overlay.Static, QUAD_SIZE, offset_dict)
writeFunction(ROM_COPY, 0x806F502C, Overlay.Static, "getCollisionSquare_New", offset_dict) # Assigning hitbox to data table
writeFunction(ROM_COPY, 0x806F5134, Overlay.Static, "getCollisionSquare_New", offset_dict) # Assigning hitbox to data table
writeFunction(ROM_COPY, 0x806F6A0C, Overlay.Static, "checkForValidCollision", offset_dict) # Detecting if object is inside current quadrant
writeFunction(ROM_COPY, 0x806F6A2C, Overlay.Static, "checkForValidCollision", offset_dict) # Detecting if object is inside current quadrant
# Make BBBash reference the internal hit counter rather than the displayed one
writeValue(ROM_COPY, 0x8002B4DE, Overlay.Bonus, 0x2A, offset_dict)
writeValue(ROM_COPY, 0x8002B502, Overlay.Bonus, 0x2A, offset_dict)
writeValue(ROM_COPY, 0x8002B55A, Overlay.Bonus, 0x2A, offset_dict)
# Alter amount of Klaptraps in Searchlight seek
writeValue(ROM_COPY, 0x8002C1FA, Overlay.Bonus, KLAPTRAPS_IN_SEARCHLIGHT_SEEK, offset_dict)
writeValue(ROM_COPY, 0x8002C1D2, Overlay.Bonus, KLAPTRAPS_IN_SEARCHLIGHT_SEEK, offset_dict)
writeFunction(ROM_COPY, 0x8062F084, Overlay.Static, "setFog", offset_dict)
# Fix issues where multiple loaded fairies will only allow 1 fairy to be referenced
if FAIRY_LOAD_FIX:
# Paad Offset | Actor offset | var name
# 038 | 1B0 | ScreenX
# 03A | 1B2 | ScreenY
# 03C | 1B4 | Dist
# 03E | 1B6 | In Range
FAIRY_SCREEN_X = 0x1B0
FAIRY_SCREEN_Y = 0x1B2
FAIRY_SCREEN_DIST = 0x1B4
FAIRY_SCREEN_RANGE = 0x1B6
writeValue(ROM_COPY, 0x806C5DA0, Overlay.Static, 0x8D4CBB40, offset_dict, 4) # lw $t4, 0xBB40 ($t2) - Get current actor pointer
writeValue(ROM_COPY, 0x806C5DA4, Overlay.Static, 0x2550D580, offset_dict, 4) # addiu $s0, $t2, 0xD580 - Get extra player pointer addr (Overwritten)
writeValue(ROM_COPY, 0x806C5DA8, Overlay.Static, 0x8D4AC924, offset_dict, 4) # lw $t2, 0xC924 ($t2) - Get char change pointer (overwritten)
writeValue(ROM_COPY, 0x806C5DAC, Overlay.Static, 0x85820000 | FAIRY_SCREEN_X, offset_dict, 4) # lh $v0, 0x01B0 ($t4) - Get screen X in fairy storage
writeValue(ROM_COPY, 0x806C5DB0, Overlay.Static, 0xC5500284, offset_dict, 4) # lwc1 $f16, 0x0284 ($t2) - Get some char spawner attr (Overwritten)
# writeValue(ROM_COPY, 0x806C5DB8, Overlay.Static, 0xA5800000 | FAIRY_SCREEN_RANGE, offset_dict, 4) # sh $zero, 0x1B6 ($t4) - Store fairy not in box
writeValue(ROM_COPY, 0x806C5DB8, Overlay.Static, 0x00000000, offset_dict, 4) # NOP
writeValue(ROM_COPY, 0x806C5DCC, Overlay.Static, 0x00000000, offset_dict, 4) # NOP
writeValue(ROM_COPY, 0x806C5DD0, Overlay.Static, 0x85820000 | FAIRY_SCREEN_Y, offset_dict, 4) # lh $v0, 0x01B2 ($t4) - Get screen Y in fairy storage
if not isQoLEnabled(spoiler, MiscChangesSelected.better_fairy_camera):
writeValue(ROM_COPY, 0x806C5DE4, Overlay.Static, 0x00000000, offset_dict, 4) # NOP
writeValue(ROM_COPY, 0x806C5DE8, Overlay.Static, 0x858B0000 | FAIRY_SCREEN_DIST, offset_dict, 4) # lh $t3, 0x01B4 ($t4) - Get max dist in fairy storage
writeValue(ROM_COPY, 0x806C5E00, Overlay.Static, 0x45000016, offset_dict, 4) # bc1f 0x16 - Free up one slot so we can store the box addr
writeValue(ROM_COPY, 0x806C5E08, Overlay.Static, 0x24010001, offset_dict, 4) # li $at, 1 - Shift this one addr earlier
writeValue(ROM_COPY, 0x806C5E0C, Overlay.Static, 0xA5810000 | FAIRY_SCREEN_RANGE, offset_dict, 4) # sh $at, 0x1b6 ($t4) - Store fairy as in box
writeValue(
ROM_COPY, 0x806C5E10, Overlay.Static, 0x904D01EC, offset_dict, 4
) # lbu $t5 0x01EC ($v0) - Fix the reference address since we're no longer storing a copy of extra player pointer to t4
# Storage
writeHook(ROM_COPY, 0x806C5FA8, Overlay.Static, "storeFairyData", offset_dict)
# Check
writeValue(ROM_COPY, 0x806C5EA8, Overlay.Static, 0x3C108080, offset_dict, 4) # lui $s0, 0x8080
writeValue(ROM_COPY, 0x806C5EAC, Overlay.Static, 0x8E0ABB40, offset_dict, 4) # lw $t2, 0xBB40 ($s0)
writeValue(ROM_COPY, 0x806C5EB0, Overlay.Static, 0x854A0000 | FAIRY_SCREEN_RANGE, offset_dict, 4) # lh $t2, 0x01B6 ($t2)
writeValue(ROM_COPY, 0x806C5EB4, Overlay.Static, 0x1140001B, offset_dict, 4) # beqz $t2, 0x1B
# Face controllers
writeHook(ROM_COPY, 0x806C5E88, Overlay.Static, "setSadFace", offset_dict)
writeHook(ROM_COPY, 0x806C5E3C, Overlay.Static, "setHappyFace", offset_dict)
writeFunction(ROM_COPY, 0x806CAAA0, Overlay.Static, "resetPictureStatus", offset_dict)
# Thankfully currentactor is loaded into a0.
# I don't think we can sneak in creating the other JALs necessary to calculate distance.
# We could make this part of "better fairy camera"? This means those calcuations don't need to be made.
if JP_TEXTBOX_SIZES:
needs_textboxes_for_hints = False
if settings.progressive_hint_item == ProgressiveHintItem.off: # Progressive hints are disabled, hints are on doors
if settings.wrinkly_hints != WrinklyHints.off: # Hints have something of value
needs_textboxes_for_hints = True
if settings.item_reward_previews: # Textboxes will detail information about the item
needs_textboxes_for_hints = True
if needs_textboxes_for_hints:
writeValue(ROM_COPY, 0x8075A788, Overlay.Static, 0x40026666, offset_dict, 4)
writeValue(ROM_COPY, 0x8075A78C, Overlay.Static, 0x60000000, offset_dict, 4)
writeValue(ROM_COPY, 0x8075A790, Overlay.Static, 0x4064B333, offset_dict, 4)
writeValue(ROM_COPY, 0x8075A794, Overlay.Static, 0x20000000, offset_dict, 4)
writeFloat(ROM_COPY, 0x8075A7A0, Overlay.Static, 165.6, offset_dict)
writeFloat(ROM_COPY, 0x8075A7A4, Overlay.Static, 96.6, offset_dict)
writeValue(ROM_COPY, 0x8075A7A8, Overlay.Static, 0x4056A666, offset_dict, 4)
writeValue(ROM_COPY, 0x8075A7AC, Overlay.Static, 0x60000000, offset_dict, 4)
writeValue(ROM_COPY, 0x8075E4A0, Overlay.Static, 0x40633333, offset_dict, 4)
writeValue(ROM_COPY, 0x8075E4A4, Overlay.Static, 0x20000000, offset_dict, 4)
writeValue(ROM_COPY, 0x806A42B6, Overlay.Static, 0x6000, offset_dict) # Increase a malloc
writeValue(ROM_COPY, 0x806F8C20, Overlay.Static, 0x5000, offset_dict) # Remove GB HUD
if FRAMEBUFFER_STORE_FIX:
writeHook(ROM_COPY, 0x8070A848, Overlay.Static, "disableFBStore", offset_dict)
writeHook(ROM_COPY, 0x8070B05C, Overlay.Static, "disableFBZip0", offset_dict)
writeHook(ROM_COPY, 0x80709BC4, Overlay.Static, "disableFBZip1", offset_dict)
writeHook(ROM_COPY, 0x8061134C, Overlay.Static, "disableFBZip2", offset_dict)
writeHook(ROM_COPY, 0x80629230, Overlay.Static, "disableFBMisc", offset_dict)
# Spawn Enemy Drops function
enemy_drop_addrs = [
0x806AD40C,
0x806AED14,
0x806AF5A4,
0x806B0218,
0x806B0704,
0x806B0C8C,
0x806B1C88,
0x806B4744,
0x806B5B90,
0x806B61E0,
0x806B744C,
0x806B9AB4,
]
for addr in enemy_drop_addrs:
writeFunction(ROM_COPY, addr, Overlay.Static, "spawnEnemyDrops", offset_dict)
if settings.no_healing:
writeValue(ROM_COPY, 0x80683A34, Overlay.Static, 0, offset_dict, 4) # Cancel Tag Health Refill
writeValue(ROM_COPY, 0x806CB340, Overlay.Static, 0, offset_dict, 4) # Voiding
writeValue(ROM_COPY, 0x806DEFE4, Overlay.Static, 0, offset_dict, 4) # Fairies
writeValue(ROM_COPY, 0x806A6EA8, Overlay.Static, 0, offset_dict, 4) # Bonus Barrels
writeValue(ROM_COPY, 0x800289B0, Overlay.Boss, 0, offset_dict, 4) # K Rool between-phase health refilll
else:
writeValue(ROM_COPY, 0x806A6EA8, Overlay.Static, 0x0C1C2519, offset_dict, 4) # Set Bonus Barrel to refill health
writeFunction(ROM_COPY, 0x80025564, Overlay.Boss, "refillHealthOnInit", offset_dict) # Army Dillo
writeFunction(ROM_COPY, 0x8002A9B0, Overlay.Boss, "refillHealthOnInit", offset_dict) # Dogadon
writeFunction(ROM_COPY, 0x80033B70, Overlay.Boss, "refillHealthOnInit", offset_dict) # Mad Jack
writeFunction(ROM_COPY, 0x800294C0, Overlay.Boss, "refillHealthOnInit", offset_dict) # Pufftoss
writeFunction(ROM_COPY, 0x80031C6C, Overlay.Boss, "refillPlayerHealthKKO", offset_dict) # KKO
if settings.warp_to_isles:
writeHook(ROM_COPY, 0x806A995C, Overlay.Static, "PauseExtraSlotCode", offset_dict)
writeHook(ROM_COPY, 0x806A9818, Overlay.Static, "PauseExtraHeight", offset_dict)
writeHook(ROM_COPY, 0x806A87BC, Overlay.Static, "PauseExtraSlotClamp0", offset_dict)
writeHook(ROM_COPY, 0x806A8760, Overlay.Static, "PauseExtraSlotClamp1", offset_dict)
writeHook(ROM_COPY, 0x806A8804, Overlay.Static, "PauseExtraSlotCustomCode", offset_dict)
writeHook(ROM_COPY, 0x806A9898, Overlay.Static, "PauseCounterCap", offset_dict)
# Pause Menu Exit To Isles Slot
writeValue(ROM_COPY, 0x806A85EE, Overlay.Static, 4, offset_dict) # Yes/No Prompt
writeValue(ROM_COPY, 0x806A8716, Overlay.Static, 4, offset_dict) # Yes/No Prompt
# writeValue(ROM_COPY, 0x806A87BE, Overlay.Static, 3, offset_dict)
writeValue(ROM_COPY, 0x806A880E, Overlay.Static, 4, offset_dict) # Yes/No Prompt
# writeValue(ROM_COPY, 0x806A8766, Overlay.Static, 4, offset_dict)
writeValue(ROM_COPY, 0x806A986A, Overlay.Static, 4, offset_dict) # Yes/No Prompt
writeValue(ROM_COPY, 0x806A9990, Overlay.Static, 0x2A210000 | 0x270, offset_dict, 4) # SLTI $at, $s1, 0x270 (y_cap = 0x270)
# Big Head Static stuff
writeValue(ROM_COPY, 0x80612E98, Overlay.Static, 0xA4850172, offset_dict, 4) # sh $a1, 0x172 ($a0)
writeValue(ROM_COPY, 0x80612E9E, Overlay.Static, 0xBB30, offset_dict) # change lhu offset
# Fix fairies to not drain items
writeFunction(ROM_COPY, 0x806DEFFC, Overlay.Static, "refillIfRefillable", offset_dict)
if settings.item_reward_previews:
writeValue(ROM_COPY, 0x8002489C, Overlay.Race, 0, offset_dict, 4) # Beetle Races
writeValue(ROM_COPY, 0x8002BA9C, Overlay.Race, 0, offset_dict, 4) # Castle Car Race
writeValue(ROM_COPY, 0x80028580, Overlay.Race, 0, offset_dict, 4) # Factory Car Race
# Pause Stuff
FLAG_BP_JAPES_DK_HAS = 0x1D5
# Prevent GBs being required to view extra screens
writeValue(ROM_COPY, 0x806A8624, Overlay.Static, 0, offset_dict, 4) # GBs doesn't lock other pause screens
writeValue(ROM_COPY, 0x806AB468, Overlay.Static, 0, offset_dict, 4) # Show R/Z Icon
writeValue(ROM_COPY, 0x806AB318, Overlay.Static, 0x24060001, offset_dict, 4) # ADDIU $a2, $r0, 1
writeValue(ROM_COPY, 0x806AB31C, Overlay.Static, 0xA466C83C, offset_dict, 4) # SH $a2, 0xC83C ($v1) | Overwrite trap func, Replace with overwrite of wheel segments
writeValue(ROM_COPY, 0x8075056C, Overlay.Static, 201, offset_dict) # Change GB Item cap to 201
# In-Level IGT
writeFunction(ROM_COPY, 0x8060DF28, Overlay.Static, "updateLevelIGT", offset_dict)
# Modify Function Call
writeFunction(ROM_COPY, 0x806ABB0C, Overlay.Static, "printLevelIGT", offset_dict)
# Modify Function Call
writeValue(ROM_COPY, 0x806ABB32, Overlay.Static, 106, offset_dict) # Adjust kong name height
# Disable Item Checks
writeValue(ROM_COPY, 0x806AB2E8, Overlay.Static, 0, offset_dict, 4)
writeValue(ROM_COPY, 0x806AB360, Overlay.Static, 0, offset_dict, 4)
writeValue(ROM_COPY, 0x806ABFCE, Overlay.Static, FLAG_BP_JAPES_DK_HAS, offset_dict) # Change BP trigger to being collecting BP rather than turning it in
if isQoLEnabled(spoiler, MiscChangesSelected.fast_pause_transitions):
writeFloat(ROM_COPY, 0x8075AC00, Overlay.Static, 1.3, offset_dict) # Pause Menu Progression Rate
writeValue(ROM_COPY, 0x806A901C, Overlay.Static, 4, offset_dict, 4) # NOP - Remove thud
writeFunction(ROM_COPY, 0x806A84C8, Overlay.Static, "updateFileVariables", offset_dict) # Update file variables to transfer old locations to current
updateActorFunction(ROM_COPY, 340, "handleBugEnemy")
writeFunction(ROM_COPY, 0x80714168, Overlay.Static, "fixHelmTimerDisable", offset_dict)
if Types.Hint in spoiler.settings.shuffled_location_types:
writeValue(ROM_COPY, 0x8069E18C, Overlay.Static, 0x00003025, offset_dict, 4) # or a2, zero, zero
# Alter data for zinger flamethrower enemy
writeValue(ROM_COPY, 0x8075F210, Overlay.Static, 345 + (CustomActors.ZingerFlamethrower - 0x8000), offset_dict)
writeValue(ROM_COPY, 0x8075F212, Overlay.Static, Model.Zinger + 1, offset_dict)
writeValue(ROM_COPY, 0x8075F214, Overlay.Static, 0x250, offset_dict)
writeValue(ROM_COPY, 0x8075F216, Overlay.Static, 0, offset_dict)
writeValue(ROM_COPY, 0x8075F218, Overlay.Static, 0, offset_dict, 4)
writeValue(ROM_COPY, 0x8075F21C, Overlay.Static, 0xAA460508, offset_dict, 4)
writeValue(ROM_COPY, 0x8075F220, Overlay.Static, 0x08020A0A, offset_dict, 4)
writeValue(ROM_COPY, 0x8075F224, Overlay.Static, 0x5E5E0100, offset_dict, 4)
# Make Flame Zingers not lag the game *as* bad
writeValue(ROM_COPY, 0x806B3E36, Overlay.Static, 3, offset_dict) # Change flame-spitting to once every 3f
writeValue(ROM_COPY, 0x806B3E38, Overlay.Static, 0x5700, offset_dict) # BEQL -> BNEL
# Alter data for bug enemy
writeValue(ROM_COPY, 0x8075F0F0, Overlay.Static, 345 + (CustomActors.Scarab - 0x8000), offset_dict)
writeValue(ROM_COPY, 0x8075F0F2, Overlay.Static, 0x118 + 1, offset_dict)
writeValue(ROM_COPY, 0x8075F0F4, Overlay.Static, 0x281, offset_dict)
writeValue(ROM_COPY, 0x8075F0F6, Overlay.Static, 0, offset_dict)
writeValue(ROM_COPY, 0x8075F0F8, Overlay.Static, 1, offset_dict, 4)
writeValue(ROM_COPY, 0x8075F0FC, Overlay.Static, 0xAA465A1E, offset_dict, 4)
writeValue(ROM_COPY, 0x8075F100, Overlay.Static, 0x05030602, offset_dict, 4)
writeValue(ROM_COPY, 0x8075F104, Overlay.Static, 0x5E5E0164, offset_dict, 4)
writeValue(ROM_COPY, 0x8074B21E, Overlay.Static, 0xFF8, offset_dict) # Allow other moves to knock down the bug
writeLabelValue(ROM_COPY, 0x8074B244, Overlay.Static, "fixed_scarab_collision", offset_dict) # Collision
# Statistics
writeFunction(ROM_COPY, 0x806C8ED0, Overlay.Static, "updateTagStat", offset_dict)
writeFunction(ROM_COPY, 0x805FE86C, Overlay.Static, "updateEnemyKillStat", offset_dict) # Also updates K. Rool kong for MJ/Doga 2
writeFunction(ROM_COPY, 0x806E9C50, Overlay.Static, "updateFairyStat", offset_dict)
writeFunction(ROM_COPY, 0x806C7298, Overlay.Static, "createEndSeqCreditsFile", offset_dict)
if isQoLEnabled(spoiler, MiscChangesSelected.remove_extraneous_cutscenes):
writeValue(ROM_COPY, 0x80024174, Overlay.Boss, 0, offset_dict, 4) # Japes Dillo Long Intro
writeValue(ROM_COPY, 0x80025CAC, Overlay.Boss, 0, offset_dict, 4) # Japes Dillo Long Intro
writeValue(ROM_COPY, 0x800291E8, Overlay.Boss, 0, offset_dict, 4) # Generic Boss Intros
writeValue(ROM_COPY, 0x8002B480, Overlay.Boss, 0, offset_dict, 4) # Fungi Dogadon Long Intro
writeValue(ROM_COPY, 0x80033BB4, Overlay.Boss, 0, offset_dict, 4) # Mad Jack Long Intro
writeValue(ROM_COPY, 0x8074452C, Overlay.Static, 1, offset_dict, 1) # Story Skip starts with on
# Flag Mapping
flag_map_hi = getHiSym("new_flag_mapping")
flag_map_lo = getLoSym("new_flag_mapping")
flag_map_count = getVar("gb_dictionary_count")
writeKongItemOwnership(ROM_COPY, settings)
writeValue(ROM_COPY, 0x8073150A, Overlay.Static, flag_map_hi, offset_dict)
writeValue(ROM_COPY, 0x8073151E, Overlay.Static, flag_map_lo, offset_dict)
writeValue(ROM_COPY, 0x8073151A, Overlay.Static, flag_map_count, offset_dict)
writeValue(ROM_COPY, 0x807315EA, Overlay.Static, flag_map_hi, offset_dict)
writeValue(ROM_COPY, 0x807315FE, Overlay.Static, flag_map_lo, offset_dict)
writeValue(ROM_COPY, 0x807315FA, Overlay.Static, flag_map_count, offset_dict)
writeValue(ROM_COPY, 0x80731666, Overlay.Static, flag_map_hi, offset_dict)
writeValue(ROM_COPY, 0x80731676, Overlay.Static, flag_map_lo, offset_dict)
writeValue(ROM_COPY, 0x80731672, Overlay.Static, flag_map_count, offset_dict)
writeHook(ROM_COPY, 0x8072F3DC, Overlay.Static, "blockTreeClimbing", offset_dict)
if settings.enable_tag_anywhere:
# Reduce TA Cooldown
writeFunction(ROM_COPY, 0x806F5BE8, Overlay.Static, "tagAnywhereAmmo", offset_dict)
writeFunction(ROM_COPY, 0x806F5A08, Overlay.Static, "tagAnywhereBunch", offset_dict)
writeFunction(ROM_COPY, 0x806F6CB4, Overlay.Static, "tagAnywhereInit", offset_dict)
# Fix Origin Warp with TA
writeFunction(ROM_COPY, 0x8072F1E8, Overlay.Static, "handleGrabbingLock", offset_dict)
writeFunction(ROM_COPY, 0x806CAB68, Overlay.Static, "handleLedgeLock", offset_dict)
writeFunction(ROM_COPY, 0x8072F458, Overlay.Static, "handleActionSet", offset_dict) # Actor grabbables
writeFunction(ROM_COPY, 0x8072F46C, Overlay.Static, "handleActionSet", offset_dict) # Model 2 grabbables
writeFunction(ROM_COPY, 0x806CFC64, Overlay.Static, "handleActionSet", offset_dict) # Ledge Grabbing
writeFunction(ROM_COPY, 0x806E5418, Overlay.Static, "handleActionSet", offset_dict) # Instrument Play
writeFunction(ROM_COPY, 0x806E6064, Overlay.Static, "handleActionSet", offset_dict) # Gun Pull
if settings.bonus_barrel_auto_complete:
writeValue(ROM_COPY, 0x806818DE, Overlay.Static, 0x4248, offset_dict) # Make Aztec Lobby GB spawn above the trapdoor)
writeValue(ROM_COPY, 0x80681690, Overlay.Static, 0, offset_dict, 4) # Make some barrels not play a cutscene
writeValue(ROM_COPY, 0x8068188C, Overlay.Static, 0, offset_dict, 4) # Prevent disjoint mechanic for Caves/Fungi BBlast Bonus
writeValue(ROM_COPY, 0x80681898, Overlay.Static, 0x1000, offset_dict)
writeValue(ROM_COPY, 0x8068191C, Overlay.Static, 0, offset_dict, 4) # Remove Oh Banana
writeValue(ROM_COPY, 0x80680986, Overlay.Static, 0xFFFE, offset_dict) # Prevent Factory BBBandit Bonus dropping
writeValue(ROM_COPY, 0x806809C8, Overlay.Static, 0x1000, offset_dict) # Prevent Fungi TTTrouble Bonus dropping
writeValue(ROM_COPY, 0x80681962, Overlay.Static, 1, offset_dict) # Make bonus noclip
writeFunction(ROM_COPY, 0x80681158, Overlay.Static, "completeBonus", offset_dict)
if settings.helm_hurry:
writeFunction(ROM_COPY, 0x806A8A18, Overlay.Static, "QuitGame", offset_dict) # Save game on quit
writeValue(ROM_COPY, 0x80713CCC, Overlay.Static, 0, offset_dict, 4) # Prevent Helm Timer Disable
writeValue(ROM_COPY, 0x80713CD8, Overlay.Static, 0, offset_dict, 4) # Prevent Shutdown Song Playing
writeValue(ROM_COPY, 0x8071256A, Overlay.Static, 15, offset_dict) # Init Helm Timer = 15 minutes
writeFunction(ROM_COPY, 0x807125A4, Overlay.Static, "initHelmHurry", offset_dict) # Change write
writeFunction(ROM_COPY, 0x80713DE0, Overlay.Static, "finishHelmHurry", offset_dict) # Change write
writeValue(ROM_COPY, 0x807125CC, Overlay.Static, 0, offset_dict, 4) # Prevent Helm Timer Overwrite
writeValue(ROM_COPY, 0x807095BE, Overlay.Static, 0x2D4, offset_dict) # Change Zipper with K. Rool Laugh
elif IsItemSelected(settings.hard_mode, settings.hard_mode_selected, HardModeSelected.strict_helm_timer, False):
# We cannot have both helm hurry and strict helm timer. Make helm hurry the most dominant setting
writeValue(ROM_COPY, 0x8071256A, Overlay.Static, 0, offset_dict) # Set start time of helm to 0 seconds
if settings.wrinkly_location_rando or settings.remove_wrinkly_puzzles:
writeValue(ROM_COPY, 0x8064F170, Overlay.Static, 0, offset_dict, 4) # Prevent edge cases for Aztec Chunky/Fungi Wheel
writeFunction(ROM_COPY, 0x8069E154, Overlay.Static, "getWrinklyLevelIndex", offset_dict) # Modify Function Call
if settings.tns_location_rando:
# Adjust warp code to make camera be behind player, loading portal
writeValue(ROM_COPY, 0x806C97D0, Overlay.Static, 0xA06E0007, offset_dict, 4) # SB $t6, 0x7 ($v1)
if IsItemSelected(settings.cb_rando_enabled, settings.cb_rando_list_selected, Levels.JungleJapes):
writeValue(ROM_COPY, 0x8069C2FC, Overlay.Static, 0, offset_dict, 4) # Japes Bunch
if IsItemSelected(settings.cb_rando_enabled, settings.cb_rando_list_selected, Levels.DKIsles):
writeFunction(ROM_COPY, 0x806ABF48, Overlay.Static, "getMedalCount", offset_dict)
writeValue(ROM_COPY, 0x806AA458, Overlay.Static, 0, offset_dict, 4) # Show CBs on Pause Menu (Main Screen)
writeValue(ROM_COPY, 0x806AA858, Overlay.Static, 0, offset_dict, 4) # Show CBs on Pause Menu (Level Kong Screen)
# TODO: Work on Level Totals screen - this one is a bit more complicated
writeFunction(ROM_COPY, 0x8002D6A8, Overlay.Bonus, "warpOutOfArenas", offset_dict) # Enable the two arenas to be minigames
writeFunction(ROM_COPY, 0x8002D31C, Overlay.Bonus, "ArenaTagKongCode", offset_dict) # Tag Rambi/Enguarde Instantly
writeFunction(ROM_COPY, 0x8002D6DC, Overlay.Bonus, "ArenaEarlyCompletionCheck", offset_dict) # Check completion
writeFunction(ROM_COPY, 0x8002D20C, Overlay.Boss, "SpiderBossExtraCode", offset_dict) # Handle preventing spider boss being re-fightable
# HUD Reallocation
writeFunction(ROM_COPY, 0x806F48C8, Overlay.Static, "allocateHUD", offset_dict)
writeFunction(ROM_COPY, 0x806C9C60, Overlay.Static, "allocateHUD", offset_dict)
writeFunction(ROM_COPY, 0x806C90A8, Overlay.Static, "allocateHUD", offset_dict)
writeFunction(ROM_COPY, 0x8002664C, Overlay.Menu, "allocateHUD", offset_dict)
writeFunction(ROM_COPY, 0x806F97D8, Overlay.Static, "getHUDSprite_Complex", offset_dict)
writeFunction(ROM_COPY, 0x806BE4E4, Overlay.Static, "getHUDSprite_Complex", offset_dict)
writeFunction(ROM_COPY, 0x806AB588, Overlay.Static, "getHUDSprite_Complex", offset_dict)
writeFunction(ROM_COPY, 0x806F98E4, Overlay.Static, "initHUDDirection", offset_dict) # HUD Direction
writeFunction(ROM_COPY, 0x806F9A00, Overlay.Static, "initHUDDirection", offset_dict) # HUD Direction
writeFunction(ROM_COPY, 0x806F9A78, Overlay.Static, "initHUDDirection", offset_dict) # HUD Direction
writeFunction(ROM_COPY, 0x806F9BC0, Overlay.Static, "initHUDDirection", offset_dict) # HUD Direction
writeFunction(ROM_COPY, 0x806F9D14, Overlay.Static, "initHUDDirection", offset_dict) # HUD Direction
writeHook(ROM_COPY, 0x80639F44, Overlay.Static, "disableRouletteNumbers", offset_dict) # Disable Roulette numbers during pause
writeHook(ROM_COPY, 0x806F93E0, Overlay.Static, "updateBarrierNumbers", offset_dict) # Update barrier numbers
writeFunction(ROM_COPY, 0x806D9E08, Overlay.Static, "fixUpdraftBug", offset_dict) # Updraft fix
if settings.perma_death:
writeValue(ROM_COPY, 0x8064EC00, Overlay.Static, 0x24020001, offset_dict, 4)
writeHook(ROM_COPY, 0x80682F2C, Overlay.Static, "permaLossTagCheck", offset_dict)
writeHook(ROM_COPY, 0x80683620, Overlay.Static, "permaLossTagSet", offset_dict)
writeHook(ROM_COPY, 0x806840C4, Overlay.Static, "permaLossTagDisplayCheck", offset_dict)
if isFasterCheckEnabled(spoiler, FasterChecksSelected.factory_toy_monster_fight):
writeValue(ROM_COPY, 0x806BBB22, Overlay.Static, 5, offset_dict) # Chunky toy box speedup
writeActorHealth(ROM_COPY, 228, 12) # Change BHDM Health (16 -> 12)
if isFasterCheckEnabled(spoiler, FasterChecksSelected.jetpac):
writeValue(ROM_COPY, 0x80027DCA, Overlay.Jetpac, 2500, offset_dict) # Jetpac score requirement
if isFasterCheckEnabled(spoiler, FasterChecksSelected.forest_owl_race):
writeValue(ROM_COPY, 0x806C58D6, Overlay.Static, 8, offset_dict) # Owl ring amount
writeValue(ROM_COPY, 0x806C5B16, Overlay.Static, 8, offset_dict) # Owl ring amount
if isFasterCheckEnabled(spoiler, FasterChecksSelected.forest_rabbit_race):
writeValue(ROM_COPY, 0x806BEDFC, Overlay.Static, 0, offset_dict, 4) # Spawn banana coins on beating rabbit 2 (Beating round 2 branches to banana coin spawning label before continuing)
file_init_flags.append(0xF8) # Rabbit Race Round 1
if isFasterCheckEnabled(spoiler, FasterChecksSelected.caves_ice_tomato_minigame):
writeValue(ROM_COPY, 0x806BC582, Overlay.Static, 30, offset_dict) # Ice Tomato Timer
if isFasterCheckEnabled(spoiler, FasterChecksSelected.factory_car_race):
writeValue(ROM_COPY, 0x8002D03A, Overlay.Race, 1, offset_dict) # Factory Car Race 1 Lap
if isFasterCheckEnabled(spoiler, FasterChecksSelected.castle_car_race):
writeValue(ROM_COPY, 0x8002D096, Overlay.Race, 1, offset_dict) # Castle Car Race 1 Lap
if isFasterCheckEnabled(spoiler, FasterChecksSelected.galleon_seal_race):
writeValue(ROM_COPY, 0x8002D0E2, Overlay.Race, 1, offset_dict) # Seal Race 1 Lap
if settings.galleon_water_internal == GalleonWaterSetting.raised:
file_init_flags.append(0xA0) # Galleon Water Raised
kong_flags = [0x181, 0x006, 0x046, 0x042, 0x075]
if settings.starting_kongs_count == 5:
file_init_flags.extend(kong_flags.copy())
else:
for x in spoiler.settings.starting_kong_list:
file_init_flags.append(kong_flags[x])
if settings.activate_all_bananaports == ActivateAllBananaports.isles:
file_init_flags.extend(WARPS_ISLES.copy())
elif settings.activate_all_bananaports == ActivateAllBananaports.isles_inc_helm_lobby:
file_init_flags.extend(WARPS_ISLES.copy())
file_init_flags.extend(WARPS_HELM_LOBBY.copy())
elif settings.activate_all_bananaports == ActivateAllBananaports.all:
for lvl in WARPS_TOTAL:
file_init_flags.extend(lvl.copy())
SCREEN_SHAKE_CAP = 7
screen_shake_cap_patch = {
0x8061F0C8: [
0x30A500FF, # andi a1, a1, 0xFF
0x2CC10000 | SCREEN_SHAKE_CAP, # sltiu at, a2, SCREEN_SHAKE_CAP
0x50200001, # beql at, r0, 1
0x24060000 | SCREEN_SHAKE_CAP, # addiu a2, r0, SCREEN_SHAKE_CAP
0x24010001, # li at, 1
],
0x8061F0E4: [
0x00063082, # srl a2, a2, 2
0x00000000, # nop
],
}
for addr_head in screen_shake_cap_patch:
for offset, value in enumerate(screen_shake_cap_patch[addr_head]):
writeValue(ROM_COPY, addr_head + (4 * offset), Overlay.Static, value, offset_dict, 4)
if IsItemSelected(settings.hard_mode, settings.hard_mode_selected, HardModeSelected.angry_caves, False):
writeValue(ROM_COPY, 0x807480F4, Overlay.Static, 1, offset_dict, 4) # Constant rockfall
writeValue(ROM_COPY, 0x807480FC, Overlay.Static, 15, offset_dict, 4) # Increase rockfall spawn rate (Every 20f -> 15f)
writeValue(ROM_COPY, 0x806466D4, Overlay.Static, 0, offset_dict, 4) # Kosha is alive no matter what
writeValue(ROM_COPY, 0x806465DC, Overlay.Static, 0x1000, offset_dict) # Kosha is alive no matter what
accel = -90
if settings.damage_amount in (DamageAmount.quad, DamageAmount.ohko):
# Lower the velocity to make it a little fairer in scenarios where you're gonna die from not too many hits
accel = -45
writeFloat(ROM_COPY, 0x80750398, Overlay.Static, accel, offset_dict) # Stalactite Acceleration
writeValue(ROM_COPY, 0x806A04E2, Overlay.Static, 0, offset_dict) # Disable cam shake
writeValue(ROM_COPY, 0x806A051C, Overlay.Static, 0x1000001D, offset_dict, 4) # Disable particles, lag reasons
writeFunction(ROM_COPY, 0x806464C4, Overlay.Static, "spawnStalactite", offset_dict)
writeValue(ROM_COPY, 0x806A04F6, Overlay.Static, 50, offset_dict) # Reduce volume of stalactite crash
elif isQoLEnabled(spoiler, MiscChangesSelected.calm_caves):
file_init_flags.append(0x12C) # Giant Kosha Dead
if settings.free_trade_setting != FreeTradeSetting.none:
# Non-BP Items
writeValue(ROM_COPY, 0x807319C0, Overlay.Static, 0x00001025, offset_dict, 4) # OR $v0, $r0, $r0 - Make all reward spots think no kong
# writeValue(ROM_COPY, 0x80632E94, Overlay.Static, 0x00001025, offset_dict, 4) # OR $v0, $r0, $r0 - Make flag mapping think no kong
writeFunction(ROM_COPY, 0x80632E94, Overlay.Static, "getItemRequiredKong", offset_dict) # Get required kong for item, used to set Stump GB as Tiny
if settings.free_trade_setting == FreeTradeSetting.major_collectibles:
writeValue(ROM_COPY, 0x806F56F8, Overlay.Static, 0, offset_dict, 4) # Disable Flag Set for blueprints
writeValue(ROM_COPY, 0x806A606C, Overlay.Static, 0, offset_dict, 4) # Disable translucency for blueprints
writeFunction(ROM_COPY, 0x806B26A0, Overlay.Static, "fireballEnemyDeath", offset_dict)
if Types.Enemies in settings.shuffled_location_types:
# Dropsanity
writeFunction(ROM_COPY, 0x80729E54, Overlay.Static, "indicateCollectionStatus", offset_dict)
writeValue(ROM_COPY, 0x807278CA, Overlay.Static, 0xFFF, offset_dict) # Disable enemy switching in Fungi
writeFunction(ROM_COPY, 0x806BB310, Overlay.Static, "rulerEnemyDeath", offset_dict)
writeHook(ROM_COPY, 0x806680B4, Overlay.Static, "checkBeforeApplyingQuicksand", offset_dict)
writeValue(ROM_COPY, 0x806680B8, Overlay.Static, 0x8E2C0058, offset_dict, 4) # LW $t4, 0x58 ($s1)
remove_blockers = False
if remove_blockers:
for x in range(8):
file_init_flags.append(0x1CD + x) # B. Locker clear flag
if IsItemSelected(settings.hard_mode, settings.hard_mode_selected, HardModeSelected.hard_enemies, False):
writeValue(ROM_COPY, 0x806B12DA, Overlay.Static, 0x3A9, offset_dict) # Kasplat Shockwave Chance
writeValue(ROM_COPY, 0x806B12FE, Overlay.Static, 0x3B3, offset_dict) # Kasplat Shockwave Chance
writeActorHealth(ROM_COPY, 259, 9) # Increase kop health
if IsItemSelected(settings.hard_mode, settings.hard_mode_selected, HardModeSelected.lower_max_refill_amounts, False):
writeValue(ROM_COPY, 0x806F8F68, Overlay.Static, 0x24090000, offset_dict, 4) # Standard Ammo: change from `(1 << ammo_belt) * 50` to a flat 50
writeValue(ROM_COPY, 0x806F8FE4, Overlay.Static, 0x24190000, offset_dict, 4) # Homing Ammo: change from `(1 << ammo_belt) * 50` to a flat 50
writeValue(ROM_COPY, 0x806F9056, Overlay.Static, 5, offset_dict) # Oranges: change from `(5 * ammo_belt) + 20` to `(5 * ammo_belt) + 5`
writeValue(ROM_COPY, 0x806F90B6, Overlay.Static, 10 * 150, offset_dict) # Crystals: change from `20 + fairy_count` to `10 + fairy_count`
writeValue(ROM_COPY, 0x806F9186, Overlay.Static, 3, offset_dict) # Film: change from `10 + fairy_count` to `3 + fairy_count`
writeValue(ROM_COPY, 0x806F90C8, Overlay.Static, 0x24040000 | (10 * 150), offset_dict, 4) # set min coconuts to 1500 (10 crystals)
if IsItemSelected(settings.hard_mode, settings.hard_mode_selected, HardModeSelected.water_is_lava, False):
writeValue(ROM_COPY, 0x806677C4, Overlay.Static, 0, offset_dict, 4) # Dynamic Surfaces
# Static Surfaces
writeValue(ROM_COPY, 0x80667ED2, Overlay.Static, 0x81, offset_dict)
writeValue(ROM_COPY, 0x80667EDA, Overlay.Static, 0x81, offset_dict)
writeValue(ROM_COPY, 0x80667EEE, Overlay.Static, 0x81, offset_dict)
writeValue(ROM_COPY, 0x80667EFA, Overlay.Static, 0x81, offset_dict)
writeFunction(ROM_COPY, 0x8062F3F0, Overlay.Static, "replaceWaterTexture", offset_dict) # Static water textures
is_dark_world = IsItemSelected(settings.hard_mode, settings.hard_mode_selected, HardModeSelected.donk_in_the_dark_world, False)
is_sky = IsItemSelected(settings.hard_mode, settings.hard_mode_selected, HardModeSelected.donk_in_the_sky, False)
is_memory_challenge = is_dark_world and is_sky
is_dark_world = is_dark_world and not is_memory_challenge
is_sky = is_sky and not is_memory_challenge
if is_dark_world or is_memory_challenge:
writeFunction(ROM_COPY, 0x8062F230, Overlay.Static, "alterChunkLighting", offset_dict)
writeFunction(ROM_COPY, 0x8065121C, Overlay.Static, "alterChunkLighting", offset_dict)
writeFunction(ROM_COPY, 0x8062F2CC, Overlay.Static, "alterChunkData", offset_dict)
writeFunction(ROM_COPY, 0x806C9DF8, Overlay.Static, "shineLight", offset_dict)
writeFunction(ROM_COPY, 0x806C9E28, Overlay.Static, "shineLight", offset_dict)
writeFunction(ROM_COPY, 0x806C9E58, Overlay.Static, "shineLight", offset_dict)
writeFunction(ROM_COPY, 0x806C9E88, Overlay.Static, "shineLight", offset_dict)
writeFunction(ROM_COPY, 0x806C9EB8, Overlay.Static, "shineLight", offset_dict)
writeFunction(ROM_COPY, 0x806C9EE8, Overlay.Static, "shineLight", offset_dict)
writeFunction(ROM_COPY, 0x806C9F2C, Overlay.Static, "shineLight", offset_dict)
writeFunction(ROM_COPY, 0x806C9F5C, Overlay.Static, "shineLight", offset_dict)
# Fungi Time of Day
writeFloat(ROM_COPY, 0x80748280, Overlay.Static, 0, offset_dict)
writeFloat(ROM_COPY, 0x80748284, Overlay.Static, 0, offset_dict)
writeFloat(ROM_COPY, 0x80748288, Overlay.Static, 0, offset_dict)
writeFloat(ROM_COPY, 0x8074828C, Overlay.Static, 0, offset_dict)
writeFloat(ROM_COPY, 0x80748290, Overlay.Static, 0, offset_dict)
writeFloat(ROM_COPY, 0x80748294, Overlay.Static, 0, offset_dict)
# Troff n Scoff
writeFloat(ROM_COPY, 0x8075B8B4, Overlay.Static, 0, offset_dict)
writeFloat(ROM_COPY, 0x8075B8B8, Overlay.Static, 0, offset_dict)
# Rain
writeValue(ROM_COPY, 0x8068B6AE, Overlay.Static, 0, offset_dict)
# Isles
writeValue(ROM_COPY, 0x8068B518, Overlay.Static, 0, offset_dict, 4)
# Disable some lights
writeValue(ROM_COPY, 0x8065F1A0, Overlay.Static, 0xA1600000, offset_dict, 4)
if is_dark_world:
# Main Menu
writeValue(ROM_COPY, 0x800304E4, Overlay.Menu, 0, offset_dict, 4)
if is_sky or is_memory_challenge:
writeFunction(ROM_COPY, 0x80656538, Overlay.Static, "displayNoGeoChunk", offset_dict)
writeFunction(ROM_COPY, 0x806562C0, Overlay.Static, "displayNoGeoChunk", offset_dict)
writeFunction(ROM_COPY, 0x80656380, Overlay.Static, "displayNoGeoChunk", offset_dict)
writeFunction(ROM_COPY, 0x806565F8, Overlay.Static, "displayNoGeoChunk", offset_dict)
if settings.medal_cb_req > 0:
writeValue(ROM_COPY, 0x806F934E, Overlay.Static, settings.medal_cb_req, offset_dict) # Acquisition
writeValue(ROM_COPY, 0x806F935A, Overlay.Static, settings.medal_cb_req, offset_dict) # Acquisition
writeValue(ROM_COPY, 0x806AA942, Overlay.Static, settings.medal_cb_req, offset_dict) # Pause Menu Tick
if settings.fungi_time_internal == FungiTimeSetting.dusk:
writeValue(ROM_COPY, 0x806C5614, Overlay.Static, 0x50000006, offset_dict, 4)
writeValue(ROM_COPY, 0x806BE8F8, Overlay.Static, 0x50000008, offset_dict, 4)
if settings.enable_tag_anywhere:
writeValue(ROM_COPY, 0x806F6D94, Overlay.Static, 0, offset_dict, 4) # Prevent delayed collection
writeValue(ROM_COPY, 0x806F5B68, Overlay.Static, 0x1000, offset_dict) # Standard Ammo
writeValue(ROM_COPY, 0x806F59A8, Overlay.Static, 0x1000, offset_dict) # Bunch
writeValue(ROM_COPY, 0x806F6CAC, Overlay.Static, 0x9204001A, offset_dict, 4) # LBU $a0, 0x1A ($s0)
writeValue(ROM_COPY, 0x806F6CB0, Overlay.Static, 0x86060002, offset_dict, 4) # LH $a2, 0x2 ($s0)
writeValue(ROM_COPY, 0x806F53AC, Overlay.Static, 0, offset_dict, 4) # Prevent LZ case
writeValue(ROM_COPY, 0x806C7088, Overlay.Static, 0x1000, offset_dict) # Mech fish dying
if settings.puzzle_rando_difficulty != PuzzleRando.off:
# Alter diddy R&D
diddy_rnd_code_writes = [
# Code 0: 4231
0x8064E06A,
0x8064E066,
0x8064E062,
0x8064E05E,
# Code 1: 3124
0x8064E046,
0x8064E042,
0x8064E03E,
0x8064E00E,
# Code 2: 1342
0x8064E026,
0x8064E022,
0x8064E01E,
0x8064E01A,
]
for code_index, code in enumerate(settings.diddy_rnd_doors):
for sub_index, item in enumerate(code):
writeValue(ROM_COPY, diddy_rnd_code_writes[(4 * code_index) + sub_index], Overlay.Static, item + 1, offset_dict)
# DK Face Puzzle
dk_face_puzzle_register_values = [0x80, 0x95, 0x83, 0x82] # 0 = r0, 1 = s5, 2 = v1, 3 = v0
dk_face_puzzle_addresses = [
0x8064AD11,
0x8064AD15,
0x8064AD01,
0x8064AD19,
0x8064AD1D,
0x8064AD05,
0x8064AD21,
0x8064AD09,
0x8064AD29,
]
for index, address in enumerate(dk_face_puzzle_addresses):
if spoiler.dk_face_puzzle[index] is not None:
reg_value = dk_face_puzzle_register_values[spoiler.dk_face_puzzle[index]]
writeValue(ROM_COPY, address, Overlay.Static, reg_value, offset_dict, 1)
# Chunky Face Puzzle
chunky_face_puzzle_register_values = [0x40, 0x54, 0x48, 0x44] # 0 = r0, 1 = s4, 2 = t0, 3 = a0
chunky_face_puzzle_addresses = [
0x8064A2ED,
0x8064A2F1,
0x8064A2D5,
0x8064A2F5,
0x8064A2F9,
0x8064A2FD,
0x8064A2DD,
0x8064A301,
0x8064A305,
]
for index, address in enumerate(chunky_face_puzzle_addresses):
if spoiler.chunky_face_puzzle[index] is not None:
reg_value = chunky_face_puzzle_register_values[spoiler.chunky_face_puzzle[index]]
writeValue(ROM_COPY, address, Overlay.Static, reg_value, offset_dict, 1)
for index, value in enumerate(spoiler.arcade_order):
writeValue(ROM_COPY, 0x8004A788 + index, Overlay.Arcade, value, offset_dict, 1)
if isQoLEnabled(spoiler, MiscChangesSelected.fast_picture_taking):
# Fast Camera Photo
writeValue(ROM_COPY, 0x80699454, Overlay.Static, 0x5000, offset_dict) # Fast tick/no mega-slowdown on Biz
writeValue(ROM_COPY, 0x806992B6, Overlay.Static, 0x14, offset_dict) # No wait for camera film development
writeValue(ROM_COPY, 0x8069932A, Overlay.Static, 0x14, offset_dict)
if isQoLEnabled(spoiler, MiscChangesSelected.lowered_aztec_lobby_bonus):
# Lower Aztec Lobby Bonus
writeValue(ROM_COPY, 0x80680D56, Overlay.Static, 0x7C, offset_dict) # 0x89 if this needs to be unreachable without PTT
if isQoLEnabled(spoiler, MiscChangesSelected.small_bananas_always_visible):
writeValue(ROM_COPY, 0x806324D4, Overlay.Static, 0x24020001, offset_dict, 4) # ADDIU $v0, $r0, 1. Disable kong flag check
writeValue(ROM_COPY, 0x806A78C4, Overlay.Static, 0, offset_dict, 4) # NOP. Disable kong flag check
if isQoLEnabled(spoiler, MiscChangesSelected.fast_hints):
writeValue(ROM_COPY, 0x8069E0F6, Overlay.Static, 1, offset_dict)
writeValue(ROM_COPY, 0x8069E112, Overlay.Static, 1, offset_dict)
writeValue(ROM_COPY, 0x80758BC9, Overlay.Static, 0xAE, offset_dict, 1) # Quadruple Growth Speed (8E -> AE)
writeValue(ROM_COPY, 0x80758BD1, Overlay.Static, 0xAE, offset_dict, 1) # Quadruple Shrink Speed (8E -> AE)
writeFunction(ROM_COPY, 0x806A5C30, Overlay.Static, "quickWrinklyTextboxes", offset_dict)
writeFunction(ROM_COPY, 0x80713258, Overlay.Static, "skipDKTV", offset_dict)
if isQoLEnabled(spoiler, MiscChangesSelected.fast_boot):
# Remove DKTV - Game Over
writeValue(ROM_COPY, 0x8071319E, Overlay.Static, 0x50, offset_dict)
writeValue(ROM_COPY, 0x807131AA, Overlay.Static, 5, offset_dict)
# Remove DKTV - End Seq
writeValue(ROM_COPY, 0x8071401E, Overlay.Static, 0x50, offset_dict)
writeValue(ROM_COPY, 0x8071404E, Overlay.Static, 5, offset_dict)
# Set NFR song to unused coin pickup, which is replaced by the windows 95 theme
writeValue(ROM_COPY, 0x80745D20, Overlay.Static, 7, offset_dict, 1)
for index, kong in enumerate(settings.kutout_kongs):
writeValue(ROM_COPY, 0x80035B44 + index, Overlay.Boss, kong, offset_dict, 1)
if isQoLEnabled(spoiler, MiscChangesSelected.fast_transform_animation):
writeValue(ROM_COPY, 0x8067EAB2, Overlay.Static, 1, offset_dict) # OSprint
writeValue(ROM_COPY, 0x8067EAC6, Overlay.Static, 1, offset_dict) # HC Dogadon 2
writeValue(ROM_COPY, 0x8067EACA, Overlay.Static, 1, offset_dict) # Others
writeValue(ROM_COPY, 0x8067EA92, Overlay.Static, 1, offset_dict) # Others 2
writeValue(ROM_COPY, 0x80681F06, Overlay.Static, 1, offset_dict) # Rocketbarrel
if isQoLEnabled(spoiler, MiscChangesSelected.animal_buddies_grab_items):
# Transformations can pick up other's collectables
writeValue(ROM_COPY, 0x806F6330, Overlay.Static, 0x96AC036E, offset_dict, 4) # Collection
# Collection
writeValue(ROM_COPY, 0x806F68A0, Overlay.Static, 0x95B8036E, offset_dict, 4) # DK Collection
writeValue(ROM_COPY, 0x806F68DC, Overlay.Static, 0x952C036E, offset_dict, 4) # Diddy Collection
writeValue(ROM_COPY, 0x806F6914, Overlay.Static, 0x95F9036E, offset_dict, 4) # Tiny Collection
writeValue(ROM_COPY, 0x806F694C, Overlay.Static, 0x95AE036E, offset_dict, 4) # Lanky Collection
writeValue(ROM_COPY, 0x806F6984, Overlay.Static, 0x952B036E, offset_dict, 4) # Chunky Collection
# Opacity
writeValue(ROM_COPY, 0x80637998, Overlay.Static, 0x95B9036E, offset_dict, 4) # DK Opacity
writeValue(ROM_COPY, 0x806379E8, Overlay.Static, 0x95CF036E, offset_dict, 4) # Diddy Opacity
writeValue(ROM_COPY, 0x80637A28, Overlay.Static, 0x9589036E, offset_dict, 4) # Tiny Opacity
writeValue(ROM_COPY, 0x80637A68, Overlay.Static, 0x954B036E, offset_dict, 4) # Chunky Opacity
writeValue(ROM_COPY, 0x80637AA8, Overlay.Static, 0x9708036E, offset_dict, 4) # Lanky Opacity
# CB/Coin rendering
writeValue(ROM_COPY, 0x806394FC, Overlay.Static, 0x958B036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x80639540, Overlay.Static, 0x9728036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x80639584, Overlay.Static, 0x95AE036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x80639430, Overlay.Static, 0x95CD036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x806393EC, Overlay.Static, 0x9519036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x806395C8, Overlay.Static, 0x952A036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x8063960C, Overlay.Static, 0x95F8036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x80639474, Overlay.Static, 0x9549036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x806393A8, Overlay.Static, 0x956C036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x806394B8, Overlay.Static, 0x970F036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x80639650, Overlay.Static, 0x956C036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x80639710, Overlay.Static, 0x9549036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x80639750, Overlay.Static, 0x970F036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x806396D0, Overlay.Static, 0x95CD036E, offset_dict, 4) # Rendering
writeValue(ROM_COPY, 0x80639690, Overlay.Static, 0x9519036E, offset_dict, 4) # Rendering
if isQoLEnabled(spoiler, MiscChangesSelected.reduced_lag):
writeValue(ROM_COPY, 0x80748010, Overlay.Static, 0x8064F2F0, offset_dict, 4) # Cancel Sandstorm
# No Rain
writeFloat(ROM_COPY, 0x8075E3E0, Overlay.Static, 0, offset_dict) # Set Isles Rain Radius to 0
writeValue(ROM_COPY, 0x8068AF90, Overlay.Static, 0, offset_dict, 4) # Disable weather
if isQoLEnabled(spoiler, MiscChangesSelected.homing_balloons):
writeValue(ROM_COPY, 0x80694F6A, Overlay.Static, 10, offset_dict) # Coconut
writeValue(ROM_COPY, 0x80692B82, Overlay.Static, 10, offset_dict) # Peanuts
writeValue(ROM_COPY, 0x8069309A, Overlay.Static, 10, offset_dict) # Grape
writeValue(ROM_COPY, 0x80695406, Overlay.Static, 10, offset_dict) # Feather
writeValue(ROM_COPY, 0x80694706, Overlay.Static, 10, offset_dict) # Pineapple
if isQoLEnabled(spoiler, MiscChangesSelected.better_fairy_camera):
# Increased range for fairy shots
screen_x_center = 160
screen_y_center = 120
screen_x_dist = 24 # Usually 16
screen_y_dist = 24 # Usually 16
fairy_range = 1000
writeValue(ROM_COPY, 0x806C5DB6, Overlay.Static, screen_x_center - screen_x_dist, offset_dict) # X Minimum
writeValue(ROM_COPY, 0x806C5DC6, Overlay.Static, screen_x_center + screen_x_dist, offset_dict) # X Maximum
writeValue(ROM_COPY, 0x806C5DD6, Overlay.Static, screen_y_center - screen_y_dist, offset_dict) # Y Minimum
writeValue(ROM_COPY, 0x806C5DDE, Overlay.Static, screen_y_center + screen_y_dist, offset_dict) # Y Maximum
writeValue(ROM_COPY, 0x806C5DE8, Overlay.Static, 0x240B0000 | fairy_range, offset_dict, 4) # Force max acceptable dist to 1000
writeValue(ROM_COPY, 0x80032096, Overlay.Arcade, 0, offset_dict) # Disable Nin 1981 flicker
writeValue(ROM_COPY, 0x8002672A, Overlay.Arcade, 0xFFFF, offset_dict) # Disable Donkey Kong logo title flicker
if isQoLEnabled(spoiler, MiscChangesSelected.vanilla_bug_fixes):
# Race Hoop 3D
writeValue(ROM_COPY, 0x806C4DB4, Overlay.Static, 0x24050113, offset_dict, 4) # Change model of race hoop
writeValue(ROM_COPY, ACTOR_MASTER_TYPE_START + 24, Overlay.Custom, 2, offset_dict, 1) # Change race hoop to interpret as 3D Model
race_hoop_addresses = [0x8069B060, 0x8069B08C, 0x8069B0AC, 0x8069B0B4, 0x8069B0BC, 0x8069B0C8, 0x8069B050, 0x8069B05C]
for addr in race_hoop_addresses:
writeValue(ROM_COPY, addr, Overlay.Static, 0, offset_dict, 4)
# Fix K Rool Cutscene Bug
writeValue(ROM_COPY, 0x800359A6, Overlay.Boss, 3, offset_dict)
writeFunction(ROM_COPY, 0x806BE8D8, Overlay.Static, "RabbitRaceInfiniteCode", offset_dict) # Modify Function Call
writeFunction(ROM_COPY, 0x8067C168, Overlay.Static, "fixDilloTNTPads", offset_dict) # Modify Function Call
writeFunction(ROM_COPY, 0x806E5C04, Overlay.Static, "fixCrownEntrySKong", offset_dict) # Modify Function Call
writeFloat(ROM_COPY, 0x807482A4, Overlay.Static, 0.1, offset_dict) # Increase Fungi lighting transition rate
# Race Hoop
writeFunction(ROM_COPY, 0x8069B13C, Overlay.Static, "renderHoop", offset_dict)
writeFunction(ROM_COPY, 0x8069B0EC, Overlay.Static, "fixRaceHoopCode", offset_dict)
# Squawks w/ Spotlight Behavior
writeValue(ROM_COPY, 0x806C6BAE, Overlay.Static, 0, offset_dict)
# Feathers are sprites
writeValue(ROM_COPY, ACTOR_DEF_START + (24 * 0x30) + 2, Overlay.Custom, 0, offset_dict) # Model
writeValue(ROM_COPY, ACTOR_MASTER_TYPE_START + 43, Overlay.Custom, 4, offset_dict, 1) # Master Type
writeFloat(ROM_COPY, 0x80753E38, Overlay.Static, 350, offset_dict) # Speed
updateActorFunction(ROM_COPY, 43, "OrangeGunCode")
# Fix gun slide (kinda)
writeValue(ROM_COPY, 0x80751A2C, Overlay.Static, 0x806E2F3C, offset_dict, 4) # Make it so that you can use Z to enter aim
# Flags
file_init_flags.append(0x309) # Cranky FTT
writeLabelValue(ROM_COPY, 0x80748014, Overlay.Static, "spawnWrinklyWrapper", offset_dict) # Change function to include setFlag call
updateActorFunctionInt(ROM_COPY, 212, 0x806AD54C) # Set Gold Beaver as Blue Beaver Code
writeLabelValue(ROM_COPY, 0x80748064, Overlay.Static, "change_object_scripts", offset_dict) # Object Instance Scripts
writeFunction(ROM_COPY, 0x806A8844, Overlay.Static, "helmTime_restart", offset_dict) # Modify Function Call
writeFunction(ROM_COPY, 0x806A89E8, Overlay.Static, "helmTime_exitBonus", offset_dict) # Modify Function Call
writeFunction(ROM_COPY, 0x806A89F8, Overlay.Static, "helmTime_exitRace", offset_dict) # Modify Function Call
writeFunction(ROM_COPY, 0x806A89C4, Overlay.Static, "helmTime_exitLevel", offset_dict) # Modify Function Call
writeFunction(ROM_COPY, 0x806A89B4, Overlay.Static, "helmTime_exitBoss", offset_dict) # Modify Function Call
writeFunction(ROM_COPY, 0x806A8988, Overlay.Static, "helmTime_exitKRool", offset_dict) # Modify Function Call
if isQoLEnabled(spoiler, MiscChangesSelected.hint_textbox_hold):
writeHook(ROM_COPY, 0x8070E83C, Overlay.Static, "TextHandler", offset_dict)
if isQoLEnabled(spoiler, MiscChangesSelected.brighten_mad_maze_maul_enemies):
writeHook(ROM_COPY, 0x80631380, Overlay.Static, "brightenMMMEnemies", offset_dict)
if isQoLEnabled(spoiler, MiscChangesSelected.global_instrument):
writeValue(ROM_COPY, 0x8060DC04, Overlay.Static, 0, offset_dict, 4) # nop out
writeFunction(ROM_COPY, 0x8060DB50, Overlay.Static, "newInstrumentRefill", offset_dict) # New code to set the instrument refill count
writeFunction(ROM_COPY, 0x806AA728, Overlay.Static, "QoL_DisplayInstrument", offset_dict) # display number on pause menu
writeValue(ROM_COPY, 0x806F891C, Overlay.Static, 0x27D502FE, offset_dict, 4) # addiu $s5, $s8, 0x2FE - Infinite Instrument Energy
writeValue(ROM_COPY, 0x806F8934, Overlay.Static, 0xA7C202FE, offset_dict, 4) # sh $v0, 0x2FE ($fp) - Store item count pointer
writeFunction(ROM_COPY, 0x806A7DD4, Overlay.Static, "getInstrumentRefillCount", offset_dict) # Correct refill instruction - Headphones
writeFunction(ROM_COPY, 0x806F92B8, Overlay.Static, "correctRefillCap", offset_dict) # Correct refill instruction - changeCollectable
writeValue(ROM_COPY, 0x806A7C04, Overlay.Static, 0x00A0C025, offset_dict, 4) # or $t8, $a1, $zero
updateActorFunction(ROM_COPY, 128, "HeadphonesCodeContainer")
if isQoLEnabled(spoiler, MiscChangesSelected.remove_extraneous_cutscenes):
# K. Lumsy
writeValue(ROM_COPY, 0x80750680, Overlay.Static, 0x22, offset_dict)
writeValue(ROM_COPY, 0x80750682, Overlay.Static, 0x1, offset_dict)
writeFunction(ROM_COPY, 0x806BDC24, Overlay.Static, "initiateTransition", offset_dict) # Change takeoff warp func
writeValue(ROM_COPY, 0x806BDC8C, Overlay.Static, 0x1000, offset_dict) # Apply no cutscene to all keys
writeValue(ROM_COPY, 0x806BDC3C, Overlay.Static, 0x1000, offset_dict) # Apply shorter timer to all keys
# Fast Vulture
writeFunction(ROM_COPY, 0x806C50BC, Overlay.Static, "clearVultureCutscene", offset_dict) # Modify Function Call
# Speedy T&S Turn-Ins
writeValue(ROM_COPY, 0x806BE3E0, Overlay.Static, 0, offset_dict, 4) # NOP
# Remove final mermaid text
writeValue(ROM_COPY, 0x806C3E10, Overlay.Static, 0, offset_dict, 4)
writeValue(ROM_COPY, 0x806C3E20, Overlay.Static, 0, offset_dict, 4)
# Cutscene FTT Flags
file_init_flags.extend(
[
0x163, # FLAG_FTT_BANANAPORT,
0x166, # FLAG_FTT_CROWNPAD,
0x168, # FLAG_FTT_MINIMONKEY,
0x169, # FLAG_FTT_HUNKYCHUNKY,
0x16A, # FLAG_FTT_ORANGSPRINT,
0x16B, # FLAG_FTT_STRONGKONG,
0x16C, # FLAG_FTT_RAINBOWCOIN,
0x16D, # FLAG_FTT_RAMBI,
0x16E, # FLAG_FTT_ENGUARDE,
0x16F, # FLAG_FTT_DIDDY,
0x170, # FLAG_FTT_LANKY,
0x171, # FLAG_FTT_TINY,
0x172, # FLAG_FTT_CHUNKY,
0x174, # FLAG_FTT_SNIDE,
0x178, # FLAG_FTT_WRINKLY,
0x307, # FLAG_FTT_FUNKY,
0x308, # FLAG_FTT_SNIDE0,
0x309, # FLAG_FTT_CRANKY,
0x30A, # FLAG_FTT_CANDY,
0x30B, # FLAG_FTT_JAPES,
0x313, # FLAG_FTT_AZTEC,
0x30C, # FLAG_FTT_FACTORY,
0x30D, # FLAG_FTT_GALLEON,
0x30E, # FLAG_FTT_FUNGI,
0x30F, # FLAG_FTT_CAVES,
0x310, # FLAG_FTT_CASTLE,
0x312, # FLAG_FTT_HELM,
0x11A, # FLAG_INTRO_CAVES,
0xC2, # FLAG_INTRO_GALLEON,
0x100, # FLAG_FTT_TIMESWITCH,
0x101, # FLAG_INTRO_FUNGI,
0x12F, # FLAG_FTT_DK5DI,
0x15D, # FLAG_INTRO_CASTLE,
0x2A, # FLAG_CUTSCENE_DIDDYHELPME,
0x1B, # FLAG_INTRO_JAPES,
0x5F, # FLAG_INTRO_AZTEC,
0x5D, # FLAG_CUTSCENE_LANKYHELPME,
0x5E, # FLAG_CUTSCENE_TINYHELPME,
0x8C, # FLAG_INTRO_FACTORY,
0xC3, # FLAG_CUTSCENE_WATERRAISED,
0xC4, # FLAG_CUTSCENE_WATERLOWERED,
0xFF, # FLAG_CUTSCENE_CLOCK,
0x115, # FLAG_CUTSCENE_ROTATING,
0x12B, # FLAG_CUTSCENE_KOSHA,
0x17A, # FLAG_WATERFALL,
0x5C, # FLAG_CUTSCENE_LLAMA,
0x305, # FLAG_WARP_HELM_W1_NEAR
]
)
# Actor Expansion
# Definitions
actor_def_hi = getHiSym("actor_defs")
actor_def_lo = getLoSym("actor_defs")
writeValue(ROM_COPY, 0x8068926A, Overlay.Static, actor_def_hi, offset_dict)
writeValue(ROM_COPY, 0x8068927A, Overlay.Static, actor_def_lo, offset_dict)
writeValue(ROM_COPY, 0x806892D2, Overlay.Static, actor_def_hi, offset_dict)
writeValue(ROM_COPY, 0x806892D6, Overlay.Static, actor_def_lo, offset_dict)
writeValue(ROM_COPY, 0x8068945A, Overlay.Static, actor_def_hi, offset_dict)
writeValue(ROM_COPY, 0x80689466, Overlay.Static, actor_def_lo, offset_dict)
def_limit = getVar("DEFS_LIMIT")
writeValue(ROM_COPY, 0x8068928A, Overlay.Static, def_limit, offset_dict)
writeValue(ROM_COPY, 0x80689452, Overlay.Static, def_limit, offset_dict)
# Functions
actor_function_hi = getHiSym("actor_functions")
actor_function_lo = getLoSym("actor_functions")
writeValue(ROM_COPY, 0x806788F2, Overlay.Static, actor_function_hi, offset_dict)
writeValue(ROM_COPY, 0x8067890E, Overlay.Static, actor_function_lo, offset_dict)
writeValue(ROM_COPY, 0x80678A3E, Overlay.Static, actor_function_hi, offset_dict)
writeValue(ROM_COPY, 0x80678A52, Overlay.Static, actor_function_lo, offset_dict)
# writeLabelValue(ROM_COPY, 0x8076152C, Overlay.Static, "actor_functions", offset_dict)
# writeLabelValue(ROM_COPY, 0x80764768, Overlay.Static, "actor_functions", offset_dict)
# Collision
actor_col_hi_info = getHi(ACTOR_COLLISION_START + 0)
actor_col_lo_info = getLo(ACTOR_COLLISION_START + 0)
actor_col_hi_unk4 = getHi(ACTOR_COLLISION_START + 4)
actor_col_lo_unk4 = getLo(ACTOR_COLLISION_START + 4)
writeValue(ROM_COPY, 0x8067586A, Overlay.Static, actor_col_hi_info, offset_dict)
writeValue(ROM_COPY, 0x80675876, Overlay.Static, actor_col_lo_info, offset_dict)
writeValue(ROM_COPY, 0x806759F2, Overlay.Static, actor_col_hi_unk4, offset_dict)
writeValue(ROM_COPY, 0x80675A02, Overlay.Static, actor_col_lo_unk4, offset_dict)
writeValue(ROM_COPY, 0x8067620E, Overlay.Static, actor_col_hi_unk4, offset_dict)
writeValue(ROM_COPY, 0x8067621E, Overlay.Static, actor_col_lo_unk4, offset_dict)
# Health
actor_health_hi_health = getHi(ACTOR_HEALTH_START + 0)
actor_health_lo_health = getLo(ACTOR_HEALTH_START + 0)
actor_health_hi_dmg = getHi(ACTOR_HEALTH_START + 2)
actor_health_lo_dmg = getLo(ACTOR_HEALTH_START + 2)
writeValue(ROM_COPY, 0x806761D6, Overlay.Static, actor_health_hi_health, offset_dict)
writeValue(ROM_COPY, 0x806761E2, Overlay.Static, actor_health_lo_health, offset_dict)
writeValue(ROM_COPY, 0x806761F2, Overlay.Static, actor_health_hi_dmg, offset_dict)
writeValue(ROM_COPY, 0x806761FE, Overlay.Static, actor_health_lo_dmg, offset_dict)
# Interactions
actor_interaction_hi = getHiSym("actor_interactions")
actor_interaction_lo = getLoSym("actor_interactions")
writeValue(ROM_COPY, 0x806781BA, Overlay.Static, actor_interaction_hi, offset_dict)
writeValue(ROM_COPY, 0x8067820A, Overlay.Static, actor_interaction_lo, offset_dict)
writeValue(ROM_COPY, 0x8067ACCA, Overlay.Static, actor_interaction_hi, offset_dict)
writeValue(ROM_COPY, 0x8067ACDA, Overlay.Static, actor_interaction_lo, offset_dict)
# Master Type
actor_mtype_hi = getHiSym("actor_master_types")
actor_mtype_lo = getLoSym("actor_master_types")
writeValue(ROM_COPY, 0x80677EF6, Overlay.Static, actor_mtype_hi, offset_dict)
writeValue(ROM_COPY, 0x80677F02, Overlay.Static, actor_mtype_lo, offset_dict)
writeValue(ROM_COPY, 0x80677FCA, Overlay.Static, actor_mtype_hi, offset_dict)
writeValue(ROM_COPY, 0x80677FD2, Overlay.Static, actor_mtype_lo, offset_dict)
writeValue(ROM_COPY, 0x80678CDA, Overlay.Static, actor_mtype_hi, offset_dict)
writeValue(ROM_COPY, 0x80678CE6, Overlay.Static, actor_mtype_lo, offset_dict)
# Paad
writeValue(ROM_COPY, 0x8067805E, Overlay.Static, getHiSym("actor_extra_data_sizes"), offset_dict)
writeValue(ROM_COPY, 0x80678062, Overlay.Static, getLoSym("actor_extra_data_sizes"), offset_dict)
# Uncontrollable Fixes
writeFunction(ROM_COPY, 0x806F56E0, Overlay.Static, "getFlagIndex_Corrected", offset_dict) # BP Acquisition - Correct for character
writeFunction(ROM_COPY, 0x806F9374, Overlay.Static, "getFlagIndex_MedalCorrected", offset_dict) # Medal Acquisition - Correct for character
# Inverted Controls Option
writeValue(ROM_COPY, 0x8060D04C, Overlay.Static, 0x1000, offset_dict) # Prevent inverted controls overwrite
# Disable Sprint Music in Fungi Forest
writeFunction(ROM_COPY, 0x8067F3DC, Overlay.Static, "playTransformationSong", offset_dict)
# GetOut Timer
writeValue(ROM_COPY, 0x806B7ECA, Overlay.Static, 125, offset_dict) # 0x8078 for center-bottom ms timer
# Fix Tag Barrel Background Kong memes
writeFunction(ROM_COPY, 0x806839F0, Overlay.Static, "tagBarrelBackgroundKong", offset_dict)
# Better Collision
writeFunction(ROM_COPY, 0x806F6618, Overlay.Static, "checkModelTwoItemCollision", offset_dict)
writeFunction(ROM_COPY, 0x806F662C, Overlay.Static, "checkModelTwoItemCollision", offset_dict)
# Dive Check
writeFunction(ROM_COPY, 0x806E9658, Overlay.Static, "CanDive_WithCheck", offset_dict)
writeFunction(ROM_COPY, 0x806DEFDC, Overlay.Static, "dropWrapper", offset_dict)
# Prevent Japes Dillo Cutscene for the key acquisition
writeValue(ROM_COPY, 0x806EFCEC, Overlay.Static, 0x1000, offset_dict)
# Make getting out of spider traps easier on controllers
writeLabelValue(ROM_COPY, 0x80752ADC, Overlay.Static, "exitTrapBubbleController", offset_dict)
# Inverted Controls Option
writeValue(ROM_COPY, 0x8060D01A, Overlay.Static, getHiSym("InvertedControls"), offset_dict) # Change language store to inverted controls store
writeValue(ROM_COPY, 0x8060D01E, Overlay.Static, getLoSym("InvertedControls"), offset_dict) # Change language store to inverted controls store
writeFunction(ROM_COPY, 0x80602AB0, Overlay.Static, "filterSong", offset_dict)
writeValue(ROM_COPY, 0x80602AAC, Overlay.Static, 0x27A40018, offset_dict, 4) # addiu $a0, $sp, 0x18I
# Decompressed Overlays
overlays_being_decompressed = [
0x08, # Cutscenes
0x09, # Setup
0x0A, # Instance Scripts
0x0C, # Text
0x10, # Character Spawners
0x12, # Loading Zones
0x18, # Checkpoints
]
for ovl in overlays_being_decompressed:
writeValue(ROM_COPY, 0x80748E18 + ovl, Overlay.Static, 0, offset_dict, 1)
if settings.more_cutscene_skips == ExtraCutsceneSkips.off:
# Wipe all CS Data
ROM_COPY.seek(0x1FF3800)
for x in range(432):
ROM_COPY.writeMultipleBytes(0, 4)
else:
if settings.shuffle_items:
CUTSCENE_UNSKIPS = [
{
# Diddy Prod Spawn
"map_id": Maps.FranticFactory,
"cutscene": 2,
},
{
# Tiny Prod Peek
"map_id": Maps.FranticFactory,
"cutscene": 3,
},
{
# Lanky Prod Peek
"map_id": Maps.FranticFactory,
"cutscene": 4,
},
{
# Chunky Prod Spawn
"map_id": Maps.FranticFactory,
"cutscene": 5,
},
{
# Free Llama
"map_id": Maps.AngryAztec,
"cutscene": 14,
},
{
# Tiny Barrel Spawn
"map_id": Maps.ForestGiantMushroom,
"cutscene": 0,
},
{
# Cannon GB Spawn
"map_id": Maps.ForestGiantMushroom,
"cutscene": 1,
},
{
# Greenhouse Intro
"map_id": Maps.CastleGreenhouse,
"cutscene": 0,
},
{
# Dungeon Lanky Trombone Bonus
"map_id": Maps.CastleDungeon,
"cutscene": 0,
},
]
for data in CUTSCENE_UNSKIPS:
map_id = data["map_id"]
cutscene = data["cutscene"]
shift = cutscene & 0x1F
offset = 0 if cutscene < 32 else 1
comp = 0xFFFFFFFF - (1 << shift)
addr = 0x1FF3800 + (8 * map_id) + (4 * offset)
ROM_COPY.seek(addr)
original = int.from_bytes(ROM_COPY.readBytes(4), "big")
ROM_COPY.seek(addr)
ROM_COPY.writeMultipleBytes(original & comp, 4)
writeFunction(ROM_COPY, 0x80628508, Overlay.Static, "renderScreenTransitionCheck", offset_dict) # Remove transition effects if skipped cutscene
if settings.more_cutscene_skips == ExtraCutsceneSkips.press:
writeFunction(ROM_COPY, 0x8061DD80, Overlay.Static, "pressSkipHandler", offset_dict) # Handler for press start to skip
# Music Fix
writeValue(ROM_COPY, 0x807452B0, Overlay.Static, 0xD00, offset_dict, 4)
writeValue(ROM_COPY, 0x80600DA2, Overlay.Static, 0x38, offset_dict)
writeValue(ROM_COPY, 0x80600DA6, Overlay.Static, 0x70, offset_dict)
# Diddy Slam Crash Fix
writeHook(ROM_COPY, 0x80609338, Overlay.Static, "fixDiddySlamCrash", offset_dict)
# Fix Null Lag Boost
writeHook(ROM_COPY, 0x806CCA90, Overlay.Static, "fixNullLagBoost", offset_dict)
# Adjust Exit File
writeFunction(ROM_COPY, 0x805FEAE4, Overlay.Static, "loadExits", offset_dict)
writeHook(ROM_COPY, 0x806C97E0, Overlay.Static, "adjustExitRead", offset_dict)
writeValue(ROM_COPY, 0x805FF1CC, Overlay.Static, 0x2009FFFF, offset_dict, 4) # Set default void location to be exit -1 instead of exit 0
writeValue(ROM_COPY, 0x805FF220, Overlay.Static, 0x87A9, offset_dict) # Change LHU to LH
writeValue(ROM_COPY, 0x805FF278, Overlay.Static, 0x87A9, offset_dict) # Change LHU to LH
writeValue(ROM_COPY, 0x805FF2D0, Overlay.Static, 0x87A9, offset_dict) # Change LHU to LH
# Boot setup checker optimization
writeFunction(ROM_COPY, 0x805FEB00, Overlay.Static, "bootSpeedup", offset_dict) # Modify Function Call
writeValue(ROM_COPY, 0x805FEB08, Overlay.Static, 0, offset_dict, 4) # Cancel 2nd check
# Crowd Control Stuff
writeFunction(ROM_COPY, 0x805FEDC8, Overlay.Static, "handleGamemodeWrapper", offset_dict) # disable skipping the rap
writeFloat(ROM_COPY, 0x8075EB4C, Overlay.Static, -2.5, offset_dict) # Have the initial moonkick accel reading from a "const" addr
writeValue(ROM_COPY, 0x806EB618, Overlay.Static, 0x3C018076, offset_dict, 4) # LUI $at, 0x8076
writeValue(ROM_COPY, 0x806EB61C, Overlay.Static, 0xC426EB4C, offset_dict, 4) # LWC1 $f6, 0xEB4C ($at)
writeFunction(ROM_COPY, 0x806CA7D4, Overlay.Static, "fakeGetOut", offset_dict)
# Golden Banana Requirements
order = 0
for count in settings.BLockerEntryCount:
ROM_COPY.seek(settings.rom_data + 0x17E + order)
ROM_COPY.writeMultipleBytes(int(settings.BLockerEntryItems[order]), 1)
writeValue(ROM_COPY, 0x807446D0 + (2 * order), Overlay.Static, count, offset_dict)
order += 1
# Jetpac Requirement
written_requirement = settings.medal_requirement
if written_requirement != 15:
if written_requirement < 0:
written_requirement = 0
elif written_requirement > 40:
written_requirement = 40
writeValue(ROM_COPY, 0x80026513, Overlay.Menu, written_requirement, offset_dict, 1) # Actual requirement
writeValue(ROM_COPY, 0x8002644B, Overlay.Menu, written_requirement, offset_dict, 1) # Text variable
writeValue(ROM_COPY, 0x80027583, Overlay.Menu, written_requirement, offset_dict, 1) # Text Variable
# Boss Key Mapping
for i in range(7):
for j in range(7):
if REGULAR_BOSS_MAPS[i] == settings.boss_maps[j]:
writeValue(ROM_COPY, KEY_FLAG_ADDRESSES[i], Overlay.Boss, NORMAL_KEY_FLAGS[j], offset_dict)
# Race Coin Requirements
race_offset_data = {
Maps.CavesLankyRace: [0x800247C2],
Maps.AztecTinyRace: [0x800247DA],
Maps.FactoryTinyRace: [0x800285A2, 0x8002888E, 0x80028A0A],
Maps.GalleonSealRace: [0x8002A232, 0x8002A08E],
Maps.CastleTinyRace: [0x8002BAB6, 0x8002B6D6],
Maps.JapesMinecarts: [0x806C4912],
Maps.ForestMinecarts: [0x806C4956],
Maps.CastleMinecarts: [0x806C499A],
}
static_overlay_races = [Maps.JapesMinecarts, Maps.ForestMinecarts, Maps.CastleMinecarts]
for map_id in race_offset_data:
if map_id in spoiler.coin_requirements:
for addr in race_offset_data[map_id]:
overlay = Overlay.Static if map_id in static_overlay_races else Overlay.Race
writeValue(ROM_COPY, addr, overlay, spoiler.coin_requirements[map_id], offset_dict)
# BFI
writeFunction(ROM_COPY, 0x80028080, Overlay.Critter, "displayBFIMoveText", offset_dict) # BFI Text Display
if settings.rareware_gb_fairies > 0:
writeValue(ROM_COPY, 0x80027E70, Overlay.Critter, 0x2C410000 | settings.rareware_gb_fairies, offset_dict, 4) # SLTIU $at, $v0, count
writeValue(ROM_COPY, 0x80027E74, Overlay.Critter, 0x1420, offset_dict) # BNEZ $at, 0x6
if settings.win_condition_item == WinConditionComplex.dk_rap_items:
writeValue(ROM_COPY, 0x8071280E, Overlay.Static, Maps.DKRap, offset_dict) # End Sequence destination map
writeValue(ROM_COPY, 0x80712816, Overlay.Static, 0, offset_dict) # End Sequence cutscene
writeValue(ROM_COPY, 0x8075E650, Overlay.Static, 0x807141D4, offset_dict, 4) # Alter jump table entry
writeValue(ROM_COPY, 0x80712E76, Overlay.Static, 0x1644, offset_dict) # Demo Fadeout Timer
# Speed up end sequence a little bit to fit within the confines of the rap
for index in range(21):
ROM_COPY.seek(0x1FFF800 + (index * 6))
duration = int.from_bytes(ROM_COPY.readBytes(2), "big")
cooldown = int.from_bytes(ROM_COPY.readBytes(2), "big")
if duration == 0xFFFF and cooldown == 0xFFFF:
# Terminating card, do not alter values
break
else:
scale_down = 0.8
ROM_COPY.seek(0x1FFF800 + (index * 6))
ROM_COPY.writeMultipleBytes(int(duration * scale_down), 2)
ROM_COPY.writeMultipleBytes(int(cooldown * scale_down), 2)
# TBarrel/BFI Rewards
# writeValue(ROM_COPY, 0x80681CE2, Overlay.Static, 0, offset_dict)
# writeValue(ROM_COPY, 0x80681CFA, Overlay.Static, 1, offset_dict)
# writeValue(ROM_COPY, 0x80681D06, Overlay.Static, 2, offset_dict)
# writeValue(ROM_COPY, 0x80681D12, Overlay.Static, 3, offset_dict)
# writeValue(ROM_COPY, 0x80681C8A, Overlay.Static, 0, offset_dict)
# writeValue(ROM_COPY, 0x800295F6, Overlay.Critter, 0, offset_dict)
# writeValue(ROM_COPY, 0x80029606, Overlay.Critter, 1, offset_dict)
# writeValue(ROM_COPY, 0x800295FE, Overlay.Critter, 3, offset_dict)
# writeValue(ROM_COPY, 0x800295DA, Overlay.Critter, 2, offset_dict)
writeValue(ROM_COPY, 0x80027F2A, Overlay.Critter, 4, offset_dict)
writeValue(ROM_COPY, 0x80027E1A, Overlay.Critter, 4, offset_dict)
# writeFunction(ROM_COPY, 0x80681D38, Overlay.Static, "getLocationStatus", offset_dict) # Get TBarrels Move
# writeFunction(ROM_COPY, 0x80681C98, Overlay.Static, "getLocationStatus", offset_dict) # Get TBarrels Move
# writeFunction(ROM_COPY, 0x80029610, Overlay.Critter, "setLocationStatus", offset_dict) # Set TBarrels Move
writeFunction(ROM_COPY, 0x80027F24, Overlay.Critter, "setLocationStatus", offset_dict) # Set BFI Move
writeFunction(ROM_COPY, 0x80027E20, Overlay.Critter, "getLocationStatus", offset_dict) # Get BFI Move
writeValue(ROM_COPY, 0x80681DE4, Overlay.Static, 0x5000, offset_dict)
writeHook(ROM_COPY, 0x80680AD4, Overlay.Static, "expandTBarrelResponse", offset_dict) # Allow Training Barrels to disappear if already beaten
writeValue(ROM_COPY, 0x80681C16, Overlay.Static, 0xF, offset_dict) # Disregard most special code from a bonus
writeValue(ROM_COPY, 0x8069215E, Overlay.Static, 0x3F, offset_dict) # Reduce fireball collision volume
# Helm Warp Handler
writeFunction(ROM_COPY, 0x8068B04C, Overlay.Static, "WarpToHelm", offset_dict)
writeValue(ROM_COPY, 0x8068B054, Overlay.Static, 0x5000, offset_dict)
writeFunction(ROM_COPY, 0x80640720, Overlay.Static, "portalWarpFix", offset_dict)
writeValue(ROM_COPY, 0x806406F4, Overlay.Static, 0x2006FFFF, offset_dict, 4)
writeFunction(ROM_COPY, 0x8064070C, Overlay.Static, "DetermineLevel_NewLevel", offset_dict)
for index, data in enumerate(settings.level_portal_destinations):
writeValue(ROM_COPY, 0x8074809C + (2 * index), Overlay.Static, data["map"], offset_dict)
writeValue(ROM_COPY, 0x807480AC + (2 * index), Overlay.Static, data["exit"], offset_dict, 2, True)
if data["map"] != Maps.CreepyCastle and data["exit"] != -1:
writeValue(ROM_COPY, 0x807480BC + (2 * index), Overlay.Static, 0, offset_dict)
for index, map_id in enumerate(settings.level_void_maps):
writeValue(ROM_COPY, 0x80744748 + (2 * index), Overlay.Static, map_id, offset_dict)
# Write Mech Fish entry
writeValue(ROM_COPY, 0x806C6DC6, Overlay.Static, settings.mech_fish_entrance["map"], offset_dict)
exit_val = settings.mech_fish_entrance["exit"]
if exit_val == -1:
exit_val = 0xFFFF
writeValue(ROM_COPY, 0x806C6DD0, Overlay.Static, 0x20050000 | exit_val, offset_dict, 4)
# Misc LZR Stuff
if settings.shuffle_loading_zones == ShuffleLoadingZones.all and spoiler.shuffled_exit_instructions is not None:
# K Rool Exit
krool_exit_map = Maps.Isles
krool_exit_exit = 12
writeValue(ROM_COPY, 0x806A8986, Overlay.Static, krool_exit_map, offset_dict)
writeValue(ROM_COPY, 0x806A898E, Overlay.Static, krool_exit_exit, offset_dict)
writeValue(ROM_COPY, 0x80628032, Overlay.Static, krool_exit_map, offset_dict)
writeValue(ROM_COPY, 0x8062803A, Overlay.Static, krool_exit_exit, offset_dict)
# Race Exits
exit_data = [
{
"race_map": Maps.JapesMinecarts,
"tied_transition": Transitions.JapesCartsToMain,
},
{
"race_map": Maps.AztecTinyRace,
"tied_transition": Transitions.AztecRaceToMain,
},
{
"race_map": Maps.FactoryTinyRace,
"tied_transition": Transitions.FactoryRaceToRandD,
},
{
"race_map": Maps.GalleonSealRace,
"tied_transition": Transitions.GalleonSealToShipyard,
},
{
"race_map": Maps.ForestMinecarts,
"tied_transition": Transitions.ForestCartsToMain,
},
{
"race_map": Maps.CavesLankyRace,
"tied_transition": Transitions.CavesRaceToMain,
},
{
"race_map": Maps.CastleMinecarts,
"tied_transition": Transitions.CastleCartsToCrypt,
},
{
"race_map": Maps.CastleTinyRace,
"tied_transition": Transitions.CastleRaceToMuseum,
},
]
for race_index, race_exit in enumerate(exit_data):
if race_exit["tied_transition"] in spoiler.shuffled_exit_data:
address_head = 0x807447A0 + (12 * race_index)
shuffled_back = spoiler.shuffled_exit_data[race_exit["tied_transition"]]
writeValue(ROM_COPY, address_head + 0, Overlay.Static, race_exit["race_map"], offset_dict, 4)
writeValue(ROM_COPY, address_head + 4, Overlay.Static, GetMapId(settings, shuffled_back.regionId), offset_dict, 4)
writeValue(ROM_COPY, address_head + 8, Overlay.Static, GetExitId(shuffled_back), offset_dict, 4)
if ENABLE_BLAST_LZR:
addr_hi = getHiSym("blastWarpHandler")
addr_lo = getLoSym("blastWarpHandler")
writeValue(ROM_COPY, 0x806E5A4A, Overlay.Static, addr_hi, offset_dict)
writeValue(ROM_COPY, 0x806E5A4E, Overlay.Static, addr_lo, offset_dict)
# Boss Mapping
for i in range(7):
boss_map = settings.boss_maps[i]
boss_kong = settings.boss_kongs[i]
writeValue(ROM_COPY, 0x80744700 + (i * 2), Overlay.Static, boss_map, offset_dict)
writeValue(ROM_COPY, 0x807446F0 + i, Overlay.Static, boss_kong, offset_dict, 1)
writeValue(ROM_COPY, 0x807445E0 + boss_map, Overlay.Static, i, offset_dict, 1)
writeHook(ROM_COPY, 0x806C3260, Overlay.Static, "fixLankyPhaseHandState", offset_dict) # Ensures K Rool has a head in the end cutscene if in Lanky Phase
vanilla_props_values = {
Maps.JapesBoss: 1,
Maps.AztecBoss: 1,
Maps.FactoryBoss: 1,
Maps.GalleonBoss: 1,
Maps.FungiBoss: 1,
Maps.CavesBoss: 1,
Maps.CastleBoss: 1,
Maps.KroolDonkeyPhase: 0x23,
Maps.KroolDiddyPhase: 0x23,
Maps.KroolLankyPhase: 0x22,
Maps.KroolTinyPhase: 0x23,
Maps.KroolShoe: 3,
Maps.KroolChunkyPhase: 0x23,
}
# for map_id in settings.krool_order:
# writeValue(ROM_COPY, 0x807445E0 + map_id, Overlay.Static, 8, offset_dict, 1)
# if map_id not in [
# Maps.KroolDonkeyPhase,
# Maps.KroolDiddyPhase,
# Maps.KroolLankyPhase,
# Maps.KroolTinyPhase,
# Maps.KroolChunkyPhase,
# ]:
# writeValue(ROM_COPY, 0x8074482C + (12 * map_id) + 4, Overlay.Static, 3, offset_dict, 4)
# Got a bunch of stuff to fix with this
# for map_id in vanilla_props_values:
# new_value = vanilla_props_values[map_id]
# if (map_id in settings.krool_order) or (map_id == Maps.KroolShoe and Maps.KroolTinyPhase in settings.krool_order):
# new_value |= 0x200 # Deathwarp
# new_value |= 0x2 # Is K. Rool
# else:
# new_value &= 0xFFFFFDFF # Deathwarp
# new_value &= 0xFFFFFFFD # Not K. Rool
# writeValue(ROM_COPY, 0x8074482C + (12 * map_id) + 4, Overlay.Static, new_value, offset_dict, 4)
# writeValue(ROM_COPY, 0x8071288A, Overlay.Static, 0x200, offset_dict)
writeFunction(ROM_COPY, 0x80628034, Overlay.Static, "exitBoss", offset_dict)
boss_complete_functions = [
0x8002590C, # Dillo 1
0x80025C90, # Dillo 2
0x8002A108, # Puff
0x8002B424, # Dog 2
0x8002C154, # Dog 1
0x800327FC, # KKO
0x80035670, # MJ
0x8002DBD0, # K Rool - DK
0x8002E718, # K Rool - Diddy
0x8002F050, # K Rool - Lanky
0x8002FAF4, # K Rool - Tiny
0x800319B8, # K Rool - Chunky
]
for addr in boss_complete_functions:
writeFunction(ROM_COPY, addr, Overlay.Boss, "completeBoss", offset_dict)
writeValue(ROM_COPY, 0x80024266, Overlay.Bonus, 1, offset_dict) # Set Minigame oranges as infinite
# Adjust Krazy KK Flicker Speeds (Non-ASM)
# Defaults: 48/30. Start: 60. Flicker Thresh: -30. Scaling: 2.7
writeValue(ROM_COPY, 0x800293E6, Overlay.Bonus, 130, offset_dict) # V Easy
writeValue(ROM_COPY, 0x800293FA, Overlay.Bonus, 130, offset_dict) # Easy
writeValue(ROM_COPY, 0x8002940E, Overlay.Bonus, 81, offset_dict) # Medium
writeValue(ROM_COPY, 0x80029422, Overlay.Bonus, 81, offset_dict) # Hard
writeValue(ROM_COPY, 0x800295D2, Overlay.Bonus, 162, offset_dict) # Start
writeValue(ROM_COPY, 0x800297D8, Overlay.Bonus, 0x916B, offset_dict) # LB -> LBU
writeValue(ROM_COPY, 0x800297CE, Overlay.Bonus, -81, offset_dict, 2, True) # Flicker Threshold
# Change MJ phase reset differential to 40.0f units
writeValue(ROM_COPY, 0x80033B26, Overlay.Boss, 0x4220, offset_dict) # Jumping Around
writeValue(ROM_COPY, 0x800331AA, Overlay.Boss, 0x4220, offset_dict) # Random Square
writeValue(ROM_COPY, 0x800339EE, Overlay.Boss, 0x4220, offset_dict) # Stationary
if IsItemSelected(settings.hard_bosses, settings.hard_bosses_selected, HardBossesSelected.fast_mad_jack, False):
# MJ Fast Jumps
for x in range(5):
speed = 2 if x == 0 else 3
writeFloat(ROM_COPY, 0x80036C40 + (4 * x), Overlay.Boss, speed, offset_dict) # Phase x Jump speed
writeValue(ROM_COPY, 0x8003343A, Overlay.Boss, 0x224, offset_dict) # Force fast jumps
if IsItemSelected(settings.hard_bosses, settings.hard_bosses_selected, HardBossesSelected.k_rool_toes_rando, False):
# Random Toes
for x in range(5):
writeValue(ROM_COPY, 0x80036950 + (4 * x) + 2, Overlay.Boss, settings.toe_order[x], offset_dict, 1)
writeValue(ROM_COPY, 0x80036968 + (4 * x) + 2, Overlay.Boss, settings.toe_order[x + 5], offset_dict, 1)
if IsItemSelected(settings.hard_bosses, settings.hard_bosses_selected, HardBossesSelected.beta_lanky_phase, False):
# Spawn a K Rool balloon into the fight to trigger K Rool
writeFunction(ROM_COPY, 0x806A7AA8, Overlay.Static, "popExistingBalloon", offset_dict)
writeFunction(ROM_COPY, 0x8002EB64, Overlay.Boss, "spawnKRoolLankyBalloon", offset_dict)
addr = 0x8074482C + (12 * Maps.KroolLankyPhase) + 0
rom_addr = getROMAddress(addr, Overlay.Static, offset_dict)
ROM_COPY.seek(rom_addr)
val = int.from_bytes(ROM_COPY.readBytes(4), "big")
val &= ~0x200 # Re-enables guns
writeValue(ROM_COPY, addr, Overlay.Static, val, offset_dict, 4)
if settings.more_cutscene_skips == ExtraCutsceneSkips.auto:
writeValue(ROM_COPY, 0x8002EC50, Overlay.Boss, 0, offset_dict, 4)
writeValue(ROM_COPY, 0x8002EC64, Overlay.Boss, 0, offset_dict, 4)
writeValue(ROM_COPY, 0x8002EC70, Overlay.Boss, 0, offset_dict, 4)
writeValue(ROM_COPY, 0x8002EC82, Overlay.Boss, 2, offset_dict)
if POP_TARGETTING:
PEEL_DURATION = 35 # In seconds. Vanilla is 20
writeFunction(ROM_COPY, 0x8002ED28, Overlay.Boss, "handleKRoolDirecting", offset_dict)
writeValue(ROM_COPY, 0x8002E866, Overlay.Boss, PEEL_DURATION * 30, offset_dict)
# Fixes a bug if someone pops a balloon whilst K Rool has slipped where the hit doesn't count
writeFunction(ROM_COPY, 0x8002EF40, Overlay.Boss, "incHitCounter", offset_dict)
writeValue(ROM_COPY, 0x8002EFAC, Overlay.Boss, 0, offset_dict, 4)
# Training
writeValue(ROM_COPY, 0x80029610, Overlay.Critter, 0, offset_dict, 4) # Disable set flag
writeFunction(ROM_COPY, 0x80029638, Overlay.Critter, "warpOutOfTraining", offset_dict)
writeValue(ROM_COPY, 0x80029644, Overlay.Critter, 0, offset_dict, 4)
writeValue(ROM_COPY, 0x8002968E, Overlay.Critter, 1, offset_dict) # Set timer to 1
# writeValue(ROM_COPY, 0x80029314, Overlay.Critter, 0x2406000A, offset_dict, 4) # Set ticking timer to 10s
# B. Locker Stuff
writeValue(ROM_COPY, 0x80027970, Overlay.Critter, 0x1000, offset_dict) # Prevent Helm Lobby B. Locker requiring Chunky
writeValue(ROM_COPY, 0x800275E8, Overlay.Critter, 0x1000, offset_dict) # Prevent checking the cheat stuff
writeFunction(ROM_COPY, 0x80027570, Overlay.Critter, "displayBlockerItemOnHUD", offset_dict)
writeFunction(ROM_COPY, 0x800279D0, Overlay.Critter, "getCountOfBlockerRequiredItem", offset_dict)
writeFunction(ROM_COPY, 0x8002792C, Overlay.Critter, "getCountOfBlockerRequiredItem", offset_dict)
writeFunction(ROM_COPY, 0x800278EC, Overlay.Critter, "displayCountOnBLockerTeeth", offset_dict)
writeFunction(ROM_COPY, 0x800275AC, Overlay.Critter, "displayCountOnBLockerTeeth", offset_dict)
writeHook(ROM_COPY, 0x800275BC, Overlay.Critter, "fixBLockerRange", offset_dict)
if settings.has_password:
writeHook(ROM_COPY, 0x80028CC8, Overlay.Menu, "GoToPassword", offset_dict) # Enables handler of whether to go to the password screen or not
# Overwrite screen 6 with password data. Used to be multiplayer, but we've jettisoned that
writeFunction(ROM_COPY, 0x800306AC, Overlay.Menu, "password_screen_gfx", offset_dict)
writeFunction(ROM_COPY, 0x800306D4, Overlay.Menu, "password_screen_init", offset_dict)
writeFunction(ROM_COPY, 0x800306C4, Overlay.Menu, "password_screen_code", offset_dict)
# Menu/Shop Stuff
# Menu/Shop: Force enable cheats
writeValue(ROM_COPY, 0x800280DC, Overlay.Menu, 0x1000, offset_dict) # Force access to mystery menu
writeValue(ROM_COPY, 0x80028A40, Overlay.Menu, 0x1000, offset_dict) # Force opaqueness
writeValue(ROM_COPY, 0x8002EA7C, Overlay.Menu, 0x1000, offset_dict) # Disable Cutscene Menu
writeValue(ROM_COPY, 0x8002EAF8, Overlay.Menu, 0x1000, offset_dict) # Disable Minigames Menu
writeValue(ROM_COPY, 0x8002EB70, Overlay.Menu, 0x1000, offset_dict) # Disable Bosses Menu
writeValue(ROM_COPY, 0x8002EBE8, Overlay.Menu, 0, offset_dict, 4) # Disable Krusha Menu
writeValue(ROM_COPY, 0x8002EC18, Overlay.Menu, 0x1000, offset_dict) # Enable Cheats Menu
writeValue(ROM_COPY, 0x8002E8D8, Overlay.Menu, 0x240E0004, offset_dict, 4) # Force cheats menu to start on page 4
writeValue(ROM_COPY, 0x8002E8F4, Overlay.Menu, 0x1000, offset_dict) # Disable edge cases
writeValue(ROM_COPY, 0x8002E074, Overlay.Menu, 0xA06F0000, offset_dict, 4) # overflow loop to 1
writeValue(ROM_COPY, 0x8002E0F0, Overlay.Menu, 0x5C400004, offset_dict, 4) # underflow loop from 1
writeValue(ROM_COPY, 0x8002EA3A, Overlay.Menu, 0xFFFE, offset_dict) # Disable option 1 load
writeValue(ROM_COPY, 0x8002EA4C, Overlay.Menu, 0xA0600003, offset_dict, 4) # Force Krusha to 0
writeValue(ROM_COPY, 0x8002EA64, Overlay.Menu, 0xA64B0008, offset_dict, 4) # Disable option 1 write
# Menu/Shop: Snide's
writeValue(ROM_COPY, 0x8002402C, Overlay.Menu, 0x240E000C, offset_dict, 4) # No extra contraption cutscenes
writeValue(ROM_COPY, 0x80024054, Overlay.Menu, 0x24080001, offset_dict, 4) # 1 GB Turn in
# Menu/Shop: Candy's
writeValue(ROM_COPY, 0x80027678, Overlay.Menu, 0x1000, offset_dict) # Patch Candy's Shop Glitch
writeValue(ROM_COPY, 0x8002769C, Overlay.Menu, 0x1000, offset_dict) # Patch Candy's Shop Glitch
# Menu/Shop: Disable Multiplayer
writeValue(ROM_COPY, 0x800280B0, Overlay.Menu, 0, offset_dict, 4) # Disable access
writeValue(ROM_COPY, 0x80028A8C, Overlay.Menu, 0, offset_dict, 4) # Lower Sprite Opacity
# Menu/Shop: Cross Kong Purchases
writeValue(ROM_COPY, 0x80025EA0, Overlay.Menu, 0x90850004, offset_dict, 4) # Change target kong (Progressive) # LBU a1, 0x4 (a0)
writeValue(ROM_COPY, 0x80025E80, Overlay.Menu, 0x90850004, offset_dict, 4) # Change target kong (Bitfield) # LBU a1, 0x4 (a0)
writeValue(ROM_COPY, 0x80025F70, Overlay.Menu, 0x93060005, offset_dict, 4) # Change price deducted # LBU a2, 0x5 (t8)
writeValue(ROM_COPY, 0x80026200, Overlay.Menu, 0x90CF0005, offset_dict, 4) # Change price check # LBU t7, 0x5 (a2)
writeValue(ROM_COPY, 0x80027AE0, Overlay.Menu, 0x910F0004, offset_dict, 4) # Change Special Moves Text # LBU t7, 0x4 (t0)
writeValue(ROM_COPY, 0x80027BA0, Overlay.Menu, 0x91180004, offset_dict, 4) # Change Gun Text # LBU t8, 0x4 (t0)
writeValue(ROM_COPY, 0x80027C14, Overlay.Menu, 0x910C0004, offset_dict, 4) # Change Instrument Text # LBU t4, 0x4 (t0)
writeValue(ROM_COPY, 0x80026C08, Overlay.Menu, 0x91790011, offset_dict, 4) # Fix post-special move text # LBU t9, 0x11 (t3)
writeValue(ROM_COPY, 0x80026C00, Overlay.Menu, 0x916D0004, offset_dict, 4) # Fix post-special move text # LBU t5, 0x4 (t3)
# Menu/Shop: Move Bitfield
writeValue(ROM_COPY, 0x80025E9C, Overlay.Menu, 0x0C009751, offset_dict, 4) # Change writing of move to "write bitfield move" function call
writeValue(ROM_COPY, 0x8002E266, Overlay.Menu, 7, offset_dict) # Enguarde Arena Movement Write
writeValue(ROM_COPY, 0x8002F01E, Overlay.Menu, 7, offset_dict) # Rambi Arena Movement Write
# Menu/Shop: Change move purchase
writeFunction(ROM_COPY, 0x80026720, Overlay.Menu, "getNextMovePurchase", offset_dict)
writeFunction(ROM_COPY, 0x8002683C, Overlay.Menu, "getNextMovePurchase", offset_dict)
# Menu/Shop: Write Modified purchase move stuff
writeFunction(ROM_COPY, 0x80027324, Overlay.Menu, "purchaseFirstMoveHandler", offset_dict)
if not settings.fast_start_beginning_of_game:
writeFunction(ROM_COPY, 0x80027150, Overlay.Menu, "checkFirstMovePurchase", offset_dict)
writeFunction(ROM_COPY, 0x8002691C, Overlay.Menu, "purchaseMove", offset_dict)
writeFunction(ROM_COPY, 0x800270B8, Overlay.Menu, "showPostMoveText", offset_dict)
writeFunction(ROM_COPY, 0x80026508, Overlay.Menu, "canPlayJetpac", offset_dict)
writeValue(ROM_COPY, 0x80026F64, Overlay.Menu, 0, offset_dict, 4) # Disable check for whether you have a move before giving donation at shop
writeValue(ROM_COPY, 0x80026F68, Overlay.Menu, 0, offset_dict, 4) # Disable check for whether you have a move before giving donation at shop
# Menu/Shop: Shop Hints
if settings.enable_shop_hints:
writeFunction(ROM_COPY, 0x8002661C, Overlay.Menu, "getMoveHint", offset_dict)
writeFunction(ROM_COPY, 0x800265F0, Overlay.Menu, "getMoveHint", offset_dict)
# Menu/Shop: Visual Changes
writeFunction(ROM_COPY, 0x80030604, Overlay.Menu, "file_progress_screen_code", offset_dict) # New file progress code
writeFunction(ROM_COPY, 0x80029FE0, Overlay.Menu, "wipeFileMod", offset_dict) # Wipe File Hook
writeFunction(ROM_COPY, 0x80028C88, Overlay.Menu, "enterFileProgress", offset_dict) # Enter File Progress Screen Hook
writeValue(ROM_COPY, 0x80029818, Overlay.Menu, 0, offset_dict, 4) # Hide A
writeValue(ROM_COPY, 0x80029840, Overlay.Menu, 0, offset_dict, 4) # Hide B
# writeValue(ROM_COPY, 0x80029874, Overlay.Menu, 0, offset_dict, 4) # Hide GB
writeValue(ROM_COPY, 0x8002986E, Overlay.Menu, 198, offset_dict) # Move GB to right
writeValue(ROM_COPY, 0x80029872, Overlay.Menu, 114, offset_dict) # Move GB down
writeValue(ROM_COPY, 0x8002985A, Overlay.Menu, 0, offset_dict) # Change sprite mode for GB
writeFloat(ROM_COPY, 0x80033CA8, Overlay.Menu, 0.4, offset_dict) # Change GB Scale
# Menu/Shop: File Select
writeFunction(ROM_COPY, 0x80028D04, Overlay.Menu, "changeFileSelectAction", offset_dict) # File select change action
writeFunction(ROM_COPY, 0x80028D10, Overlay.Menu, "changeFileSelectAction_0", offset_dict) # File select change action
writeFunction(ROM_COPY, 0x80029A70, Overlay.Menu, "getGamePercentage", offset_dict)
writeValue(ROM_COPY, 0x80028EF8, Overlay.Menu, 0, offset_dict, 4) # Joystick
# Menu/Shop: Options
writeValue(ROM_COPY, 0x800338FC, Overlay.Menu, 5, offset_dict, 1) # 5 Options
writeValue(ROM_COPY, 0x8002DA86, Overlay.Menu, 1, offset_dict) # Cap to 1
writeValue(ROM_COPY, 0x8002DA46, Overlay.Menu, getHiSym("InvertedControls"), offset_dict) # Up/Down Edit
writeValue(ROM_COPY, 0x8002DA4E, Overlay.Menu, getLoSym("InvertedControls"), offset_dict) # Up/Down Edit
writeValue(ROM_COPY, 0x8002DA1E, Overlay.Menu, getHiSym("InvertedControls"), offset_dict) # Up/Down Edit
writeValue(ROM_COPY, 0x8002DA22, Overlay.Menu, getLoSym("InvertedControls"), offset_dict) # Up/Down Edit
writeValue(ROM_COPY, 0x8002DADE, Overlay.Menu, getHiSym("InvertedControls"), offset_dict) # Save to global
writeValue(ROM_COPY, 0x8002DAE2, Overlay.Menu, getLoSym("InvertedControls"), offset_dict) # Save to global
writeValue(ROM_COPY, 0x8002DA88, Overlay.Menu, 0x1000, offset_dict) # Prevent Language Update
writeFunction(ROM_COPY, 0x8002DEC4, Overlay.Menu, "displayInverted", offset_dict) # Modify Function Call
# Menu/Shop: Mystery
move_levels = (1, 1, 3, 1, 7, 1, 1, 7)
for index, value in enumerate(move_levels):
writeValue(ROM_COPY, 0x80033938 + (8 * index) + 4, Overlay.Menu, value, offset_dict, 1)
# Menu/Shop: Misc Shop Stuff
writeHook(ROM_COPY, 0x800260E0, Overlay.Menu, "CrankyDecouple", offset_dict)
writeHook(ROM_COPY, 0x800260A8, Overlay.Menu, "ForceToBuyMoveInOneLevel", offset_dict)
writeValue(ROM_COPY, 0x80026160, Overlay.Menu, 0, offset_dict, 4)
writeHook(ROM_COPY, 0x80026140, Overlay.Menu, "PriceKongStore", offset_dict)
writeHook(ROM_COPY, 0x80025FC0, Overlay.Menu, "CharacterCollectableBaseModify", offset_dict)
writeHook(ROM_COPY, 0x800260F0, Overlay.Menu, "SetMoveBaseBitfield", offset_dict)
writeHook(ROM_COPY, 0x8002611C, Overlay.Menu, "SetMoveBaseProgressive", offset_dict)
writeHook(ROM_COPY, 0x80026924, Overlay.Menu, "AlwaysCandyInstrument", offset_dict)
writeValue(ROM_COPY, 0x80026072, Overlay.Menu, getHiSym("CrankyMoves_New"), offset_dict)
writeValue(ROM_COPY, 0x8002607A, Overlay.Menu, getLoSym("CrankyMoves_New"), offset_dict)
writeValue(ROM_COPY, 0x8002607E, Overlay.Menu, getHiSym("CandyMoves_New"), offset_dict)
writeValue(ROM_COPY, 0x80026086, Overlay.Menu, getLoSym("CandyMoves_New"), offset_dict)
writeValue(ROM_COPY, 0x8002608A, Overlay.Menu, getHiSym("FunkyMoves_New"), offset_dict)
writeValue(ROM_COPY, 0x8002608E, Overlay.Menu, getLoSym("FunkyMoves_New"), offset_dict)
# Mill and Crypt Levers
# Mill Levers
if settings.mill_levers[0] > 0:
sequence_length = 0
sequence_ended = False
sequence_pattern = [0] * 5
for x in range(5):
if not sequence_ended:
if settings.mill_levers[x] == 0:
sequence_ended = True
else:
sequence_length += 1
writeValue(ROM_COPY, 0x8064E4CE, Overlay.Static, sequence_length, offset_dict)
for x in range(sequence_length):
sequence_pattern[x] = settings.mill_levers[(sequence_length - 1) - x]
for xi, x in enumerate(sequence_pattern):
writeValue(ROM_COPY, 0x807482E0 + xi, Overlay.Static, x, offset_dict, 1)
# Crypt Levers
if settings.crypt_levers[0] > 0:
sequence = [0] * 3
for x in range(3):
sequence[x] = settings.crypt_levers[2 - x]
for xi, x in enumerate(sequence):
writeValue(ROM_COPY, 0x807482E8 + xi, Overlay.Static, x, offset_dict, 1)
if IsItemSelected(settings.hard_mode, settings.hard_mode_selected, HardModeSelected.shuffled_jetpac_enemies, False):
order = settings.jetpac_enemy_order
functions = [
0x80029884,
0x8002992C,
0x80029AF8,
0x80029E0C,
0x8002A2AC,
0x8002A6C0,
0x8002A8F0,
0x8002A944,
]
for slot_index, enemy_index in enumerate(order):
writeValue(ROM_COPY, 0x8002E8F4 + (4 * slot_index), Overlay.Jetpac, functions[enemy_index], offset_dict, 4)
writeFunction(ROM_COPY, 0x80025034, Overlay.Jetpac, "loadJetpacSprites_handler", offset_dict)
writeValue(ROM_COPY, 0x800281AC, Overlay.Jetpac, 0x5000, offset_dict) # Make Rareware Coin permanent once spawned until collected
writeValue(ROM_COPY, 0x806BA5A8, Overlay.Static, 0x1D800003, offset_dict, 4) # Fix some health oversights by making death if health <= 0 instead of == 0
writeValue(ROM_COPY, 0x806BA50E, Overlay.Static, 20, offset_dict) # Change BHDM Cooldown
if settings.mirror_mode:
# Invert Aspect
writeValue(ROM_COPY, 0x80006070, Overlay.Boot, 0x3C048000, offset_dict, 4) # Invert Aspect - LUI a0, 0x8000
writeValue(ROM_COPY, 0x80006074, Overlay.Boot, 0x00E43826, offset_dict, 4) # Invert Aspect - XOR a3, a3, a0
# Invert X Axis input
writeFunction(ROM_COPY, 0x8060AC60, Overlay.Static, "parseControllerInput", offset_dict)
# Invert camera directions
writeValue(ROM_COPY, 0x806EA25E, Overlay.Static, 45, offset_dict, 2, True)
writeValue(ROM_COPY, 0x806EA2CA, Overlay.Static, -45, offset_dict, 2, True)
# Fix chunk rendering
writeValue(ROM_COPY, 0x80657F2C, Overlay.Static, 0x0082082A, offset_dict, 4)
writeValue(ROM_COPY, 0x80657F7C, Overlay.Static, 0x0046082A, offset_dict, 4)
# Fix cannon game
writeValue(ROM_COPY, 0x807599B0, Overlay.Static, 0xBF, offset_dict, 1)
# Skybox
writeValue(ROM_COPY, 0x8068BD0C, Overlay.Static, 0x46103201, offset_dict, 4)
writeValue(ROM_COPY, 0x80706A54, Overlay.Static, 0x03194023, offset_dict, 4)
# Invert G_TRI2 Call
writeValue(ROM_COPY, 0x8065DFBE, Overlay.Static, 0x0206, offset_dict)
writeValue(ROM_COPY, 0x8065DFC6, Overlay.Static, 0x0604, offset_dict)
# Invert pan
writeHook(ROM_COPY, 0x80737708, Overlay.Static, "invertPan", offset_dict)
if IsItemSelected(settings.hard_mode, settings.hard_mode_selected, HardModeSelected.reduced_fall_damage_threshold, False):
writeFloatUpper(ROM_COPY, 0x806D3682, Overlay.Static, 100, offset_dict) # Change fall too far threshold
writeFunction(ROM_COPY, 0x806D36B4, Overlay.Static, "fallDamageWrapper", offset_dict)
writeFunction(ROM_COPY, 0x8067F540, Overlay.Static, "transformBarrelImmunity", offset_dict)
writeFunction(ROM_COPY, 0x8068B178, Overlay.Static, "factoryShedFallImmunity", offset_dict)
# Increase Arcade Lives
writeValue(ROM_COPY, 0x80024F10, Overlay.Arcade, 0x240E0005, offset_dict, 4) # ADDIU $t6, $r0, 0x5 - Set Arcade Lives
writeValue(ROM_COPY, 0x80024F2A, Overlay.Arcade, 0xC71B, offset_dict)
writeValue(ROM_COPY, 0x80024F2C, Overlay.Arcade, 0xA0CEC71B, offset_dict, 4) # SB $t6, 0xC71B ($a2)
writeValue(ROM_COPY, 0x80024688, Overlay.Arcade, 0x1000, offset_dict) # Disable lives bonus for reaching 10k points
writeValue(ROM_COPY, 0x8002B7A4, Overlay.Arcade, 0, offset_dict, 4) # Disable death removing lives
# Address of Nintendo Coin Image write: 0x8002E8B4/0x8002E8C0
writeFunction(ROM_COPY, 0x80024D5C, Overlay.Arcade, "arcadeExit", offset_dict)
writeFunction(ROM_COPY, 0x800257B4, Overlay.Arcade, "arcadeExit", offset_dict)
writeFunction(ROM_COPY, 0x8002B6D4, Overlay.Arcade, "arcadeExit", offset_dict)
writeFunction(ROM_COPY, 0x8002FA58, Overlay.Arcade, "arcadeExit", offset_dict)
# Fix arcade level setting logic
writeFunction(ROM_COPY, 0x80024F34, Overlay.Arcade, "determineArcadeLevel", offset_dict) # Change log
writeValue(ROM_COPY, 0x80024F70, Overlay.Arcade, 0, offset_dict, 4) # Prevent level set
writeValue(ROM_COPY, 0x80024F50, Overlay.Arcade, 0, offset_dict, 4) # Prevent level set
# Arcade Level Order Rando
writeFunction(ROM_COPY, 0x8002F7BC, Overlay.Arcade, "HandleArcadeVictory", offset_dict)
writeFunction(ROM_COPY, 0x8002FA68, Overlay.Arcade, "HandleArcadeVictory", offset_dict)
writeValue(ROM_COPY, 0x8002FA24, Overlay.Arcade, 0x1000, offset_dict)
writeLabelValue(ROM_COPY, 0x80748088, Overlay.Static, "CrownDoorCheck", offset_dict) # Update check on Crown Door
# Fast Start: Beginning of game
if settings.fast_start_beginning_of_game:
writeValue(ROM_COPY, 0x80714540, Overlay.Static, 0, offset_dict, 4)
file_init_flags.extend(
[
0x1BB, # Japes Open
0x186, # Escape Cutscene
0x17F, # Training Barrels Spawned
0x180, # First Slam Given
]
)
else:
writeValue(ROM_COPY, 0x80755F4C, Overlay.Static, 0, offset_dict) # Remove escape cutscene
if settings.auto_keys:
file_init_flags.append(0x1BB) # Japes Open
barrier_flags = {
RemovedBarriersSelected.japes_shellhive_gate: [0x7],
RemovedBarriersSelected.aztec_tunnel_door: [0x4E],
RemovedBarriersSelected.factory_testing_gate: [0x6E],
RemovedBarriersSelected.galleon_lighthouse_gate: [0x9B],
RemovedBarriersSelected.forest_green_tunnel: [0xCF, 0xD0], # Feather, Pineapple
RemovedBarriersSelected.forest_yellow_tunnel: [0xD2],
RemovedBarriersSelected.aztec_5dtemple_switches: [0x37],
RemovedBarriersSelected.factory_production_room: [0x6F],
RemovedBarriersSelected.galleon_seasick_ship: [0x9C],
RemovedBarriersSelected.caves_igloo_pads: [0x128],
RemovedBarriersSelected.galleon_shipyard_area_gate: [0xA1],
RemovedBarriersSelected.caves_ice_walls: [266, 267, 265], # Entrance, Snide, Giant Boulder
RemovedBarriersSelected.galleon_treasure_room: [0xA2],
RemovedBarriersSelected.aztec_tiny_temple_ice: [0x45],
}
for barrier in barrier_flags:
if IsItemSelected(settings.remove_barriers_enabled, settings.remove_barriers_selected, barrier):
file_init_flags.extend(barrier_flags[barrier])
writeFunction(ROM_COPY, 0x80682A98, Overlay.Static, "resetCannonGameState", offset_dict)
if settings.enemy_kill_crown_timer:
writeFunction(ROM_COPY, 0x8072AC80, Overlay.Static, "handleCrownTimer", offset_dict)
writeFunction(ROM_COPY, 0x806AEEBC, Overlay.Static, "klumpCrownHandler", offset_dict)
# Enable oranges in Crowns
writeHook(ROM_COPY, 0x806E6000, Overlay.Static, "DisableGunInCrowns", offset_dict)
for map_id in (
Maps.JapesCrown,
Maps.AztecCrown,
Maps.FactoryCrown,
Maps.GalleonCrown,
Maps.ForestCrown,
Maps.CavesCrown,
Maps.CastleCrown,
Maps.HelmCrown,
Maps.LobbyCrown,
Maps.SnidesCrown,
):
writeValue(ROM_COPY, 0x8074482C + (12 * map_id), Overlay.Static, 0x01120402, offset_dict, 4)
# Disable pickup respawn in spider boss (temporary)
writeValue(ROM_COPY, 0x8074482C + (12 * Maps.ForestSpider), Overlay.Static, 0x00000141, offset_dict, 4)
# Remove troll flame in 75m
writeValue(ROM_COPY, 0x80028FE4, Overlay.Arcade, 0xAC800018, offset_dict, 4) # sw $zero, 0x18 ($ao). Sets obj type to 0
# Patch Enemy Collision
writeLabelValue(ROM_COPY, 0x8074B53C, Overlay.Static, "fixed_shockwave_collision", offset_dict) # Purple Klaptrap
writeLabelValue(ROM_COPY, 0x8074B4EC, Overlay.Static, "fixed_shockwave_collision", offset_dict) # Red Klaptrap
writeLabelValue(ROM_COPY, 0x8074BC24, Overlay.Static, "fixed_shockwave_collision", offset_dict) # Book
writeLabelValue(ROM_COPY, 0x8074BBF0, Overlay.Static, "fixed_bug_collision", offset_dict) # All Zingers & Bats & the bug
writeLabelValue(ROM_COPY, 0x8074B6B8, Overlay.Static, "fixed_dice_collision", offset_dict) # Mr. Dice (Both), Sir Domino, Ruler
writeLabelValue(ROM_COPY, 0x8074B4C4, Overlay.Static, "fixed_klap_collision", offset_dict) # Green Klaptrap, Skeleton Klaptrap
if not settings.disable_racing_patches:
writeValue(ROM_COPY, 0x806D0328, Overlay.Static, 0x1000, offset_dict) # Disable Fungi OSprint Slowdown
writeValue(ROM_COPY, 0x806CBE04, Overlay.Static, 0x1000, offset_dict) # Disable Fungi OSprint Slowdown
writeFloat(ROM_COPY, 0x807532E4, Overlay.Static, 90, offset_dict) # Set Chunky pickup speed to 90 (instead of 100)
writeValue(ROM_COPY, 0x806BEB76, Overlay.Static, 0x3FE8, offset_dict) # Tone down the rabbit race 1 speed to 0.75x rather than 1.0x
# Expand Path Allocation
writeValue(ROM_COPY, 0x80722E56, Overlay.Static, getHiSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x80722E7A, Overlay.Static, getLoSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x80722FF6, Overlay.Static, getHiSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x80722FFE, Overlay.Static, getLoSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x80723026, Overlay.Static, getHiSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x8072302E, Overlay.Static, getLoSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x80723CF6, Overlay.Static, getHiSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x80723D06, Overlay.Static, getLoSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x80723FEA, Overlay.Static, getHiSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x80723FEE, Overlay.Static, getLoSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x807241CE, Overlay.Static, getHiSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x807241DE, Overlay.Static, getLoSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x80724312, Overlay.Static, getHiSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x8072431E, Overlay.Static, getLoSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x807245DE, Overlay.Static, getHiSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x807245E6, Overlay.Static, getLoSym("balloon_path_pointers"), offset_dict)
writeValue(ROM_COPY, 0x80722E92, Overlay.Static, getVar("path_cap"), offset_dict)
# Expand Enemy Drops Table
writeValue(ROM_COPY, 0x806A5CA6, Overlay.Static, getHiSym("drops"), offset_dict, 2)
writeValue(ROM_COPY, 0x806A5CB6, Overlay.Static, getLoSym("drops"), offset_dict, 2)
writeValue(ROM_COPY, 0x806A5CBA, Overlay.Static, getHiSym("drops"), offset_dict, 2)
writeValue(ROM_COPY, 0x806A5CBE, Overlay.Static, getLoSym("drops"), offset_dict, 2)
writeValue(ROM_COPY, 0x806A5CD2, Overlay.Static, getHiSym("drops"), offset_dict, 2)
writeValue(ROM_COPY, 0x806A5CD6, Overlay.Static, getLoSym("drops"), offset_dict, 2)
# Pause Sprite Expansion / Carousel Init Functions
writeValue(ROM_COPY, 0x806AB35A, Overlay.Static, getHiSym("file_sprites"), offset_dict)
writeValue(ROM_COPY, 0x806AB35E, Overlay.Static, getLoSym("file_sprites"), offset_dict)
writeValue(ROM_COPY, 0x806AB2CA, Overlay.Static, getHiSym("file_items"), offset_dict)
writeValue(ROM_COPY, 0x806AB2DA, Overlay.Static, getLoSym("file_items"), offset_dict)
writeValue(ROM_COPY, 0x806A9FC2, Overlay.Static, getHiSym("file_items"), offset_dict)
writeValue(ROM_COPY, 0x806AA036, Overlay.Static, getLoSym("file_items"), offset_dict)
writeValue(ROM_COPY, 0x806AA00E, Overlay.Static, getHiSym("file_item_caps"), offset_dict)
writeValue(ROM_COPY, 0x806AA032, Overlay.Static, getLoSym("file_item_caps"), offset_dict)
writeFunction(ROM_COPY, 0x806AB3C4, Overlay.Static, "updatePauseScreenWheel", offset_dict) # Change Wheel to scroller
writeValue(ROM_COPY, 0x806AB3B4, Overlay.Static, 0xAFB00018, offset_dict, 4) # SW $s0, 0x18 ($sp). Change last param to index
writeValue(ROM_COPY, 0x806AB3A0, Overlay.Static, 0xAFA90014, offset_dict, 4) # SW $t1, 0x14 ($sp). Change 2nd-to-last param to local index
writeValue(ROM_COPY, 0x806AB444, Overlay.Static, 0, offset_dict, 4) # Prevent joystick sprite rendering
writeFunction(ROM_COPY, 0x806AB528, Overlay.Static, "handleSpriteCode", offset_dict) # Change sprite control function
writeValue(ROM_COPY, 0x806AB52C, Overlay.Static, 0x8FA40060, offset_dict, 4) # LW $a0, 0x60 ($sp). Change param
writeValue(ROM_COPY, 0x806A8DB2, Overlay.Static, 0x0029, offset_dict) # Swap left/right direction
writeValue(ROM_COPY, 0x806A8DBA, Overlay.Static, 0xFFD8, offset_dict) # Swap left/right direction
writeValue(ROM_COPY, 0x806A8DB4, Overlay.Static, 0x5420, offset_dict) # BEQL -> BNEL
writeValue(ROM_COPY, 0x806A8DF0, Overlay.Static, 0x1020, offset_dict) # BNE -> BEQ
writeFunction(ROM_COPY, 0x806A9F74, Overlay.Static, "pauseScreen3And4ItemName", offset_dict) # Item Name"
# Write File init flags - Always keep at the end
file_init_flags = list(set(file_init_flags)) # Make sure it only contains unique values
if len(file_init_flags) > 0x3FF:
raise Exception("Too many file init flags. Please report this to the devs with a setting string.")
ROM_COPY.seek(0x1FFD800)
for flag in file_init_flags:
ROM_COPY.writeMultipleBytes(flag, 2)
ROM_COPY.writeMultipleBytes(0xFFFF, 2)
# Settings to check usage
# faster_checks.rabbit_race
# quality_of_life.caves_kosha_dead
# galleon_water_raised