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
| Area | Feature | What it enables |
|---|---|---|
| Audio | Loose .wem replacement | Replace known retail Wwise media without rebuilding the original archives. |
| Audio | Loose .ogg support | Use OGG source audio; Serina converts it in memory when the game starts. |
| Audio | Generated Wwise banks | Define new events in sound\soundbanks.xml and let Serina build and load the bank at runtime. |
| Audio | Runtime sound metadata | Generate data\soundinfo.xml and data\soundtable.xml for the active mod. |
| Audio | 2D/3D controls | Tune spatialization, falloff, volume, and random variants from XML. |
| Scenario | Source-backed loose scenarios | Load renamed loose scenarios by backing the missing scenario .era request with a known retail source archive. |
| Scenario | Loose scenario asset reads | Serve map-specific scenario, terrain, lighting, pathing, and effect files from the active mod. |
| Diagnostics | Modder-facing logs | Check active mod detection, XML discovery, generated banks, replacements, and scenario activity. |
What To Read First
| Goal | Start here |
|---|---|
| Add loose OGG or WEM audio | Audio Tutorial: Add Loose OGG Audio |
| Replace an existing retail sound | Replace Existing Retail Audio |
| Add or test a loose scenario | Scenario Capabilities |
| Set the active loose mod folder | Active Mod Detection |
| Check whether Serina loaded correctly | Audio 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:
HaloWarsDE\xgameFinal.exe
HaloWarsDE\version.dll
HaloWarsDE\serina.iniSerina writes logs under a dedicated folder beside the game executable:
HaloWarsDE\serina\serina.log
HaloWarsDE\serina\serina_diagnostics.logserina.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:
%LOCALAPPDATA%\Halo Wars\ModManifest.txtFor modding and direct testing, a mod can live anywhere on disk; what matters is that this manifest points at the active loose mod folder:
C:\Users\YourName\Documents\Halo Wars Mods\my_audio_modIt may also list archive-style folders:
...\MyMod\root
...\MyMod\root_update
...\MyMod\sound
...\MyMod\sharedscenario
...\MyMod\my_custom_mapSerina 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
.wemor.oggfiles. - Adding new events through
sound\soundbanks.xml. - Building runtime-generated Wwise banks from loose audio.
- Decoding loose
.oggfiles at startup and converting them in memory to Wwise IMA ADPCM WEM payloads. - Loading generated banks directly through Wwise memory loading.
- Generating
data\soundinfo.xmlanddata\soundtable.xmlfor the active mod. - 2D and 3D sound behavior through XML attributes such as
Spatialization,MinDistance,MaxDistance,Falloff, andVolumeDb. - 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.
C:\Users\YourName\Documents\Halo Wars Mods\
my_audio_mod\
data\
sound\Inside sound, create the folders for your audio files:
my_audio_mod\
sound\
Voices\
English(US)\
mod_unit_select.ogg
mod_unit_acknowledge.ogg
mod_unit_attack.oggYou 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:
my_audio_mod\sound\soundbanks.xmlStart with a generated bank:
<?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:
ShortNameis the generated bank name.Pathis the generated bank path Serina should create.- Event names are the names your game data should call.
- File paths are relative to the
soundfolder. Spatialization="2D"is recommended for selection, acknowledgement, UI, radio, and music-style sounds.- Leave file
Idvalues 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:
<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:
<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
.oggor.wemfile. - 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:
%LOCALAPPDATA%\Halo Wars\ModManifest.txtThen put the path to your loose mod folder in it:
C:\Users\YourName\Documents\Halo Wars Mods\my_audio_modHaruspis 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:
HaloWarsDE\serina\serina.logFor a working OGG audio mod, look for:
Serina loaded
Config loaded
Active mod: found
soundbanks.xml: found
Banks generated
Events registered
Source audio converted
Runtime generated bank preload complete
PostEvent hook installedSerina may also generate:
my_audio_mod\sound\generated\
my_audio_mod\data\soundinfo.xml
my_audio_mod\data\soundtable.xmlThose 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:
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.oggPaths inside soundbanks.xml are relative to the sound folder.
When the game starts with the mod active, Serina may create generated runtime output:
my_audio_mod\sound\generated\
my_audio_mod\data\soundinfo.xml
my_audio_mod\data\soundtable.xmlDo 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:
[logging]
diagnostics=true
console=false
[audio]
loose_wem=true
generated_banks=trueUse 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 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:
.oggand.wemare both supported.- New
<File>entries may omitId; Serina derives a stable media ID. <Sound>may reference media byShortName,Path,FileId, orMediaId.- 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>:
| Attribute | Use |
|---|---|
Spatialization | 2D or 3D. |
VolumeDb / GainDb | Overall volume trim. |
MinDistance | Distance before 3D falloff starts. |
MaxDistance / AttenuationMaxDistance | Distance where the sound reaches the end volume. |
Falloff | Linear, Steep, Gentle, or Smooth. |
MidDistance / MidVolumeDb | Optional custom middle point for the curve. |
EndVolumeDb | Volume 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.
<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
IncludedEventsfor 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:
Serina loaded
Config loaded
Active mod: found
soundbanks.xml: found
Banks generated
Events registered
WEM replacements registered
PostEvent hook installedFor OGG source audio, also look for:
Source audio convertedIf 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
.erarequest with a known retail source archive such asblood_gulch.era. - Serve map-specific scenario files and assets from loose mod folders.
- Keep vanilla scenarios on the normal retail archive path.
Recommended Scenario Mode
For public release work, use SerinaSourceArchive:
SerinaSourceArchive="blood_gulch.era"Example ScenarioInfo:
<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:
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.txtArchive-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:
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.flsAlso update the internal references in the .scn:
<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:
pfxFileList.txt
visFileList.txt
tfxFileList.txtThe 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:
[scenario]
loose_scenarios=true
archive_bypass=true
virtual_archives=false
virtual_cache_hooks=false
archive_signature_bypass=trueImportant switches:
loose_scenarios=falsedisables scenario detection.archive_bypass=falsekeeps detection/logging active but stops Serina from handling missing scenario.erarequests.virtual_archives=trueis ignored by public release builds; generated in-memory scenario archives are gated off in code.virtual_cache_hooks=trueis also ignored by public release builds.archive_signature_bypass=falsedisables 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:
Loose scenario detected
mode=source
Scenario ERA redirected
Scenario archive bypass hooks installedUse 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.dllbesidexgameFinal.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.