Fix packed raw menu sound effects
This commit is contained in:
@@ -168,7 +168,7 @@ public class Sys4AssetStoreTests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Sc0000BgmVoiceAndSfxPayloadsReadDirectlyFromArchives()
|
||||
public void Sc0000AndTitleAudioPayloadsReadDirectlyFromTheirNativeAddressSpaces()
|
||||
{
|
||||
var catalog = Sys4AssetCatalog.Load(Paths.Sys4Ini);
|
||||
var archiveOnly = new Sys4AssetStore(catalog, Paths.GameDir);
|
||||
@@ -182,13 +182,20 @@ public class Sys4AssetStoreTests
|
||||
Assert.Equal("MAN999.OGG", voice?.Name);
|
||||
AssertOgg(resources.ReadAudio(voice!));
|
||||
|
||||
var sfx = resources.Resolve("SC0000", 0x28);
|
||||
var sfx = resources.ResolveSoundEffect(0x28);
|
||||
Assert.Equal("E0808.WAV", sfx?.Name);
|
||||
var wav = resources.ReadAudio(sfx!);
|
||||
Assert.Equal("E0808.WAV", wav.Name);
|
||||
Assert.Equal("RIFF", Encoding.ASCII.GetString(wav.Bytes, 0, 4));
|
||||
Assert.Equal("WAVE", Encoding.ASCII.GetString(wav.Bytes, 8, 4));
|
||||
|
||||
Assert.Null(resources.Resolve("TITLE", 0x2aea));
|
||||
Assert.Equal("SE020.WAV", resources.ResolveSoundEffect(0x2aea)?.Name);
|
||||
Assert.Equal("SE013.WAV", resources.ResolveSoundEffect(0x2aeb)?.Name);
|
||||
Assert.Equal("SE015.WAV", resources.ResolveSoundEffect(0x3321)?.Name);
|
||||
Assert.Null(resources.ResolveSoundEffect(0x337e)); // SO001.AGF is not audio.
|
||||
Assert.Null(resources.ResolveSoundEffect(0x02000000)); // unmounted append selector.
|
||||
|
||||
Assert.Throws<InvalidDataException>(() => resources.ReadAudio(catalog.ResolveName("SO001.AGF")!));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
namespace Age.Engine.Sys4;
|
||||
|
||||
/// <summary>
|
||||
/// Compatibility facade over the runtime SYS4 catalog. SYS4INI's file list is sectioned (one per scene: SCxxxx.BIN + its
|
||||
/// cross-archive asset manifest); file_number is the index within a section. So a bytecode
|
||||
/// resId resolves as files[section_base(scene) + resId] -- unified for graphics and audio.
|
||||
/// Compatibility facade over the runtime SYS4 catalog. Scene-local graphics/voice/movie ids resolve
|
||||
/// through the executing script's manifest; BGM uses direct names; SFX/cursors use universal packed ids.
|
||||
/// See docs/asset-resolution-re.md.
|
||||
/// </summary>
|
||||
public sealed class ResourceMap
|
||||
@@ -75,6 +74,13 @@ public sealed class ResourceMap
|
||||
return entry is { IsPlaceholder: false } && IsAudio(entry) ? entry : null;
|
||||
}
|
||||
|
||||
/// <summary>Resolve opcode 0xb4's universal packed SYS4INI/AAI id to an audio entry.</summary>
|
||||
public AssetEntry? ResolveSoundEffect(long packedRawId)
|
||||
{
|
||||
var entry = _catalog.ResolvePacked(packedRawId);
|
||||
return entry is { IsPlaceholder: false } && IsAudio(entry) ? entry : null;
|
||||
}
|
||||
|
||||
/// <summary>Read a catalog-resolved OGG/WAV payload through the loose-first ALF/AAI byte store.</summary>
|
||||
public AudioPayload ReadAudio(AssetEntry entry)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user