Files
firestorm/BTFrstrm/autoconfig-file-spec.html
T

565 lines
29 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Automatic Config File Specification ? Firestorm Console Load File</title>
<style>
body { font-family: Calibri, Arial, sans-serif; font-size: 11pt; margin: 60px 72px; color: #1a1a1a; max-width: 900px; }
h1 { font-size: 20pt; color: #1F3864; border-bottom: 3px solid #1F3864; padding-bottom: 8px; margin-top: 0; }
h2 { font-size: 14pt; color: #1F3864; border-bottom: 1px solid #BDD7EE; padding-bottom: 4px; margin-top: 28px; }
h3 { font-size: 12pt; color: #2E4D7B; margin-top: 20px; margin-bottom: 4px; }
h4 { font-size: 11pt; color: #2E4D7B; margin-top: 16px; margin-bottom: 2px; font-style: italic; }
.meta { color: #555; font-size: 10pt; margin-bottom: 28px; }
code, .code { font-family: Consolas, "Courier New", monospace; font-size: 10pt; background: #F4F7FB; padding: 1px 4px; border-radius: 2px; color: #1a1a1a; }
pre { font-family: Consolas, "Courier New", monospace; font-size: 10pt; background: #F4F7FB; border: 1px solid #BDD7EE; border-left: 4px solid #2E4D7B; padding: 12px 16px; border-radius: 0 4px 4px 0; overflow-x: auto; line-height: 1.5; }
pre .section { color: #7B2D8B; font-weight: bold; }
pre .key { color: #1F6A8F; }
pre .value { color: #2D6A2D; }
pre .comment { color: #888; font-style: italic; }
table { border-collapse: collapse; width: 100%; margin: 10px 0 18px 0; font-size: 10.5pt; }
th { background: #1F3864; color: white; padding: 7px 12px; text-align: left; font-weight: bold; font-size: 10pt; }
tr:nth-child(even) td { background: #EFF4FB; }
td { padding: 5px 12px; border-bottom: 1px solid #D0D9E8; vertical-align: top; }
td code { background: #E8EFF9; }
.warn { background: #FFF3CD; border: 1px solid #FFEAA0; border-left: 4px solid #F0B429; padding: 10px 14px; border-radius: 0 4px 4px 0; margin: 14px 0; font-size: 10.5pt; }
.warn strong { color: #7A4F00; }
.note { background: #E7F3FD; border: 1px solid #B8D9F5; border-left: 4px solid #1F3864; padding: 10px 14px; border-radius: 0 4px 4px 0; margin: 14px 0; font-size: 10.5pt; }
.optional { color: #666; font-size: 9.5pt; font-style: italic; }
ul, ol { margin: 6px 0 10px 0; padding-left: 24px; }
li { margin-bottom: 4px; }
hr { border: none; border-top: 1px solid #D0D9E8; margin: 30px 0; }
.key-block { background: #F0F4FA; border: 1px solid #C5D5E8; padding: 8px 12px; border-radius: 4px; margin: 8px 0 12px 0; }
.key-block .kname { font-family: Consolas, monospace; font-size: 10.5pt; font-weight: bold; color: #1F6A8F; }
.key-block .ktype { color: #888; font-size: 9.5pt; margin-left: 8px; }
.default-tag { background: #D4EDDA; color: #155724; font-size: 9pt; padding: 1px 6px; border-radius: 3px; margin-left: 6px; font-weight: bold; }
.ignored-tag { background: #F8D7DA; color: #721C24; font-size: 9pt; padding: 1px 6px; border-radius: 3px; margin-left: 6px; }
.mech-table td:first-child { font-family: Consolas, monospace; font-size: 10pt; white-space: nowrap; }
@media print { body { margin: 40px; } h2 { page-break-before: auto; } }
</style>
</head>
<body>
<h1>Automatic Config File Format Specification</h1>
<div class="meta">
Feature: Console Lobby &ldquo;Load File&rdquo; button &nbsp;|&nbsp;
Commit: <code>c3346561</code> (branch <code>5.1.0b-in-progress</code>) &nbsp;|&nbsp;
Date: 2026-07-24
</div>
<h2>1. Overview</h2>
<p>
The system operates with <strong>two separate files</strong>:
</p>
<ol>
<li>
<strong><code>options.ini</code></strong> &mdash; machine-level one-time configuration, read once at game startup.
Contains the path to the config file. Never changed by the game.
</li>
<li>
<strong>The config file</strong> (path specified in <code>options.ini</code>) &mdash;
written by the external application before each match.
Read by the game when the operator clicks <strong>Load File</strong> in the console lobby.
<strong>Not consumed</strong> &mdash; the game leaves it on disk. Overwrite it to set the next match.
</li>
</ol>
<p>
When <strong>Load File</strong> is clicked, the game:
</p>
<ol>
<li>Checks that <code>automaticmode=1</code> and the file path is configured.</li>
<li>Checks that the config file exists on disk (<code>GetFileAttributes</code>). If not, does nothing.</li>
<li>Reads the file, applies game options, clears all current lobby slots, then fills slots from the file.</li>
<li>Leaves the file on disk unchanged.</li>
</ol>
<hr>
<h2>2. <code>options.ini</code> Setup (One-Time, Per Machine)</h2>
<p>Add the following section to the game&rsquo;s <code>options.ini</code> in the game working directory.</p>
<pre><span class="section">[automaticmode]</span>
<span class="key">automaticmode</span>=<span class="value">1</span>
<span class="key">automaticfile</span>=<span class="value">c:\mw4files\nextmatch.ini</span></pre>
<table>
<tr><th>Key</th><th>Type</th><th>Description</th></tr>
<tr><td><code>automaticmode</code></td><td>integer</td><td><code>1</code> = enabled. <code>0</code> = disabled; Load File button does nothing.</td></tr>
<tr><td><code>automaticfile</code></td><td>string</td><td>Full absolute Windows path to the config file. Max 259 characters. Can be any local drive letter.</td></tr>
</table>
<div class="note">
<strong>Read at startup only.</strong> Changing <code>options.ini</code> requires a game restart.
If the <code>[automaticmode]</code> section is absent, or <code>automaticmode=0</code>, or
<code>automaticfile</code> is empty, Load File always does nothing regardless of what config file exists.
</div>
<hr>
<h2>3. Config File Format Rules</h2>
<p>The config file uses <strong>standard Windows INI format</strong>, parsed by <code>NotationFile::Standard</code>.</p>
<ul>
<li><strong>Encoding:</strong> ANSI / ASCII only. No Unicode, no UTF-8 BOM.</li>
<li><strong>Line endings:</strong> CRLF or LF &mdash; both accepted.</li>
<li><strong>Section headers:</strong> <code>[sectionname]</code> &mdash; <strong>case-sensitive, must be all lowercase exactly as shown.</strong></li>
<li><strong>Key names:</strong> Case-sensitive. Must match exactly as documented below.</li>
<li><strong>String values:</strong> Everything after <code>=</code> to end of line. Do <strong>not</strong> wrap in quotes. Example: <code>MissionName=ScarabStronghold - Attrition</code></li>
<li><strong>Integer values:</strong> Raw decimal integer only. No quotes, no sign unless negative. Example: <code>GameType=2</code></li>
<li><strong>Do not use comments</strong> (<code>//</code> or <code>;</code>). Parser behavior is not guaranteed. Keep the file clean.</li>
<li><strong>Missing key:</strong> If a key is absent from its section, the corresponding lobby value stays at its current setting. No error is raised.</li>
<li><strong>Missing section:</strong> If <code>[mission]</code> is absent, no game options are changed. If <code>[slot0]</code> is absent, no slots are changed.</li>
</ul>
<hr>
<h2>4. Section: <code>[mission]</code></h2>
<p>Sets all game lobby parameters. This section is <span class="optional">optional</span> &mdash; omit it to leave game options unchanged and only configure slots.</p>
<pre><span class="section">[mission]</span>
<span class="key">MissionName</span>=<span class="value">ScarabStronghold - Attrition</span>
<span class="key">GameType</span>=<span class="value">2</span>
<span class="key">Visibility</span>=<span class="value">0</span>
<span class="key">Weather</span>=<span class="value">0</span>
<span class="key">TimeOfDay</span>=<span class="value">0</span>
<span class="key">TimeLimit</span>=<span class="value">7</span>
<span class="key">Radar</span>=<span class="value">0</span>
<span class="key">HeatOn</span>=<span class="value">0</span>
<span class="key">FriendlyFire</span>=<span class="value">0</span>
<span class="key">SplashDamage</span>=<span class="value">0</span>
<span class="key">UnlimitedAmmo</span>=<span class="value">1</span>
<span class="key">WeaponJam</span>=<span class="value">0</span>
<span class="key">AdvanceMode</span>=<span class="value">0</span>
<span class="key">ArmorMode</span>=<span class="value">0</span></pre>
<h3>4.1 &nbsp;<code>MissionName</code> &mdash; string, max 255 characters</h3>
<p>
The scenario name, <strong>exactly as it appears in the mission list dropdown in the console lobby.</strong>
Match is exact string equality, case-sensitive. Trailing/leading spaces are stripped by the parser.
</p>
<div class="warn">
<strong>If the name is not found</strong> in the list for the selected <code>GameType</code>,
mission selection silently fails &mdash; the dropdown stays at its previous value.
No error is logged. All other parameters (Visibility, Weather, etc.) are still applied.
The available mission names depend on what scenario files are installed on the machine;
there is no static guaranteed list.
</div>
<h3>4.2 &nbsp;<code>GameType</code> &mdash; integer (dropdown index, 0-based)</h3>
<div class="warn">
<strong>This is the position in the game type dropdown, NOT the internal game type ID number.</strong>
The dropdown is built dynamically at lobby startup &mdash; only game types that have at least
one installed scenario are shown. If a game type has no installed maps it is skipped and all
subsequent indices shift down by one.
</div>
<p>For a <strong>standard full installation</strong> with all game types present, the order is fixed:</p>
<table>
<tr><th>Index</th><th>Display Name</th><th>Mode</th></tr>
<tr><td><code>0</code></td><td>Destruction</td><td>FFA</td></tr>
<tr><td><code>1</code></td><td>Team Destruction</td><td>Team</td></tr>
<tr><td><code>2</code></td><td>Attrition</td><td>FFA &mdash; <strong>default</strong> <span class="default-tag">DEFAULT</span></td></tr>
<tr><td><code>3</code></td><td>Team Attrition</td><td>Team</td></tr>
<tr><td><code>4</code></td><td>Capture the Flag</td><td>FFA</td></tr>
<tr><td><code>5</code></td><td>King of the Hill</td><td>FFA</td></tr>
<tr><td><code>6</code></td><td>Team King of the Hill</td><td>Team</td></tr>
<tr><td><code>7</code></td><td>Steal the Bacon</td><td>FFA</td></tr>
<tr><td><code>8</code></td><td>Master Trial</td><td>Special</td></tr>
<tr><td><code>9</code></td><td>Siege Assault</td><td>Special</td></tr>
<tr><td><code>10+</code></td><td>Custom map variants</td><td>Varies (if custom content installed)</td></tr>
</table>
<p><strong>Team vs. FFA is important:</strong> it determines whether the <code>Team</code> or <code>Skin</code> field is applied to each slot. See Section 5 for details.</p>
<h3>4.3 &nbsp;<code>Visibility</code> &mdash; integer</h3>
<table>
<tr><th>Value</th><th>Display Name</th><th>Description</th></tr>
<tr><td><code>0</code></td><td>Default</td><td>Same as Clear <span class="default-tag">DEFAULT</span></td></tr>
<tr><td><code>1</code></td><td>Clear</td><td>Full visibility range</td></tr>
<tr><td><code>2</code></td><td>Light Fog</td><td>Reduced visibility range</td></tr>
<tr><td><code>3</code></td><td>Heavy Fog</td><td>Heavily reduced visibility range</td></tr>
<tr><td><code>4</code></td><td>Pea Soup Fog</td><td>Near-zero visibility range</td></tr>
</table>
<h3>4.4 &nbsp;<code>Weather</code> &mdash; integer</h3>
<table>
<tr><th>Value</th><th>Display</th></tr>
<tr><td><code>0</code></td><td>Off <span class="default-tag">DEFAULT</span></td></tr>
<tr><td><code>1</code></td><td>On (rain or snow depending on map)</td></tr>
</table>
<h3>4.5 &nbsp;<code>TimeOfDay</code> &mdash; integer</h3>
<table>
<tr><th>Value</th><th>Display</th></tr>
<tr><td><code>0</code></td><td>Day <span class="default-tag">DEFAULT</span></td></tr>
<tr><td><code>1</code></td><td>Night</td></tr>
</table>
<h3>4.6 &nbsp;<code>TimeLimit</code> &mdash; integer (<strong>actual minutes</strong>, not a list index)</h3>
<p>
Specify the desired match length in <strong>real minutes</strong>.
Valid values that appear in the lobby dropdown:
</p>
<p>
<code>1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 20, 25, 30</code>
</p>
<p>
Other integers are accepted and applied to the network parameter but will not match a dropdown item
(the visual display may show the nearest value).
</p>
<p>
Special value <code>-1</code>: use the server&rsquo;s current default time (7 minutes unless changed separately).
</p>
<p>Default if key absent: server current default (equivalent to <code>-1</code>).</p>
<h3>4.7 &nbsp;<code>Radar</code> &mdash; integer</h3>
<table>
<tr><th>Value</th><th>Display</th><th>Description</th></tr>
<tr><td><code>0</code></td><td>Novice</td><td>All mechs visible, no range limit <span class="default-tag">DEFAULT</span></td></tr>
<tr><td><code>1</code></td><td>Normal</td><td>Standard radar with range cutoff</td></tr>
<tr><td><code>2</code></td><td>Team Only</td><td>Only your own team visible on radar</td></tr>
<tr><td><code>3</code></td><td>No Radar</td><td>Radar completely disabled for all players</td></tr>
</table>
<h3>4.8 &nbsp;<code>HeatOn</code> &mdash; integer</h3>
<table>
<tr><th>Value</th><th>Description</th></tr>
<tr><td><code>0</code></td><td>Off &mdash; heat never builds, weapons never overheat <span class="default-tag">DEFAULT</span></td></tr>
<tr><td><code>1</code></td><td>On &mdash; standard heat management enabled</td></tr>
</table>
<h3>4.9 &nbsp;<code>FriendlyFire</code> &mdash; integer</h3>
<table>
<tr><th>Value</th><th>Description</th></tr>
<tr><td><code>0</code></td><td>Off &mdash; friendly fire disabled <span class="default-tag">DEFAULT</span></td></tr>
<tr><td><code>1</code></td><td>On &mdash; 100% damage to teammates</td></tr>
</table>
<h3>4.10 &nbsp;<code>SplashDamage</code> &mdash; integer</h3>
<table>
<tr><th>Value</th><th>Description</th></tr>
<tr><td><code>0</code></td><td>Off <span class="default-tag">DEFAULT</span></td></tr>
<tr><td><code>1</code></td><td>On &mdash; area/splash damage from missiles and explosions</td></tr>
</table>
<h3>4.11 &nbsp;<code>UnlimitedAmmo</code> &mdash; integer</h3>
<table>
<tr><th>Value</th><th>Description</th></tr>
<tr><td><code>0</code></td><td>Off &mdash; ammo is finite</td></tr>
<tr><td><code>1</code></td><td>On &mdash; unlimited ammo <span class="default-tag">DEFAULT (console/arcade)</span></td></tr>
</table>
<h3>4.12 &nbsp;<code>WeaponJam</code> &mdash; integer</h3>
<table>
<tr><th>Value</th><th>Description</th></tr>
<tr><td><code>0</code></td><td>Off <span class="default-tag">DEFAULT</span></td></tr>
<tr><td><code>1</code></td><td>On &mdash; weapons can randomly jam</td></tr>
</table>
<h3>4.13 &nbsp;<code>AdvanceMode</code> &mdash; integer</h3>
<table>
<tr><th>Value</th><th>Description</th></tr>
<tr><td><code>0</code></td><td>Off <span class="default-tag">DEFAULT</span></td></tr>
<tr><td><code>1</code></td><td>On</td></tr>
</table>
<h3>4.14 &nbsp;<code>ArmorMode</code> &mdash; integer</h3>
<table>
<tr><th>Value</th><th>Description</th></tr>
<tr><td><code>0</code></td><td>Off <span class="default-tag">DEFAULT</span></td></tr>
<tr><td><code>1</code></td><td>On</td></tr>
</table>
<hr>
<h2>5. Sections: <code>[slot0]</code> through <code>[slot15]</code></h2>
<p>One section per roster slot, numbered starting from <strong>zero</strong>.</p>
<div class="warn">
<strong>Slots must be contiguous starting from <code>[slot0]</code>.</strong>
The parser stops at the first missing slot number. If <code>[slot2]</code> is absent,
<code>[slot3]</code> through <code>[slot15]</code> are never read, even if present in the file.
Do not skip numbers.
</div>
<p>Maximum: <strong>16 slots</strong> (indices 0&ndash;15). All slots are cleared before applying file data, so slots not defined in the file will be empty in the lobby after Load File is clicked.</p>
<pre><span class="section">[slot0]</span>
<span class="key">Type</span>=<span class="value">1</span>
<span class="key">PilotName</span>=<span class="value">Alpha One</span>
<span class="key">Mech</span>=<span class="value">Atlas</span>
<span class="key">Team</span>=<span class="value">0</span>
<span class="key">Skin</span>=<span class="value">0</span>
<span class="key">Decal</span>=<span class="value">3</span></pre>
<h3>5.1 &nbsp;<code>Type</code> &mdash; integer, required</h3>
<p>Determines what occupies this slot. All other fields are ignored when <code>Type=0</code>.</p>
<table>
<tr><th>Value</th><th>Description</th></tr>
<tr><td><code>0</code></td><td>Empty &mdash; slot skipped, left empty in lobby</td></tr>
<tr><td><code>1</code></td><td>Player slot &mdash; a human pilot can connect to this seat</td></tr>
<tr><td><code>2</code></td><td>Bot, difficulty level 1 (easiest)</td></tr>
<tr><td><code>3</code></td><td>Bot, difficulty level 2</td></tr>
<tr><td><code>4</code></td><td>Bot, difficulty level 3</td></tr>
<tr><td><code>5</code></td><td>Bot, difficulty level 4</td></tr>
<tr><td><code>6</code></td><td>Bot, difficulty level 5</td></tr>
<tr><td><code>7</code></td><td>Bot, difficulty level 6</td></tr>
<tr><td><code>8</code></td><td>Bot, difficulty level 7</td></tr>
<tr><td><code>9</code></td><td>Bot, difficulty level 8 (hardest)</td></tr>
</table>
<p>If <code>Type</code> key is absent, it defaults to <code>0</code> (empty) due to zero-initialization.</p>
<h3>5.2 &nbsp;<code>PilotName</code> &mdash; string, max 63 characters</h3>
<p>Only meaningful when <code>Type=1</code> (player slot). Sets the callsign shown in the lobby pilot editbox. The connecting player can override this after they connect.</p>
<p>For bots (<code>Type=2&ndash;9</code>), this field is read from the file but ignored by the script.</p>
<p>Set to empty value or omit key to leave the name blank: <code>PilotName=</code></p>
<p>Strings longer than 63 characters are silently truncated.</p>
<h3>5.3 &nbsp;<code>Mech</code> &mdash; string (chassis name, exact and case-sensitive)</h3>
<p>Must match <strong>exactly</strong> one of the chassis names from <code>MechTable.tbl</code>. The lookup is case-sensitive exact string comparison. If the name is not found, the mech dropdown for that slot stays at its previous value. No error is raised.</p>
<div class="warn">
<strong>These are the table key strings, not display labels.</strong>
Pay close attention to capitalization, spacing, and special characters (hyphens, Roman numerals).
</div>
<table class="mech-table">
<tr><th>Exact <code>Mech=</code> value</th><th>Notes</th></tr>
<tr><td>Annihilator</td><td></td></tr>
<tr><td>Archer</td><td></td></tr>
<tr><td>Arctic Wolf</td><td>space between words</td></tr>
<tr><td>Ares</td><td></td></tr>
<tr><td>Argus</td><td></td></tr>
<tr><td>AssassinII</td><td>no spaces; capital I</td></tr>
<tr><td>Atlas</td><td></td></tr>
<tr><td>Avatar</td><td></td></tr>
<tr><td>Awesome</td><td></td></tr>
<tr><td>Battlemaster</td><td></td></tr>
<tr><td>BattlemasterIIC</td><td>no spaces</td></tr>
<tr><td>Behemoth</td><td></td></tr>
<tr><td>BehemothII</td><td>no space; capital I</td></tr>
<tr><td>Black Hawk</td><td>space between words</td></tr>
<tr><td>Black Knight</td><td>space between words</td></tr>
<tr><td>Black Lanner</td><td>space between words</td></tr>
<tr><td>Brigand</td><td></td></tr>
<tr><td>Bushwacker</td><td></td></tr>
<tr><td>Catapult</td><td></td></tr>
<tr><td>Cauldron-Born</td><td>hyphen between words</td></tr>
<tr><td>Chimera</td><td></td></tr>
<tr><td>Commando</td><td></td></tr>
<tr><td>Cougar</td><td></td></tr>
<tr><td>Cyclops</td><td></td></tr>
<tr><td>Daishi</td><td></td></tr>
<tr><td>Deimos</td><td></td></tr>
<tr><td>Dragon</td><td></td></tr>
<tr><td>Fafnir</td><td></td></tr>
<tr><td>Flea</td><td></td></tr>
<tr><td>Gladiator</td><td></td></tr>
<tr><td>Grizzly</td><td></td></tr>
<tr><td>Hauptmann</td><td></td></tr>
<tr><td>Hellhound</td><td></td></tr>
<tr><td>Hellspawn</td><td></td></tr>
<tr><td>Highlander</td><td></td></tr>
<tr><td>HollanderII</td><td>no space; capital I</td></tr>
<tr><td>Hunchback</td><td></td></tr>
<tr><td>Kodiak</td><td></td></tr>
<tr><td>Loki</td><td></td></tr>
<tr><td>Longbow</td><td></td></tr>
<tr><td>Mad Cat</td><td>space between words</td></tr>
<tr><td>Mad Cat MKII</td><td>space + "MKII" all caps, no period</td></tr>
<tr><td>Masakari</td><td></td></tr>
<tr><td>Mauler</td><td></td></tr>
<tr><td>Nova Cat</td><td>space between words</td></tr>
<tr><td>Osiris</td><td></td></tr>
<tr><td>Owens</td><td></td></tr>
<tr><td>Puma</td><td></td></tr>
<tr><td>Raven</td><td></td></tr>
<tr><td>Rifleman</td><td></td></tr>
<tr><td>Ryoken</td><td></td></tr>
<tr><td>Shadow Cat</td><td>space between words</td></tr>
<tr><td>Solitaire</td><td></td></tr>
<tr><td>Sunder</td><td></td></tr>
<tr><td>Templar</td><td></td></tr>
<tr><td>Thanatos</td><td></td></tr>
<tr><td>Thor</td><td></td></tr>
<tr><td>Uller</td><td></td></tr>
<tr><td>Urbanmech</td><td></td></tr>
<tr><td>Uziel</td><td></td></tr>
<tr><td>Victor</td><td></td></tr>
<tr><td>Vulture</td><td></td></tr>
<tr><td>Warhammer</td><td></td></tr>
<tr><td>Wolfhound</td><td></td></tr>
<tr><td>Zeus</td><td></td></tr>
</table>
<h3>5.4 &nbsp;<code>Team</code> &mdash; integer</h3>
<p>
<strong>Only applied in team game modes</strong> (game types marked &ldquo;Team&rdquo; in Section 4.2 table).
<strong class="ignored-tag">IGNORED in FFA modes.</strong>
</p>
<table>
<tr><th>Value</th><th>Team</th><th>Default Color</th></tr>
<tr><td><code>0</code></td><td>Team 1</td><td>Blue</td></tr>
<tr><td><code>1</code></td><td>Team 2</td><td>Red</td></tr>
<tr><td><code>2</code></td><td>Team 3</td><td>Yellow</td></tr>
<tr><td><code>3</code></td><td>Team 4</td><td>Green</td></tr>
<tr><td><code>4</code></td><td>Team 5</td><td>Purple</td></tr>
<tr><td><code>5</code></td><td>Team 6</td><td>Light Blue</td></tr>
<tr><td><code>6</code></td><td>Team 7</td><td>Orange</td></tr>
<tr><td><code>7</code></td><td>Team 8</td><td>Charcoal</td></tr>
</table>
<h3>5.5 &nbsp;<code>Skin</code> &mdash; integer (FFA camo, dropdown index 0-based)</h3>
<p>
<strong>Only applied in FFA game modes.</strong>
<strong class="ignored-tag">IGNORED in team modes.</strong>
</p>
<table>
<tr><th>Value</th><th>Camo Color/Pattern</th></tr>
<tr><td><code>0</code></td><td>Blue</td></tr>
<tr><td><code>1</code></td><td>Red</td></tr>
<tr><td><code>2</code></td><td>Yellow</td></tr>
<tr><td><code>3</code></td><td>Green</td></tr>
<tr><td><code>4</code></td><td>Purple</td></tr>
<tr><td><code>5</code></td><td>Light Blue</td></tr>
<tr><td><code>6</code></td><td>Orange</td></tr>
<tr><td><code>7</code></td><td>Charcoal</td></tr>
<tr><td><code>8</code>&ndash;<code>15</code></td><td>Additional camo patterns</td></tr>
</table>
<h3>5.6 &nbsp;<code>Decal</code> &mdash; integer (faction emblem, 0&ndash;63)</h3>
<p>
Applied in <strong>both team and FFA modes.</strong>
Valid range: <code>0</code>&ndash;<code>63</code>. All values in range are accepted. Common values:
</p>
<table>
<tr><th>Value</th><th>Faction</th></tr>
<tr><td><code>0</code></td><td>None</td></tr>
<tr><td><code>2</code></td><td>Davion</td></tr>
<tr><td><code>3</code></td><td>Steiner</td></tr>
<tr><td><code>4</code></td><td>Kurita</td></tr>
<tr><td><code>5</code></td><td>Liao</td></tr>
<tr><td><code>6</code></td><td>Marik</td></tr>
<tr><td><code>9</code></td><td>ComStar</td></tr>
<tr><td><code>10</code></td><td>Star League</td></tr>
<tr><td><code>11</code></td><td>Wolf Clan</td></tr>
<tr><td><code>12</code></td><td>Jade Falcon</td></tr>
<tr><td><code>16</code></td><td>Ghost Bear</td></tr>
<tr><td><code>20</code></td><td>Hell Horses</td></tr>
<tr><td><code>21</code></td><td>Coyote</td></tr>
<tr><td><code>22</code></td><td>Blood Spirit</td></tr>
<tr><td><code>24</code></td><td>Ice Hellion</td></tr>
<tr><td><code>27</code></td><td>Goliath Scorpion</td></tr>
<tr><td><code>46</code></td><td>BKG</td></tr>
<tr><td><code>47</code></td><td>FSA</td></tr>
<tr><td><code>48</code></td><td>331st</td></tr>
<tr><td><code>49</code></td><td>DDC</td></tr>
<tr><td><code>50</code></td><td>VGL</td></tr>
</table>
<hr>
<h2>6. Complete Example File</h2>
<pre><span class="section">[mission]</span>
<span class="key">MissionName</span>=<span class="value">ScarabStronghold - Attrition</span>
<span class="key">GameType</span>=<span class="value">2</span>
<span class="key">Visibility</span>=<span class="value">0</span>
<span class="key">Weather</span>=<span class="value">0</span>
<span class="key">TimeOfDay</span>=<span class="value">0</span>
<span class="key">TimeLimit</span>=<span class="value">7</span>
<span class="key">Radar</span>=<span class="value">0</span>
<span class="key">HeatOn</span>=<span class="value">0</span>
<span class="key">FriendlyFire</span>=<span class="value">0</span>
<span class="key">SplashDamage</span>=<span class="value">0</span>
<span class="key">UnlimitedAmmo</span>=<span class="value">1</span>
<span class="key">WeaponJam</span>=<span class="value">0</span>
<span class="key">AdvanceMode</span>=<span class="value">0</span>
<span class="key">ArmorMode</span>=<span class="value">0</span>
<span class="section">[slot0]</span>
<span class="key">Type</span>=<span class="value">1</span>
<span class="key">PilotName</span>=<span class="value">Blackjack</span>
<span class="key">Mech</span>=<span class="value">Atlas</span>
<span class="key">Team</span>=<span class="value">0</span>
<span class="key">Skin</span>=<span class="value">0</span>
<span class="key">Decal</span>=<span class="value">3</span>
<span class="section">[slot1]</span>
<span class="key">Type</span>=<span class="value">1</span>
<span class="key">PilotName</span>=<span class="value">Viper</span>
<span class="key">Mech</span>=<span class="value">Mad Cat</span>
<span class="key">Team</span>=<span class="value">0</span>
<span class="key">Skin</span>=<span class="value">1</span>
<span class="key">Decal</span>=<span class="value">4</span>
<span class="section">[slot2]</span>
<span class="key">Type</span>=<span class="value">2</span>
<span class="key">PilotName</span>=
<span class="key">Mech</span>=<span class="value">Thor</span>
<span class="key">Team</span>=<span class="value">1</span>
<span class="key">Skin</span>=<span class="value">1</span>
<span class="key">Decal</span>=<span class="value">4</span>
<span class="section">[slot3]</span>
<span class="key">Type</span>=<span class="value">2</span>
<span class="key">PilotName</span>=
<span class="key">Mech</span>=<span class="value">Warhammer</span>
<span class="key">Team</span>=<span class="value">1</span>
<span class="key">Skin</span>=<span class="value">1</span>
<span class="key">Decal</span>=<span class="value">4</span></pre>
<hr>
<h2>7. Known Constraints and Caveats</h2>
<ol>
<li>
<strong>Slots must be numbered contiguously from <code>[slot0]</code>.</strong>
The parser uses a loop that breaks on the first missing section. Defining <code>[slot0]</code>
and <code>[slot2]</code> without <code>[slot1]</code> means only slot 0 is processed.
</li>
<li>
<strong>All current slots are cleared before file slots are applied.</strong>
Any slot not defined in the file (or defined with <code>Type=0</code>) will be empty in the lobby.
</li>
<li>
<strong>Team vs. FFA assignment uses the lobby&rsquo;s state at the moment Load File is clicked,
not the <code>GameType</code> written in the file.</strong>
The game type change from <code>[mission]</code> is processed asynchronously (next frame).
If you are changing game mode, click Load File a second time to correctly apply team/skin assignments,
or pre-configure the lobby to the correct game type before writing the config file.
</li>
<li>
<strong><code>MissionName</code> and <code>Mech</code> matches are case-sensitive.</strong>
<code>atlas</code> will not match <code>Atlas</code>.
</li>
<li>
<strong>The file is never deleted by the game.</strong>
Write it before the match, overwrite it before the next match. No locking is performed.
</li>
<li>
<strong><code>options.ini</code> is read only at game startup.</strong>
Changing the <code>automaticfile</code> path or enabling/disabling the feature requires a restart.
The config file itself is re-read fresh on every Load File button click.
</li>
<li>
<strong>Buffer limits:</strong> <code>PilotName</code> &le; 63 chars (truncated silently);
<code>MissionName</code> &le; 255 chars;
<code>automaticfile</code> path &le; 259 chars (<code>MAX_PATH&nbsp;&minus;&nbsp;1</code>).
</li>
<li>
<strong>Mech names are sourced from <code>MechTable.tbl</code>.</strong>
If the game installation has custom mechs added or some mechs removed, the valid name list
changes accordingly. The table above reflects the standard Firestorm build.
</li>
</ol>
<hr>
<p style="font-size:9pt; color:#888; text-align:center; margin-top:30px;">
Generated from source: <code>MW4Shell.cpp</code> &mdash; <code>CTCL_LoadAutoFile</code>,
<code>CTCL_GetAutoSlotName/Mech/Int</code> &nbsp;|&nbsp;
<code>ConLobby.script</code> &mdash; <code>o_load_file</code> handler &nbsp;|&nbsp;
Commit c3346561 &nbsp;|&nbsp; 2026-07-24
</p>
</body>
</html>