ConfigEncoder

ConfigEncoder reads three plain-text XML inputs and writes encrypted binary blobs that the client and launcher load at startup. It is the only supported way to update connection details, client-side tunables, and launcher branding after a release has shipped - the client will not load an edited .xml.

Output files are AES-256-GCM encrypted. The per-file key is derived from the embedded master key (the same master key shared by every AXIOM-EMU binary) and the canonical lowercase filename of the blob, so the client can decrypt any bundle produced by a matching build.

Tool Location#

Tools/ConfigEncoder/
    ConfigEncoder.exe
    AxiomConfigEditor.exe   (optional GUI)
    EncoderConfig.xml
    ServerConfig.xml
    ClientConfig.xml

AxiomConfigEditor (optional GUI)#

AxiomConfigEditor.exe is a form editor for the same files. It opens ClientConfig.xml and ServerConfig.xml from its own folder (or use Open config folder...), and also MapFog.xml from the client's Data\Local\ (found through Output Path in EncoderConfig.xml). Save writes the XML files only. Save + Run ConfigEncoder saves and then runs ConfigEncoder.exe for you. The editor itself never encrypts anything - you can still edit the XML by hand and run ConfigEncoder yourself.

Inputs#

All three files live next to ConfigEncoder.exe and must be present for a run to succeed.

FilePurpose
EncoderConfig.xmlTool settings: output folder, client install root, license key
ServerConfig.xmlConnectServer IP/port, client Serial and Version
ClientConfig.xmlClient-side tunables - graphics, interpolation, animation timing, auto-updater, launcher branding, economy caps

Outputs#

Written to the Output Path configured in EncoderConfig.xml (typically the client's Data\Local\ folder):

FileConsumerContents
ServerInfo.axiomClientConnectServer IP/port, client serial, client version
ClientConfig.axiomClientAll tunables from ClientConfig.xml
UpdateConfig.iniLauncherPlain text. Patch server and the server-status address. Always written
LauncherConfig.iniLauncherBranding and launcher UI options (only if a <Launcher> block exists)

The C++ servers (GameServer, DataServer, ConnectServer, JoinServer) do not read these .axiom blobs - they read their own .dat / .ini files.

UpdateConfig.ini#

ConfigEncoder writes this file on every run. The Launcher reads it (the Launcher cannot read .axiom files).

[Update]
Enabled=1          ; from <AutoUpdater Enabled>
ServerIP=...       ; from <AutoUpdater ServerIP>
ServerPort=80      ; from <AutoUpdater Port>
UseHTTPS=0         ; from <AutoUpdater UseHTTPS>

[Game]
GameServerIP=...   ; from ServerConfig.xml <Connection IP>
GameServerPort=... ; from ServerConfig.xml <Connection Port>

[Game] is only used for the server online/offline status shown in the Launcher.

EncoderConfig.xml#

<EncoderConfig>
    <Output Path="C:\AxiomClient\Data\Local" />
    <DLLIntegrity Path="C:\AxiomClient" />
    <License Key="..." />
</EncoderConfig>
AttributeMeaning
Output PathFolder where ServerInfo.axiom / ClientConfig.axiom (and the optional .inis) are written. Point this at the client's Data\Local\ directory.
DLLIntegrity PathRoot of the client install. ConfigEncoder computes SHA-256 hashes of the DLLs under this path and embeds them in ClientConfig.axiom for the client's integrity check at startup.
License KeyYour portal license key. Recorded here for operator reference (the first 8 chars are printed on each run); the .axiom encryption itself uses the embedded master key, not this field. Keep it in sync with the four servers so operators don't get confused about which deployment a bundle belongs to.

ServerConfig.xml#

<ServerConfig>
    <Connection IP="1.2.3.4" Port="44405" />
    <Client Serial="TbYehR2hFUPBKgZj" Version="1.04.05" />
</ServerConfig>
AttributeMeaning
Connection IPPublic IP of your ConnectServer - the address the client connects to first.
Connection PortConnectServer TCP port. Matches ConnectServerPortTCP in ConnectServer.ini.
Client SerialArbitrary token. Must match ServerSerial in every GameServer's GameServerInfo - Common.dat.
Client VersionArbitrary version string. Must match ServerVersion in every GameServer's Common.dat.

ClientConfig.xml#

Template for the client's runtime configuration. Each top-level block is documented inline in the shipped file. Sections actually read by ConfigEncoder:

BlockPurpose
<Graphics>MaxFPS cap
<Animation>FPS-adaptive animation timing (GlobalDivisor, PlayerMultiplier, MountMultiplier, WingMultiplier, EffectBlurDivisor)
<Interpolation>Visual smoothing between 25Hz logic ticks (master + per-category toggles for Objects, Characters, Effects, Camera)
<RenderingOptimization>Chrome LOD distances and frustum culling cap
<Frustum2D>Terrain frustum expansion (widescreen black-corner fix)
<GroundItems>Ground item rendering caps and name distance
<LootBeams>Light beams over valuable drops (excellent, ancient, socket, jewels)
<PostProcessing>FXAA, bloom, motion blur, fog, SSAO toggles + tuning, wing shadow opacity
<Economy>Client-side zen caps (trade, warehouse, owned, personal shop)
<AutoUpdater>Patch server host/port/HTTPS toggle
<TooltipColors>Item tooltip option colors
<Launcher>Launcher branding (title, splash, URLs, color palette)
<BottomUI>Bottom hotbar scale
<DiscordRPC>Discord Rich Presence card shown on players' Discord profiles
<Login>Create Account button on the login box
<Plugins>Authorized client plugin DLLs, hash-locked at encode time
<ScreenShots>Path template for screenshot captures (folders created on demand)
<EventTimer>SortBySoonest — 1 (default) orders the 'H' event window dynamically (running events first, then countdowns soonest-first, then always-open, then disabled); 0 keeps the classic fixed index order
<DLLIntegrity>Optional <DLL Name="..." /> rows added on top of the built-in DLL list whose hashes get baked into ClientConfig.axiom
<UI>Skin - look of the new (AxiomUI) windows: classic (default, the vanilla look) or axiom. Old windows ignore it. An unknown or broken skin falls back to classic
<Camera>MaxZoomFOV - how far the mouse wheel can zoom out, in degrees (default 70, range 25-150; 35 = normal view). Higher shows more map but stretches the screen edges and costs FPS. Players' last zoom is remembered between sessions

Every value in this file is consumed by the client only. Edit it, re-run ConfigEncoder, and the new ClientConfig.axiom replaces the previous one in Output Path.

The <ScreenShots> Path is a printf-style template that must contain exactly five integer placeholders, in order: month, day, hour, minute, per-session counter. Default:

ScreenShots\Screen(%02d_%02d-%02d_%02d)-%04d.jpg

Relative paths resolve against the client folder; absolute paths work too. Missing folders are created at capture time. A template with the wrong number or type of placeholders is rejected by the client (ConfigEncoder prints a warning) and the default is used.

The <Launcher> block also writes a plaintext LauncherConfig.ini next to the .axiom blobs. The <AutoUpdater> block goes into the plaintext UpdateConfig.ini, which is written on every run (see the UpdateConfig.ini section above). Both are read by the Launcher (not the game client).

Discord Rich Presence#

Shows a live status card on the Discord profile of every player running the client.

AttributeTypeShippedEffect
Enabled0 or 11Master toggle. 0 disables the card entirely
ApplicationIDstring(AXIOM's)The Discord application this card belongs to. Required when Enabled="1"
ServerNamestringAxiomEMU DemoServer name shown on the card
ServerWebsitestring(AXIOM's)First card button. Must begin with https://
DiscordInviteURLstring(AXIOM's)Second card button. Must begin with https://
ImageKeystringlogoName of an art asset uploaded to the Discord application
ShowMap0 or 11Include the player's current map
ShowLevel0 or 11Include the character level
ShowResets0 or 11Include the reset count
ShowGrandResets0 or 11Include the grand reset count

To set this up for your own server:

  1. Create an application in the Discord developer portal.
  2. Upload your art asset there and use the name you gave it as ImageKey.
  3. Copy the application's ID into ApplicationID.

Login box#

AttributeTypeParser defaultEffect
CreateAccountButton0 or 10Shows a Create Account button under the login box
CreateAccountURLstring(empty)Opened in the player's default browser when that button is clicked

CreateAccountURL must begin with http:// or https://; anything else suppresses the button.

Cash shop#

Web pages for the Recharge and Gift buttons in the X cash shop.

<CashShop RechargeURL="https://yoursite.com/donate" GiftURL="https://yoursite.com/gift" />
AttributeTypeParser defaultEffect
RechargeURLstring(empty)Opened in the player's default browser when Recharge is clicked
GiftURLstring(empty)Opened in the player's default browser when Gift is clicked

Both must begin with http:// or https://. Empty or invalid = the button shows the vanilla "not available" box.

Authorized plugins#

Optional integrity loader for client-side plugin DLLs. Each entry is one row:

<Plugins>
    <Plugin Name="plugins\yours.dll" />
</Plugins>

Name is a path relative to the client folder, at most 63 characters. At most 8 entries are read. ConfigEncoder hashes each file at encode time and bakes the hash into ClientConfig.axiom.

The shipped template ships with both example rows commented out, so the loader is inert until you opt in.

Block attributes#

The shipped XML carries inline comments for these blocks. The parser defaults below are what applies when an attribute is removed - note that several differ from the value the template ships.

AttributeTypeParser defaultShippedEffect
ChromeLOD_CloseDistanceint tiles23Within this distance, characters get full chrome and item effects
ChromeLOD_MediumDistanceint tiles55Between close and this distance, chrome is reduced. Beyond it, ChromeLOD_FarRenderLevel applies
ChromeLOD_FarRenderLevel0-200Chrome detail kept for distant characters. 0 = none (cheapest)
FrustumCulling_MaxDistanceint tiles1517Objects beyond this distance are culled regardless of the view frustum

MapFog.xml (per-map fog, colour grade and bloom)#

<client folder>\Data\Local\MapFog.xml

Per-map look settings live in this plain XML file in the client folder, not in ClientConfig.xml. It is not encoded: edit it, then type $weather reload in game (or restart the client). No ConfigEncoder run is needed. AxiomConfigEditor.exe can edit it too.

<MapFog Enable="1">
    <Default Density="..." Color="R,G,B" ... />
    <Map Index="0" Density="..." Bloom="..." />
</MapFog>
ElementMeaning
<MapFog Enable>0 turns post-process fog off on every map, without re-encoding the client config
<Default>Values used by every map that has no <Map> row
<Map Index="N">Override for map number N. Anything it does not set comes from <Default>

Each <Default> / <Map> row can set fog (Color, AutoColor, Density, HeightFalloff, BaseHeight, MaxOpacity, SkyOpacity, StartDistance, AmbientTint), sun tint (SunColor, SunAzimuth, SunElevation, SunExponent, SunAmount), contact shadows, colour grade (Grade, GradeSharpen, GradeContrast, GradeSaturation, GradeWarmth, GradeVignette), per-map Bloom strength, the day/night cycle (DayLight, NightLight, DayLength, DayOffset) and weather (Weather, WeatherChance, WeatherLength). Every attribute is optional and explained in the comment at the top of the shipped file.

The global switches stay in ClientConfig.xml: EnableFog, Fog_DensityScale, EnableBloom and the rest of <PostProcessing>. If MapFog.xml is missing or broken, the client uses built-in values and writes a MapFog - line to its log.

Usage#

  1. Edit the three XML files in Tools\ConfigEncoder\.
  2. Run ConfigEncoder.exe from its own folder. It takes no command-line arguments.
  3. The tool writes the output blobs directly into Output Path - no manual copy.

Re-run ConfigEncoder any time you change ServerConfig.xml or ClientConfig.xml. The client reads the blobs on startup; editing the XML alone has no effect.

Last updated October 23, 2026