summaryrefslogtreecommitdiff
path: root/soh/src
AgeCommit message (Collapse)Author
3 daysReplace tabs with spaces (#7223)Philip Dubé
4 daysAdd restoration for hookshot as child to softlock (#7219)Philip Dubé
Requested for speedrun mode Also hookify more enemy rando stuff while I'm in the neighbourhood
5 daysShuffle Scarecrow Song (#7205)Philip Dubé
6 daysFix boolean logic error breaking Talon cutscene skip (#7211)Philip Dubé
6 daysRefactor file select quest visibility, fix single quest handling (#7210)Philip Dubé
Select single visible quest when only single quest visible Fix bad operator precedence
6 daysHookify three Glitch Restoration options (#7200)Jordan Longstaff
7 daysHookify Mweep cutscene options (#7199)Jordan Longstaff
8 daysQuickBossDeaths.cpp (#7192)Philip Dubé
Phantom Ganon was only QuickBossDeaths skip, Twinrova only had rando / boss rush hack
8 daysclean up headers (#7194)Philip Dubé
GameInteractor.h does not itself depend on libultraship/bridge/consolevariablebridge.h, instead its dependencies requiring that header should include it themselves This was particularly impactful for SohGui.hpp which included all the windows
8 days[Enhancement] Time Splits v2 (#5839)Caladius
This aims to port over the Time Splits feature from 2Ship as it is cleaner & more robust. New to this is the ability to finally compare splits from a second list. Old Save data will now be converted to the new format automatically. Once it converts the data, the old save file will be renamed with a new ".backup" extension. Co-authored-by: serprex <159546+serprex@users.noreply.github.com>
8 daysHookify FP movement (#7189)Philip Dubé
Apply consistent movement effects to first person movement
9 daysFix title card margins (#7167)Philip Dubé
2026-09-08Don't apply inverted X axis aiming to first person movement (#7163)Philip Dubé
2026-09-08Fix megadives with jump clamping (#7164)Pepper0ni
2026-09-08Reduce big octo cutscene skip (#7158)Philip Dubé
Pointless to give control while player waits for big octo to descend (& still play cutscene), just opens up complications & speedrun discussion raised concern about backflip to get behind Big Octo
2026-09-08water temple: quadruple water level change when skipping cutscene (#7162)Philip Dubé
prevents falling into water while it descends, reaching 2f cracked wall without tricks
2026-09-08Jabu fish cutscene skip: immediately transition (#7159)Philip Dubé
This avoids awkward pause, also prevents recapturing fish Also cleanup RSK_JABU_OPEN
2026-09-06Reopen the OPUS decoder when a note moves to another sample (#7137)David Racine
The decoder cached on a note was keyed on nothing, so a note reused for a different streamed sample carried on decoding the previous track. Audible as the wrong custom music: the sequence and soundfont the audio editor reports are correct, only the samples reaching the mixer are not. Reproduced on the game-start cutscene chain with a streamed music pack in 4 of 6 runs; 0 of 6 after. Co-authored-by: Claude Opus 5 <noreply@anthropic.com> Co-authored-by: serprex <159546+serprex@users.noreply.github.com>
2026-08-31Remove completed mask quest option, add all masks to starting items menu (#7104)Philip Dubé
Fix masks not rendering properly with completed mask quest Remove completed mask quest option, add all masks to starting items menu logic: handle starting with masks being able to skip ahead a bit in trade sequence
2026-08-31Avoid randomizer generation races with file select (#7136)Philip Dubé
Fixes both starting file while generating, & starting generation in file loading transition Remove RandoGenerating cvar
2026-08-31[Enhancement] Hide quests in File Select (#7093)Jordan Longstaff
Migrate File Select CVars Co-authored-by: Unreference <87878910+unreference@users.noreply.github.com>
2026-08-30Honour the loop end when reading streamed music (#7129)David Racine
Streamed samples were read a whole block at a time regardless of where the loop ended, so playback ran past it and only then jumped back. The seam therefore landed at a random offset up to a block late instead of where the sample asked for it, which is why a loop that is clean in an editor pops in game. Fixes #5780. Claude-Session: https://claude.ai/code/session_011Ex3z29fQzPEZgwH4EA641 Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-30Fix King Zora talkstate not updating (#7125)djevangelia
2026-08-27Bugfix for AlwaysOnFixes.cpp as well as a fallback to prevent crashes when ↵HighTierHumann
attempting to display an textId 0 (#7123) Add guard to check if camera mode is CAMERA_MODE_FIRST_PERSON before applying fixes Also adds missing PLAYER_IA modes for magic arrows, as well as applying camera fix for Hookshot outside of just lakeside lab. Move gameinteractor for change aiming camera inside bow/sling/hook aiming block
2026-08-23Restore the realId assignment in AudioLoad_AsyncLoadInner (#7105)David Racine
The function declares realId and then indexes with it thirteen times - the load-status tables, AudioLoad_SearchCaches, the table entry it reads size and address from, every cache allocation, and the status write at the end - but nothing assigns it. It has read an uninitialised local since "Custom Sequences" (#2066) dropped the assignment in 2022. Restoring the line puts back the value the rest of the function expects. For SEQUENCE_TABLE and FONT_TABLE, AudioLoad_GetRealTableIndex returns the id unchanged, so this is only a correctness fix in practice: the paths that reach this function today go through the sequence script's async load command, which is rare enough that the garbage index has not been tied to any report.
2026-08-22Enemy rando, make Keese not fall if not dead + fall downscale (#7101)djevangelia
2026-08-22Drop the seqLoadStatus bounds checks made redundant by #6932 (#7100)David Racine
#6917 guarded the three seqLoadStatus accessors against sequenceMapSize because the array was allocated at exactly that size, so a custom sequence id past it read and wrote off the end. #6932 sized the array to sequenceMapSize + 0xF to match sequenceMap, which covers the whole id space rather than rejecting the ids outside it, and also protects the writers those guards never saw: AudioHeap_AllocCached and AudioHeap_PopCache index seqLoadStatus directly. The guards are now not just redundant but bounded wrong - they treat the ids in [sequenceMapSize, sequenceMapSize + 0xF) as absent from a table that now has room for them. Nothing breaks today because every entry starts at 5, so AudioLoad_IsSeqLoadComplete answers true regardless and AudioLoad_SetSeqLoadStatus already declines to overwrite a 5 - but once the heap cache path moves such an entry off 5, the guard blocks an update that should happen. Reverting them restores the three functions to their decompiled form. The sizing from #6932 and the id check in AudioLoad_SyncInitSeqPlayerInternal remain the actual protection.
2026-08-18Hookify fish, refactor fishsanity (#7091)Philip Dubé
2026-08-17Hookify masks / timeless equipment (#7088)Philip Dubé
2026-08-17Add a Skip Warp Cutscenes enhancement (#7059)David Racine
Warp song cutscenes were skipped for randomizer players whether they wanted it or not: Demo_Kankyo cut the departure animation short from a hardcoded IS_RANDO branch, and entrance rando cleared respawnFlag so the arrival never played. There was no way to get the vanilla warp back, and no way for a vanilla playthrough to skip it. Drop both and put the behavior behind a Skip Warp Cutscenes toggle, defaulting on in randomizer so existing rando warps are unchanged. It kills the departure actor as it spawns and puts the arrival spawn mode back to IDLE, which covers both halves of the warp. Entrance rando's destination override moves off Demo_Kankyo's update onto a new OnWarpSongLeave hook fired from Environment_WarpSongLeave. That is where every warp path -- the cutscene, the skip toggle, and the spawn failure fallback -- commits its destination, so the override no longer depends on the departure actor being alive to see it, and a warp song shuffled onto a grotto return keeps its grotto respawn. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17Enemy rando, let enemies air walk over voidout floor in clear rooms (#7005)djevangelia
Behind a setting Add timed rooms + Fire Temple modifications
2026-08-15Enemy rando, fix healthy big Guays not dying (#7065)djevangelia
2026-08-14bombchu bowling setting: first item (#7070)Philip Dubé
desirable for speedrun settings that want less variance. also use for moving rando logic into hooks
2026-08-14Decomp, three audio functions (#7069)djevangelia
2026-08-10Enemy rando, set EnTp EnSkb EnPeehat collider positions on actor init (#7049)djevangelia
2026-08-09Fix mirror decal not rendering on some walls (#7052)Philip Dubé
2026-08-09fix(audio): bound audio-heap cache tables (SIGSEGV with large custom music ↵Pedro Nascimento
packs) (#6932) Root cause of three identical field crashes (audio thread, opcode fetch through a pointer with its low 32 bits overwritten, seconds after scene transitions): AudioHeap_AllocPermanent writes permanentCache[index] with index = permanentPool.count and no bound against the 32-entry array. In SoH every soundfont sync-load is forced permanent, and custom sequences whose SEQ.xml says CachePolicy="Temporary" ALSO allocate permanently (the factory stores the LUS enum where CACHE_TEMPORARY == 0, while AudioLoad_SyncLoad's switch reads 0 with the ROM convention 'permanent'). A pack with ~60 streamed customs plus vanilla fonts pushes count past 32 within a session, after which each allocation sprays a {ptr, size, tableType/id} triplet at 24-byte stride through gAudioContext - entry[135]'s ptr field lands exactly on seqPlayers[0].scriptState.pc and entry[156] on seqPlayers[1]'s (both verified against the crash-dump registers). - permanentCache raised 32 -> 512 (12 KB) and AllocPermanent refuses allocations past the array instead of corrupting memory. - Same unbounded-index disease fixed in the three sibling writers: AllocCached's persistent path (16-entry array; CACHE_EITHER degrades to temporary, hard persistent requests fail cleanly), AllocPersistentSampleCacheEntry, AllocTemporarySampleCacheEntry. - seqLoadStatus malloc sized for the full id space (sequenceMapSize + 0xF) matching sequenceMap; custom ids above sequenceMapSize previously overflowed the allocation by up to 15 bytes. Upstream SoH bugs, not branch-introduced - this branch's many-track packs merely made the overflow reachable in normal play. Standalone upstreamable fix.
2026-08-09FixFlexDrops (#7047)Philip Dubé
2026-08-09Fix heap corruption due to skybox code using GameState as PlayState (#7045)Philip Dubé
Also corrects clearing skybox context before Skybox_Setup
2026-08-08Allow buying tunic as either age in rando even without shopsanity. (#7016)Pepper0ni
2026-08-08Hookify Skeleton Unregisters (#6988)Jameriquiah
Co-authored-by: serprex <159546+serprex@users.noreply.github.com>
2026-08-08Decomp, some camera names (#7043)djevangelia
2026-08-08Savestates, add `sEffectContext` (#7042)djevangelia
2026-08-08Polish, Twinrova intro cutscene skip with Kotake/Koume appear on climb (#7001)djevangelia
2026-08-08Enemy rando, fix Dark Link crush etc voidouts (#7038)djevangelia
2026-08-07Shuffle Treasure Chest Game (#7020)Philip Dubé
2026-08-06Restoration, hover fishing condition + XZ speed (#7031)djevangelia
2026-08-06Shuffle Silver (#5659)Philip Dubé
Co-authored-by: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Co-authored-by: leggettc18 <chris@leggett.dev>
2026-08-05Enhancement, drop throw-only actors toggle (#7023)djevangelia
Co-authored-by: djevangelia <djevangelia>
2026-08-05Fix Gold Skulltula tokens overwriting the Bow inventory slot (#7021)David Racine
gItemSlots and sExtraItemBases only cover the item IDs that live in the inventory, but Item_Give and Item_CheckObtainability index them with any item ID. Reading past gItemSlots lands on gUpgradeShifts, so INV_CONTENT(ITEM_SKULL_TOKEN) resolved to the Bow slot and stored the token there, permanently corrupting the save. Route both through a bounds-checked Item_GetSlot that reports SLOT_NONE for items that have no slot, and skip the inventory store in that case. That read is also undefined behaviour, which link-time optimization is free to exploit: with it present clang dropped the ITEM_SKULL_TOKEN branch and the ITEM_MEDALLION_WATER horse fixup from Item_Give entirely, so tokens were never counted either. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>