<feed xmlns='http://www.w3.org/2005/Atom'>
<title>Shipwright/soh/include, 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>Don't erase __attribute__ under clang-cl (#7186)</title>
<updated>2026-09-13T18:21:36+00:00</updated>
<author>
<name>David Racine</name>
<email>bass_dr@hotmail.com</email>
</author>
<published>2026-09-13T18:21:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=78dc6d9702dc00284166188467555868cb917354'/>
<id>78dc6d9702dc00284166188467555868cb917354</id>
<content type='text'>
* Don't erase __attribute__ under clang-cl

The shim fires when __GNUC__ is absent, which clang-cl does not define even
though it supports __attribute__ fully. Erasing it breaks clang's own intrinsics
headers: mmintrin.h declares __m64 as a vector via __attribute__((vector_size)),
so it degrades to a scalar and every use of it fails to compile.

* Don't erase __attribute__ under clang-cl

clang-cl supports it but does not define __GNUC__, so the shim fired and broke
clang's own intrinsics headers.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* Don't erase __attribute__ under clang-cl

The shim fires when __GNUC__ is absent, which clang-cl does not define even
though it supports __attribute__ fully. Erasing it breaks clang's own intrinsics
headers: mmintrin.h declares __m64 as a vector via __attribute__((vector_size)),
so it degrades to a scalar and every use of it fails to compile.

* Don't erase __attribute__ under clang-cl

clang-cl supports it but does not define __GNUC__, so the shim fired and broke
clang's own intrinsics headers.</pre>
</div>
</content>
</entry>
<entry>
<title>Fix flare dancer crash (#7122)</title>
<updated>2026-09-06T15:01:46+00:00</updated>
<author>
<name>Pepe20129</name>
<email>72659707+Pepe20129@users.noreply.github.com</email>
</author>
<published>2026-09-06T15:01:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=61523391e29be22c85d6efbabc0c08820783f0a5'/>
<id>61523391e29be22c85d6efbabc0c08820783f0a5</id>
<content type='text'>
Expand the main `GfxPool` buffers to 1MiB</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Expand the main `GfxPool` buffers to 1MiB</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>Clear fire timer when blue warp skip bypasses chamber of sage (#7112)</title>
<updated>2026-08-23T21:08:55+00:00</updated>
<author>
<name>Philip Dubé</name>
<email>159546+serprex@users.noreply.github.com</email>
</author>
<published>2026-08-23T21:08:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=07414fd722500d5d1bc58fc66438a2602729b8ab'/>
<id>07414fd722500d5d1bc58fc66438a2602729b8ab</id>
<content type='text'>
Avoids timer from Volvagia carrying over to DMC</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Avoids timer from Volvagia carrying over to DMC</pre>
</div>
</content>
</entry>
<entry>
<title>Hookify fish, refactor fishsanity (#7091)</title>
<updated>2026-08-18T14:36:30+00:00</updated>
<author>
<name>Philip Dubé</name>
<email>159546+serprex@users.noreply.github.com</email>
</author>
<published>2026-08-18T14:36:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=9baa114f6bedc6d66393f0ae2363ab3b5e6409a0'/>
<id>9baa114f6bedc6d66393f0ae2363ab3b5e6409a0</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Decomp, three audio functions (#7069)</title>
<updated>2026-08-14T20:01:49+00:00</updated>
<author>
<name>djevangelia</name>
<email>263709373+djevangelia@users.noreply.github.com</email>
</author>
<published>2026-08-14T20:01:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=e048afd10a7d87b185bfda06f55a63a46ce50b3b'/>
<id>e048afd10a7d87b185bfda06f55a63a46ce50b3b</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>fix(audio): bound audio-heap cache tables (SIGSEGV with large custom music packs) (#6932)</title>
<updated>2026-08-09T18:36:33+00:00</updated>
<author>
<name>Pedro Nascimento</name>
<email>pnascimento@gmail.com</email>
</author>
<published>2026-08-09T18:36:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=4e39d06accfa65fbed9e034c3cd7face91a6d80c'/>
<id>4e39d06accfa65fbed9e034c3cd7face91a6d80c</id>
<content type='text'>
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 -&gt; 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.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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 -&gt; 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.</pre>
</div>
</content>
</entry>
<entry>
<title>Save editor v2 (#6474)</title>
<updated>2026-08-09T02:31:11+00:00</updated>
<author>
<name>PurpleHato</name>
<email>linkvssangoku.jr@gmail.com</email>
</author>
<published>2026-08-09T02:31:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=426b37ddf0e2098051c2fa8b334e248755ac46c0'/>
<id>426b37ddf0e2098051c2fa8b334e248755ac46c0</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Hookify Skeleton Unregisters (#6988)</title>
<updated>2026-08-08T21:16:10+00:00</updated>
<author>
<name>Jameriquiah</name>
<email>42100286+Jameriquiah@users.noreply.github.com</email>
</author>
<published>2026-08-08T21:16:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=a4901abdc5d961fa94c7ab49253b8e518d6bff1f'/>
<id>a4901abdc5d961fa94c7ab49253b8e518d6bff1f</id>
<content type='text'>
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>
Co-authored-by: serprex &lt;159546+serprex@users.noreply.github.com&gt;</pre>
</div>
</content>
</entry>
<entry>
<title>Decomp, some camera names (#7043)</title>
<updated>2026-08-08T21:12:31+00:00</updated>
<author>
<name>djevangelia</name>
<email>263709373+djevangelia@users.noreply.github.com</email>
</author>
<published>2026-08-08T21:12:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.dog6.net/Shipwright/commit/?id=f2f4413bff84b10e46b3d6843a6f945527af92e5'/>
<id>f2f4413bff84b10e46b3d6843a6f945527af92e5</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
