565 lines
29 KiB
HTML
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 “Load File” button |
|
|
Commit: <code>c3346561</code> (branch <code>5.1.0b-in-progress</code>) |
|
|
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> — 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>) —
|
|
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> — 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’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 — both accepted.</li>
|
|
<li><strong>Section headers:</strong> <code>[sectionname]</code> — <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> — 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 <code>MissionName</code> — 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 — 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 <code>GameType</code> — 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 — 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 — <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 <code>Visibility</code> — 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 <code>Weather</code> — 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 <code>TimeOfDay</code> — 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 <code>TimeLimit</code> — 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’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 <code>Radar</code> — 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 <code>HeatOn</code> — integer</h3>
|
|
<table>
|
|
<tr><th>Value</th><th>Description</th></tr>
|
|
<tr><td><code>0</code></td><td>Off — heat never builds, weapons never overheat <span class="default-tag">DEFAULT</span></td></tr>
|
|
<tr><td><code>1</code></td><td>On — standard heat management enabled</td></tr>
|
|
</table>
|
|
|
|
<h3>4.9 <code>FriendlyFire</code> — integer</h3>
|
|
<table>
|
|
<tr><th>Value</th><th>Description</th></tr>
|
|
<tr><td><code>0</code></td><td>Off — friendly fire disabled <span class="default-tag">DEFAULT</span></td></tr>
|
|
<tr><td><code>1</code></td><td>On — 100% damage to teammates</td></tr>
|
|
</table>
|
|
|
|
<h3>4.10 <code>SplashDamage</code> — 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 — area/splash damage from missiles and explosions</td></tr>
|
|
</table>
|
|
|
|
<h3>4.11 <code>UnlimitedAmmo</code> — integer</h3>
|
|
<table>
|
|
<tr><th>Value</th><th>Description</th></tr>
|
|
<tr><td><code>0</code></td><td>Off — ammo is finite</td></tr>
|
|
<tr><td><code>1</code></td><td>On — unlimited ammo <span class="default-tag">DEFAULT (console/arcade)</span></td></tr>
|
|
</table>
|
|
|
|
<h3>4.12 <code>WeaponJam</code> — 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 — weapons can randomly jam</td></tr>
|
|
</table>
|
|
|
|
<h3>4.13 <code>AdvanceMode</code> — 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 <code>ArmorMode</code> — 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–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 <code>Type</code> — 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 — slot skipped, left empty in lobby</td></tr>
|
|
<tr><td><code>1</code></td><td>Player slot — 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 <code>PilotName</code> — 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–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 <code>Mech</code> — 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 <code>Team</code> — integer</h3>
|
|
<p>
|
|
<strong>Only applied in team game modes</strong> (game types marked “Team” 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 <code>Skin</code> — 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>–<code>15</code></td><td>Additional camo patterns</td></tr>
|
|
</table>
|
|
|
|
<h3>5.6 <code>Decal</code> — integer (faction emblem, 0–63)</h3>
|
|
<p>
|
|
Applied in <strong>both team and FFA modes.</strong>
|
|
Valid range: <code>0</code>–<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’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> ≤ 63 chars (truncated silently);
|
|
<code>MissionName</code> ≤ 255 chars;
|
|
<code>automaticfile</code> path ≤ 259 chars (<code>MAX_PATH − 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> — <code>CTCL_LoadAutoFile</code>,
|
|
<code>CTCL_GetAutoSlotName/Mech/Int</code> |
|
|
<code>ConLobby.script</code> — <code>o_load_file</code> handler |
|
|
Commit c3346561 | 2026-07-24
|
|
</p>
|
|
|
|
</body>
|
|
</html>
|