<feed xmlns='http://www.w3.org/2005/Atom'>
<title>Shipwright/soh/src/code, branch develop</title>
<subtitle>Ship of Harkinian: Ocarina of Time PC port</subtitle>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/'/>
<entry>
<title>Shuffle Scarecrow Song (#7205)</title>
<updated>2026-09-18T14:54:24+00:00</updated>
<author>
<name>Philip Dubé</name>
<email>159546+serprex@users.noreply.github.com</email>
</author>
<published>2026-09-18T14:54:24+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=a353b6e7ceaf7e48e2b06ffda58a871ddffbb2ef'/>
<id>a353b6e7ceaf7e48e2b06ffda58a871ddffbb2ef</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>clean up headers (#7194)</title>
<updated>2026-09-14T19:49:29+00:00</updated>
<author>
<name>Philip Dubé</name>
<email>159546+serprex@users.noreply.github.com</email>
</author>
<published>2026-09-14T19:49:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=060787a239108ddc8c860d9974a5b888258985a1'/>
<id>060787a239108ddc8c860d9974a5b888258985a1</id>
<content type='text'>
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</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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</pre>
</div>
</content>
</entry>
<entry>
<title>[Enhancement] Time Splits v2 (#5839)</title>
<updated>2026-09-14T16:55:22+00:00</updated>
<author>
<name>Caladius</name>
<email>Caladius@users.noreply.github.com</email>
</author>
<published>2026-09-14T16:55:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=43ea3328744323b96a04886693f02501fbeab27b'/>
<id>43ea3328744323b96a04886693f02501fbeab27b</id>
<content type='text'>
This aims to port over the Time Splits feature from 2Ship as it is cleaner &amp; 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 &lt;159546+serprex@users.noreply.github.com&gt;</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This aims to port over the Time Splits feature from 2Ship as it is cleaner &amp; 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 &lt;159546+serprex@users.noreply.github.com&gt;</pre>
</div>
</content>
</entry>
<entry>
<title>Fix title card margins (#7167)</title>
<updated>2026-09-13T21:03:26+00:00</updated>
<author>
<name>Philip Dubé</name>
<email>159546+serprex@users.noreply.github.com</email>
</author>
<published>2026-09-13T21:03:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=8b3d91506ef5f57abd0831707198ba1fc785fe99'/>
<id>8b3d91506ef5f57abd0831707198ba1fc785fe99</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Jabu fish cutscene skip: immediately transition (#7159)</title>
<updated>2026-09-08T13:38:20+00:00</updated>
<author>
<name>Philip Dubé</name>
<email>159546+serprex@users.noreply.github.com</email>
</author>
<published>2026-09-08T13:38:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=b4c41c9bf4ae32d32bd9172b88aff8456993ad0b'/>
<id>b4c41c9bf4ae32d32bd9172b88aff8456993ad0b</id>
<content type='text'>
This avoids awkward pause, also prevents recapturing fish

Also cleanup RSK_JABU_OPEN</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This avoids awkward pause, also prevents recapturing fish

Also cleanup RSK_JABU_OPEN</pre>
</div>
</content>
</entry>
<entry>
<title>Reopen the OPUS decoder when a note moves to another sample (#7137)</title>
<updated>2026-09-06T13:10:21+00:00</updated>
<author>
<name>David Racine</name>
<email>bass_dr@hotmail.com</email>
</author>
<published>2026-09-06T13:10:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=17a4c2cf89a9b34c8b1b6db9bf17cd46ddb3c93b'/>
<id>17a4c2cf89a9b34c8b1b6db9bf17cd46ddb3c93b</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
Co-authored-by: serprex &lt;159546+serprex@users.noreply.github.com&gt;</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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 &lt;noreply@anthropic.com&gt;
Co-authored-by: serprex &lt;159546+serprex@users.noreply.github.com&gt;</pre>
</div>
</content>
</entry>
<entry>
<title>Honour the loop end when reading streamed music (#7129)</title>
<updated>2026-08-30T14:03:45+00:00</updated>
<author>
<name>David Racine</name>
<email>bass_dr@hotmail.com</email>
</author>
<published>2026-08-30T14:03:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=8bf26365beb9b67a971962f05cb89fcfcf1bf59c'/>
<id>8bf26365beb9b67a971962f05cb89fcfcf1bf59c</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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 &lt;noreply@anthropic.com&gt;</pre>
</div>
</content>
</entry>
<entry>
<title>Restore the realId assignment in AudioLoad_AsyncLoadInner (#7105)</title>
<updated>2026-08-23T12:37:51+00:00</updated>
<author>
<name>David Racine</name>
<email>bass_dr@hotmail.com</email>
</author>
<published>2026-08-23T12:37:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=945f70222a72611fe8dd1a6b59dfc6c7e512e176'/>
<id>945f70222a72611fe8dd1a6b59dfc6c7e512e176</id>
<content type='text'>
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.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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.</pre>
</div>
</content>
</entry>
<entry>
<title>Drop the seqLoadStatus bounds checks made redundant by #6932 (#7100)</title>
<updated>2026-08-22T14:19:04+00:00</updated>
<author>
<name>David Racine</name>
<email>bass_dr@hotmail.com</email>
</author>
<published>2026-08-22T14:19:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=27b71b1a54c77711caf2a4fbe76961df6504b960'/>
<id>27b71b1a54c77711caf2a4fbe76961df6504b960</id>
<content type='text'>
#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.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
#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.</pre>
</div>
</content>
</entry>
<entry>
<title>Hookify masks / timeless equipment (#7088)</title>
<updated>2026-08-17T17:24:03+00:00</updated>
<author>
<name>Philip Dubé</name>
<email>159546+serprex@users.noreply.github.com</email>
</author>
<published>2026-08-17T17:24:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=bd8a5825f94bf226680ce009ce5a50948aa48a78'/>
<id>bd8a5825f94bf226680ce009ce5a50948aa48a78</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
