Skip to content

New Arcadia Tool

Serina

Mod loader and runtime patch layer for expanded Halo Wars DE modding.

What Serina Is

Serina is a Halo Wars DE mod loader and runtime patch layer. It loads beside the game as version.dll, reads the active mod, and extends the retail game where normal loose-file modding is not enough.

Frontend users

For normal players using the Haruspis frontend, Serina is included with Haruspis and loads automatically when Haruspis launches Halo Wars DE with a mod that needs Serina features.

Modder testing

When you are building or testing loose mod files directly, point %LOCALAPPDATA%\Halo Wars\ModManifest.txt at your active mod folder yourself. Serina reads the active mod path from that file.

Serina is not a replacement for Haruspis, Cutter, Forge, or the normal Halo Wars mod folder layout. It is an extra runtime layer for features the retail game does not expose cleanly.

Feature Overview

AreaFeatureWhat it enables
AudioLoose .wem replacementReplace known retail Wwise media without rebuilding the original archives.
AudioLoose .ogg supportUse OGG source audio; Serina converts it in memory when the game starts.
AudioGenerated Wwise banksDefine new events in sound\soundbanks.xml and let Serina build and load the bank at runtime.
AudioRuntime sound metadataGenerate data\soundinfo.xml and data\soundtable.xml for the active mod.
Audio2D/3D controlsTune spatialization, falloff, volume, and random variants from XML.
ScenarioSource-backed loose scenariosLoad renamed loose scenarios by backing the missing scenario .era request with a known retail source archive.
ScenarioLoose scenario asset readsServe map-specific scenario, terrain, lighting, pathing, and effect files from the active mod.
DiagnosticsModder-facing logsCheck active mod detection, XML discovery, generated banks, replacements, and scenario activity.

What To Read First

GoalStart here
Add loose OGG or WEM audioAudio Tutorial: Add Loose OGG Audio
Replace an existing retail soundReplace Existing Retail Audio
Add or test a loose scenarioScenario Capabilities
Set the active loose mod folderActive Mod Detection
Check whether Serina loaded correctlyAudio Test Checklist

Install Serina

For normal frontend users, Serina is handled for you by Haruspis. Haruspis includes Serina and loads it automatically for mods that use Serina audio or scenario features.

Manual installation is only needed for development, direct testing, or setups that are not launching through Haruspis. For manual testing, copy the Serina release files next to the Halo Wars DE executable:

text
HaloWarsDE\xgameFinal.exe
HaloWarsDE\version.dll
HaloWarsDE\serina.ini

Serina writes logs under a dedicated folder beside the game executable:

text
HaloWarsDE\serina\serina.log
HaloWarsDE\serina\serina_diagnostics.log

serina.log is the normal modder-facing log. Use serina_diagnostics.log when you need detailed hook, Wwise, file, or scenario diagnostics. Old Serina crash logs and minidumps in this folder are pruned at startup so they cannot grow without bound.

Active Mod Detection

Serina reads the active loose mod paths from:

text
%LOCALAPPDATA%\Halo Wars\ModManifest.txt

For modding and direct testing, a mod can live anywhere on disk; what matters is that this manifest points at the active loose mod folder:

text
C:\Users\YourName\Documents\Halo Wars Mods\my_audio_mod

It may also list archive-style folders:

text
...\MyMod\root
...\MyMod\root_update
...\MyMod\sound
...\MyMod\sharedscenario
...\MyMod\my_custom_map

Serina treats sibling archive folders as one mod set. A folder named ModData is not required and has no special meaning to Serina.

Audio Capabilities

Serina currently supports:

  • Replacing existing retail Wwise media with loose .wem or .ogg files.
  • Adding new events through sound\soundbanks.xml.
  • Building runtime-generated Wwise banks from loose audio.
  • Decoding loose .ogg files at startup and converting them in memory to Wwise IMA ADPCM WEM payloads.
  • Loading generated banks directly through Wwise memory loading.
  • Generating data\soundinfo.xml and data\soundtable.xml for the active mod.
  • 2D and 3D sound behavior through XML attributes such as Spatialization, MinDistance, MaxDistance, Falloff, and VolumeDb.
  • Random event variants through <Random>.
  • Focused runtime logging in serina.log.

Audio Tutorial: Add Loose OGG Audio

This tutorial is self-contained. You do not need any prebuilt example project to follow it. The goal is to create a loose mod folder, add OGG files, define a generated Wwise bank, point ModManifest.txt at the folder, and launch Halo Wars DE with Serina available.

1. Create A Mod Folder

Create a loose folder for your mod anywhere on disk. Serina does not discover mods by scanning a specific mods folder; it reads the active mod path from %LOCALAPPDATA%\Halo Wars\ModManifest.txt.

text
C:\Users\YourName\Documents\Halo Wars Mods\
  my_audio_mod\
    data\
    sound\

Inside sound, create the folders for your audio files:

text
my_audio_mod\
  sound\
    Voices\
      English(US)\
        mod_unit_select.ogg
        mod_unit_acknowledge.ogg
        mod_unit_attack.ogg

You can use .ogg files directly. Serina converts them to in-memory Wwise IMA ADPCM WEM payloads when the game starts.

2. Create sound\soundbanks.xml

Create this file:

text
my_audio_mod\sound\soundbanks.xml

Start with a generated bank:

xml
<?xml version="1.0" encoding="utf-8"?>
<SoundBanksInfo Platform="Windows" BasePlatform="Windows" SchemaVersion="10" SoundbankVersion="113">
  <SoundBanks>
    <SoundBank Language="English(US)" Spatialization="3D" MinDistance="10" MaxDistance="100" Falloff="Steep" VolumeDb="-10">
      <ShortName>xtnd_my_unit_audio</ShortName>
      <Path>English(US)\xtnd_my_unit_audio.bnk</Path>
      <IncludedEvents>
        <Event Name="play_my_unit_select" DurationType="OneShot" Spatialization="2D">
          <Random>
            <Sound ShortName="mod_unit_select.ogg"/>
            <Sound ShortName="mod_unit_acknowledge.ogg"/>
          </Random>
        </Event>
        <Event Name="play_my_unit_acknowledge" DurationType="OneShot" Spatialization="2D">
          <Sound ShortName="mod_unit_acknowledge.ogg"/>
        </Event>
        <Event Name="play_my_unit_attack" DurationType="OneShot" Spatialization="2D">
          <Sound ShortName="mod_unit_attack.ogg"/>
        </Event>
      </IncludedEvents>
      <IncludedMemoryFiles>
        <File Language="English(US)">
          <ShortName>mod_unit_select.ogg</ShortName>
          <Path>Voices\English(US)\mod_unit_select.ogg</Path>
        </File>
        <File Language="English(US)">
          <ShortName>mod_unit_acknowledge.ogg</ShortName>
          <Path>Voices\English(US)\mod_unit_acknowledge.ogg</Path>
        </File>
        <File Language="English(US)">
          <ShortName>mod_unit_attack.ogg</ShortName>
          <Path>Voices\English(US)\mod_unit_attack.ogg</Path>
        </File>
      </IncludedMemoryFiles>
    </SoundBank>
  </SoundBanks>
</SoundBanksInfo>

Important rules:

  • ShortName is the generated bank name.
  • Path is the generated bank path Serina should create.
  • Event names are the names your game data should call.
  • File paths are relative to the sound folder.
  • Spatialization="2D" is recommended for selection, acknowledgement, UI, radio, and music-style sounds.
  • Leave file Id values out for new audio unless you intentionally need a specific media ID.

3. Connect The Events To Game Data

Serina can generate and load the audio bank, but the game still needs to call your event names.

For a unit, object, ability, projectile, or other game object, update your mod's normal game XML so it references the generated event names, for example:

xml
<Sound Type="Select">play_my_unit_select</Sound>
<Sound Type="Work">play_my_unit_acknowledge</Sound>
<Sound Type="Attack">play_my_unit_attack</Sound>

If the object uses an extended sound bank entry, make sure it points at the bank you generated:

xml
<ExtendedSoundBank>xtnd_my_unit_audio.bnk</ExtendedSoundBank>

The exact object XML depends on what you are modding. The important Serina pieces are:

  • The event exists in sound\soundbanks.xml.
  • The event points at a loose .ogg or .wem file.
  • Your game data calls that event.
  • If needed, your game data references the generated bank.

4. Point ModManifest.txt At The Mod

For modder testing, open or create:

text
%LOCALAPPDATA%\Halo Wars\ModManifest.txt

Then put the path to your loose mod folder in it:

text
C:\Users\YourName\Documents\Halo Wars Mods\my_audio_mod

Haruspis only manages this automatically for normal frontend users playing through Haruspis. When you are building or testing a loose mod directly, update ModManifest.txt yourself before launching the game.

5. Launch And Check The Logs

After the game starts, open:

text
HaloWarsDE\serina\serina.log

For a working OGG audio mod, look for:

text
Serina loaded
Config loaded
Active mod: found
soundbanks.xml: found
Banks generated
Events registered
Source audio converted
Runtime generated bank preload complete
PostEvent hook installed

Serina may also generate:

text
my_audio_mod\sound\generated\
my_audio_mod\data\soundinfo.xml
my_audio_mod\data\soundtable.xml

Those are runtime outputs. Keep editing your source .ogg files, soundbanks.xml, and normal game XML.

Audio Mod Folder

A simple audio mod can look like this:

text
my_audio_mod\
  data\
    objects.xml
  sound\
    soundbanks.xml
    Music\
      pregame_replacement.ogg
    Voices\
      English(US)\
        mod_warthog_select.ogg
        mod_warthog_acknowledge.ogg
        mod_warthog_attack.ogg

Paths inside soundbanks.xml are relative to the sound folder.

When the game starts with the mod active, Serina may create generated runtime output:

text
my_audio_mod\sound\generated\
my_audio_mod\data\soundinfo.xml
my_audio_mod\data\soundtable.xml

Do not hand-edit generated output first. Start with sound\soundbanks.xml and your source audio files.

Enable Audio In serina.ini

The release serina.ini should already enable the tested audio path. The important audio settings are:

ini
[logging]
diagnostics=true
console=false

[audio]
loose_wem=true
generated_banks=true

Use console=true if you want a small live log window while testing. Turn diagnostics=false if the diagnostic log becomes too noisy.

XML Reference: Add New Audio Events

Use a generated bank when you want to add new events. If the bank file listed in XML does not exist yet, Serina builds it at startup.

Example sound\soundbanks.xml:

xml
<?xml version="1.0" encoding="utf-8"?>
<SoundBanksInfo Platform="Windows" BasePlatform="Windows" SchemaVersion="10" SoundbankVersion="113">
  <SoundBanks>
    <SoundBank Language="English(US)" Spatialization="3D" MinDistance="10" MaxDistance="100" Falloff="Steep" VolumeDb="-10">
      <ShortName>xtnd_ui_additive_warthog_test</ShortName>
      <Path>English(US)\xtnd_ui_additive_warthog_test.bnk</Path>
      <IncludedEvents>
        <Event Name="play_unsc_warthog_select" DurationType="OneShot" Spatialization="2D">
          <Random>
            <Sound ShortName="mod_warthog_select.ogg"/>
            <Sound ShortName="mod_warthog_acknowledge.ogg"/>
            <Sound ShortName="mod_warthog_attack.ogg"/>
          </Random>
        </Event>
        <Event Name="play_unsc_warthog_acknowledge" DurationType="OneShot" Spatialization="2D">
          <Sound ShortName="mod_warthog_acknowledge.ogg"/>
        </Event>
      </IncludedEvents>
      <IncludedMemoryFiles>
        <File Language="English(US)">
          <ShortName>mod_warthog_select.ogg</ShortName>
          <Path>Voices\English(US)\mod_warthog_select.ogg</Path>
        </File>
        <File Language="English(US)">
          <ShortName>mod_warthog_acknowledge.ogg</ShortName>
          <Path>Voices\English(US)\mod_warthog_acknowledge.ogg</Path>
        </File>
        <File Language="English(US)">
          <ShortName>mod_warthog_attack.ogg</ShortName>
          <Path>Voices\English(US)\mod_warthog_attack.ogg</Path>
        </File>
      </IncludedMemoryFiles>
    </SoundBank>
  </SoundBanks>
</SoundBanksInfo>

Notes:

  • .ogg and .wem are both supported.
  • New <File> entries may omit Id; Serina derives a stable media ID.
  • <Sound> may reference media by ShortName, Path, FileId, or MediaId.
  • Use <Random> when one event should choose between multiple sounds.
  • For custom units, make sure the unit/object XML references the generated bank or event you want to use.

2D vs 3D Audio

Generated events are 3D by default. Use Spatialization="2D" for UI, music, radio, and voice sounds that should not fade with distance.

Useful attributes on <SoundBank> or <Event>:

AttributeUse
Spatialization2D or 3D.
VolumeDb / GainDbOverall volume trim.
MinDistanceDistance before 3D falloff starts.
MaxDistance / AttenuationMaxDistanceDistance where the sound reaches the end volume.
FalloffLinear, Steep, Gentle, or Smooth.
MidDistance / MidVolumeDbOptional custom middle point for the curve.
EndVolumeDbVolume at max distance. Default is -96.3.

Halo Wars posts some selection and acknowledgement VO on the player/listener object rather than the unit emitter. For those cues, Spatialization="2D" is usually the safer first test.

Replace Existing Retail Audio

For a pure replacement, patch an existing retail bank and point known retail media IDs at your loose audio.

xml
<SoundBank Id="1381504635" Language="English(US)" Spatialization="2D">
  <ShortName>pre_load_music_patch</ShortName>
  <Path>English(US)\pre_load_music.bnk</Path>
  <IncludedMemoryFiles>
    <File Id="500862610" Language="English(US)">
      <ShortName>pregame_replacement.ogg</ShortName>
      <Path>Music\pregame_replacement.ogg</Path>
    </File>
  </IncludedMemoryFiles>
</SoundBank>

Replacement rules:

  • Use the original retail bank ID.
  • Use the original retail bank path.
  • Use the original media file IDs you want to replace.
  • Do not add IncludedEvents for a pure replacement.

When Serina patches a retail bank this way, it rebuilds a generated copy and redirects the game to that copy while preserving the original event/container structure.

Use this path when you already know the retail bank and media IDs you want to replace. For new unit sounds, the generated-bank tutorial above is usually the simpler starting point.

Audio Test Checklist

After launching the game with your mod active, open serina\serina.log and check for:

text
Serina loaded
Config loaded
Active mod: found
soundbanks.xml: found
Banks generated
Events registered
WEM replacements registered
PostEvent hook installed

For OGG source audio, also look for:

text
Source audio converted

If the bank is generated but you hear the vanilla sound, check that the unit/object XML points at the generated bank/event. If the game cannot find your audio files, check that every path in soundbanks.xml is relative to the owning sound folder.

Scenario Capabilities

Public Serina currently supports source-backed loose scenarios. This is for renamed loose scenarios that do not ship a matching physical scenario .era. The generated virtual archive path remains internal and is disabled in public release builds.

Serina can:

  • Detect loose scenarios from the active mod's data\scenariodescriptions.xml.
  • Handle scenarios that specify SerinaSourceArchive.
  • Answer the game's derived scenario .era request with a known retail source archive such as blood_gulch.era.
  • Serve map-specific scenario files and assets from loose mod folders.
  • Keep vanilla scenarios on the normal retail archive path.

For public release work, use SerinaSourceArchive:

xml
SerinaSourceArchive="blood_gulch.era"

Example ScenarioInfo:

xml
<ScenarioInfo
  ChunkID="1000"
  MapName="img://art\ui\flash\shared\textures\pregame\mapimages\blood_gulch.ddx"
  MaxPlayers="2"
  NameStringID="98001"
  InfoStringID="98002"
  Type="Final"
  File="skirmish\design\my_map\my_map.scn"
  LoadingScreen="BloodGulch"
  SerinaSourceArchive="blood_gulch.era" />

If SerinaSourceArchive is omitted, Serina tries to infer the source archive from the MapName filename, for example blood_gulch.ddx to blood_gulch.era.

Scenario Folder Layout

A loose scenario mod should include the scenario description and the scenario files the map references:

text
my_scenario_mod\
  data\
    scenariodescriptions.xml
    stringtable-en.xml
  scenario\
    skirmish\
      design\
        my_map\
          my_map.scn
          my_map.sc2
          my_map.sc3
          my_map.xsd
          my_map.xth
          my_map.xtd
          my_map.xtt
          my_map.lrp
          my_map.gls
          my_map.fls
  pfxFileList.txt
  visFileList.txt
  tfxFileList.txt

Archive-style layouts are also supported, as long as the active mod manifest points at the loose archive folders and Serina can resolve the shared parent.

Keep Scenario Names Consistent

For renamed clones, keep the file stems consistent:

text
my_map.scn
my_map.sc2
my_map.sc3
my_map.xsd
my_map.xth
my_map.xtd
my_map.xtt
my_map.lrp
my_map.gls
my_map.fls

Also update the internal references in the .scn:

xml
<Terrain>My_Map</Terrain>
<Lightset>My_Map</Lightset>
<Pathing>My_Map</Pathing>

If the files are renamed but the internal terrain, lightset, or pathing names still point to the old map, the scenario may load with missing terrain, lighting, pathing, or effects.

Preload Lists

Loose scenarios should include the same scenario-local preload lists that retail scenario archives carry:

text
pfxFileList.txt
visFileList.txt
tfxFileList.txt

The game reads those files during scenario load to preload particle effects, visuals, and terrain effects. If effects show up as missing textures, white strips, or blank objects, check these lists first.

Enable Scenario Support In serina.ini

The release serina.ini enables the tested source-backed scenario path and keeps virtual archives off:

ini
[scenario]
loose_scenarios=true
archive_bypass=true
virtual_archives=false
virtual_cache_hooks=false
archive_signature_bypass=true

Important switches:

  • loose_scenarios=false disables scenario detection.
  • archive_bypass=false keeps detection/logging active but stops Serina from handling missing scenario .era requests.
  • virtual_archives=true is ignored by public release builds; generated in-memory scenario archives are gated off in code.
  • virtual_cache_hooks=true is also ignored by public release builds.
  • archive_signature_bypass=false disables the runtime patch that lets the game accept Serina's generated in-memory archive header.

Scenario Test Checklist

For a successful source-backed loose scenario load, serina\serina.log should contain lines like:

text
Loose scenario detected
mode=source
Scenario ERA redirected
Scenario archive bypass hooks installed

Use serina\serina_diagnostics.log to confirm the renamed .scn, .sc2, .sc3, .xsd, .xth, .xtd, .xtt, .lrp, .gls, and .fls files are being read from the active mod.

To build your own test, start with a renamed loose scenario folder, add the entry to data\scenariodescriptions.xml, set SerinaSourceArchive to the retail archive you are borrowing from, and make sure the loose files and internal .scn terrain/lightset/pathing names match.

Known Limits And Safety Notes

  • Serina is currently for Halo Wars DE.
  • Serina must be installed as version.dll beside xgameFinal.exe.
  • Audio and scenario behavior depends on the active mod being discoverable through ModManifest.txt.
  • Source-backed scenario mode does not remove the need to provide map-specific files; it removes the need to ship a matching physical scenario .era.
  • .hwmod, generated virtual scenario archives, skirmish map menu/selection fixes, and profile save rewrites are internal-only code paths. Public release builds do not edit save files.
  • Generated output is runtime support. Keep your source files and XML as the thing you edit.
  • Check logs before assuming a mod is broken; Serina is designed to report the active mod, config state, XML discovery, generated banks, replacements, and scenario activity.

Built for the Halo Wars modding community.