mirror of
https://github.com/iTracerFacer/Moose_CTLD_Pure.git
synced 2025-12-03 04:11:57 +00:00
Initial commit of Moose CTLD Pure and associated documentation and Voice Attack profiles.
This commit is contained in:
commit
3c5619bb86
752
MEDEVAC_Salvage_System_Guide.html
Normal file
752
MEDEVAC_Salvage_System_Guide.html
Normal file
@ -0,0 +1,752 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>MOOSE CTLD: MEDEVAC & Salvage System Guide</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
line-height: 1.6;
|
||||
color: #e0e0e0;
|
||||
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
||||
margin: 0;
|
||||
padding: 20px;
|
||||
}
|
||||
.container {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
background: rgba(26, 26, 46, 0.95);
|
||||
padding: 30px;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 0 30px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
h1 {
|
||||
color: #ff6b6b;
|
||||
text-align: center;
|
||||
font-size: 2.5em;
|
||||
margin-bottom: 10px;
|
||||
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
|
||||
border-bottom: 3px solid #ff6b6b;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
h2 {
|
||||
color: #4ecdc4;
|
||||
font-size: 1.8em;
|
||||
margin-top: 40px;
|
||||
margin-bottom: 20px;
|
||||
border-left: 5px solid #4ecdc4;
|
||||
padding-left: 15px;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
h3 {
|
||||
color: #ffe66d;
|
||||
font-size: 1.3em;
|
||||
margin-top: 25px;
|
||||
margin-bottom: 15px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
.subtitle {
|
||||
text-align: center;
|
||||
color: #a8dadc;
|
||||
font-size: 1.2em;
|
||||
margin-bottom: 30px;
|
||||
font-style: italic;
|
||||
}
|
||||
.overview-box {
|
||||
background: rgba(78, 205, 196, 0.1);
|
||||
border-left: 4px solid #4ecdc4;
|
||||
padding: 20px;
|
||||
margin: 20px 0;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.menu-tree {
|
||||
background: #0f0f1e;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
font-family: 'Courier New', monospace;
|
||||
font-size: 0.9em;
|
||||
line-height: 1.8;
|
||||
overflow-x: auto;
|
||||
border: 2px solid #4ecdc4;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.menu-tree .highlight {
|
||||
color: #ff6b6b;
|
||||
font-weight: bold;
|
||||
}
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin: 20px 0;
|
||||
background: rgba(15, 15, 30, 0.8);
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
th {
|
||||
background: linear-gradient(135deg, #4ecdc4 0%, #3ab4aa 100%);
|
||||
color: #0f0f1e;
|
||||
padding: 15px;
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
td {
|
||||
padding: 12px 15px;
|
||||
border-bottom: 1px solid rgba(78, 205, 196, 0.2);
|
||||
}
|
||||
tr:hover {
|
||||
background: rgba(78, 205, 196, 0.1);
|
||||
}
|
||||
.step-list {
|
||||
background: rgba(255, 107, 107, 0.1);
|
||||
border-left: 4px solid #ff6b6b;
|
||||
padding: 15px 15px 15px 40px;
|
||||
margin: 15px 0;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.step-list li {
|
||||
margin: 10px 0;
|
||||
padding-left: 10px;
|
||||
}
|
||||
.pro-tip {
|
||||
background: rgba(255, 230, 109, 0.15);
|
||||
border: 2px solid #ffe66d;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
border-radius: 8px;
|
||||
position: relative;
|
||||
}
|
||||
.pro-tip::before {
|
||||
content: "💡 PRO TIP";
|
||||
color: #ffe66d;
|
||||
font-weight: bold;
|
||||
display: block;
|
||||
margin-bottom: 10px;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
.warning-box {
|
||||
background: rgba(255, 107, 107, 0.15);
|
||||
border: 2px solid #ff6b6b;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
border-radius: 8px;
|
||||
}
|
||||
.warning-box::before {
|
||||
content: "⚠️ IMPORTANT";
|
||||
color: #ff6b6b;
|
||||
font-weight: bold;
|
||||
display: block;
|
||||
margin-bottom: 10px;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
.badge {
|
||||
display: inline-block;
|
||||
padding: 5px 12px;
|
||||
background: #4ecdc4;
|
||||
color: #0f0f1e;
|
||||
border-radius: 20px;
|
||||
font-size: 0.85em;
|
||||
font-weight: bold;
|
||||
margin-left: 10px;
|
||||
}
|
||||
.badge-salvage1 {
|
||||
background: #ff6b6b;
|
||||
}
|
||||
.badge-salvage2 {
|
||||
background: #ffe66d;
|
||||
color: #0f0f1e;
|
||||
}
|
||||
code {
|
||||
background: rgba(78, 205, 196, 0.2);
|
||||
padding: 2px 8px;
|
||||
border-radius: 4px;
|
||||
font-family: 'Courier New', monospace;
|
||||
color: #4ecdc4;
|
||||
}
|
||||
.scenario-box {
|
||||
background: rgba(15, 15, 30, 0.8);
|
||||
padding: 15px;
|
||||
margin: 15px 0;
|
||||
border-radius: 8px;
|
||||
border-left: 4px solid #ffe66d;
|
||||
}
|
||||
.scenario-box h4 {
|
||||
color: #ffe66d;
|
||||
margin-top: 0;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
.quick-ref {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||||
gap: 20px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.quick-ref-card {
|
||||
background: rgba(15, 15, 30, 0.8);
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
border-top: 4px solid #4ecdc4;
|
||||
}
|
||||
.quick-ref-card h4 {
|
||||
color: #4ecdc4;
|
||||
margin-top: 0;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
.comparison {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 20px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.comparison > div {
|
||||
background: rgba(15, 15, 30, 0.8);
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
.comparison .medevac {
|
||||
border-top: 4px solid #ff6b6b;
|
||||
}
|
||||
.comparison .slingload {
|
||||
border-top: 4px solid #ffe66d;
|
||||
}
|
||||
ul, ol {
|
||||
margin: 10px 0;
|
||||
}
|
||||
li {
|
||||
margin: 8px 0;
|
||||
}
|
||||
.footer {
|
||||
text-align: center;
|
||||
margin-top: 50px;
|
||||
padding-top: 20px;
|
||||
border-top: 2px solid rgba(78, 205, 196, 0.3);
|
||||
color: #a8dadc;
|
||||
font-style: italic;
|
||||
}
|
||||
@media print {
|
||||
body {
|
||||
background: white;
|
||||
color: black;
|
||||
}
|
||||
.container {
|
||||
background: white;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>🚁 MOOSE CTLD: COMPLETE MEDEVAC & SALVAGE SYSTEM GUIDE 📦</h1>
|
||||
<p class="subtitle">Dynamic Battlefield Economy & Rescue Operations</p>
|
||||
|
||||
<div class="overview-box">
|
||||
<h3>OVERVIEW</h3>
|
||||
<p>The CTLD system features a comprehensive salvage economy with <strong>TWO distinct methods</strong> for earning salvage points: <strong>MEDEVAC crew rescue missions</strong> and <strong>Sling-Load salvage crate recovery</strong>. Both systems feed into a shared coalition salvage pool that can be used to build out-of-stock equipment.</p>
|
||||
</div>
|
||||
|
||||
<h2>📋 Complete Menu Structure</h2>
|
||||
<div class="menu-tree">
|
||||
F10 > CTLD
|
||||
│
|
||||
├─── Operations
|
||||
│ ├─── Troop Transport
|
||||
│ │ ├─── Load Troops
|
||||
│ │ ├─── Load Troops (Type)
|
||||
│ │ │ ├─── [Assault Squad]
|
||||
│ │ │ ├─── [MANPADS Team]
|
||||
│ │ │ ├─── [AT Team]
|
||||
│ │ │ └─── [Mortar Team]
|
||||
│ │ ├─── Unload Troops
|
||||
│ │ └─── Unload Troops (Attack Mode)
|
||||
│ │
|
||||
│ ├─── Build
|
||||
│ │ ├─── Build Here
|
||||
│ │ ├─── Build (Advanced)
|
||||
│ │ │ ├─── [Category] > [Item]
|
||||
│ │ │ └─── Build Here (Attack Mode)
|
||||
│ │ └─── Build (Attack Mode)
|
||||
│ │
|
||||
│ └─── <span class="highlight">MEDEVAC ⭐</span>
|
||||
│ ├─── List Active Missions
|
||||
│ ├─── Vectors to Nearest Crew
|
||||
│ ├─── Coalition Salvage Points
|
||||
│ └─── Admin/Settings
|
||||
│ └─── Clear All MEDEVAC Missions
|
||||
│
|
||||
├─── Logistics
|
||||
│ ├─── Request Crate
|
||||
│ │ └─── [Category] > [Item]
|
||||
│ │
|
||||
│ ├─── Recipe Info
|
||||
│ │ └─── [Category] > [Item Details]
|
||||
│ │
|
||||
│ ├─── Crate Management
|
||||
│ │ ├─── List Nearby Crates
|
||||
│ │ ├─── Drop All Loaded Crates
|
||||
│ │ ├─── Drop Single Crate
|
||||
│ │ └─── Re-mark Crate (Smoke)
|
||||
│ │
|
||||
│ └─── Show Inventory at Nearest Zone
|
||||
│
|
||||
├─── Field Tools
|
||||
│ ├─── Create Drop Zone (AO)
|
||||
│ │
|
||||
│ ├─── <span class="highlight">Salvage Collection Zones ⭐</span>
|
||||
│ │ ├─── Create Salvage Zone Here
|
||||
│ │ └─── Show Active Salvage Zones
|
||||
│ │
|
||||
│ └─── Smoke My Location
|
||||
│ ├─── Green / Red / White / Orange / Blue
|
||||
│
|
||||
├─── Navigation
|
||||
│ ├─── Request Vectors to Nearest Crate
|
||||
│ ├─── <span class="highlight">Vectors to Nearest Salvage Crate ⭐</span>
|
||||
│ ├─── Vectors to Nearest Pickup Zone
|
||||
│ └─── Hover Coach (Enable/Disable)
|
||||
│
|
||||
└─── Admin/Help
|
||||
├─── Player Guides
|
||||
│ ├─── Quick Start Guide
|
||||
│ ├─── Hover Pickup Tutorial
|
||||
│ ├─── Build System Guide
|
||||
│ └─── JTAC Operations
|
||||
│
|
||||
└─── Show CTLD Status
|
||||
</div>
|
||||
|
||||
<h2>🚑 SALVAGE METHOD #1: MEDEVAC RESCUE <span class="badge badge-salvage1">CREW RECOVERY</span></h2>
|
||||
|
||||
<p><strong>CONCEPT:</strong> Rescue stranded vehicle crews and deliver them to MASH zones</p>
|
||||
|
||||
<h3>How It Works</h3>
|
||||
<ol class="step-list">
|
||||
<li>When friendly vehicles are destroyed, there's a <strong>% chance the crew survives</strong><br>
|
||||
<em>(Default: 50% survival chance, configurable per coalition)</em></li>
|
||||
|
||||
<li>After a <strong>5-minute delay</strong> (battle clearance), surviving crew spawns near the wreck with a MEDEVAC mission announcement</li>
|
||||
|
||||
<li>Crew will:
|
||||
<ul>
|
||||
<li>Pop smoke when rescue helicopter approaches (8km detection)</li>
|
||||
<li>Send colorful radio messages ("Follow the smoke!")</li>
|
||||
<li>Wait up to <strong>1 hour</strong> before being declared KIA</li>
|
||||
<li>May include MANPADS soldier for self-defense (10% chance)</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Load crew via normal troop pickup (land near crew, auto-loads)</li>
|
||||
|
||||
<li>Fly to any MASH (Mobile Army Surgical Hospital) zone</li>
|
||||
|
||||
<li>Land in MASH zone and wait <strong>15 seconds</strong> for automatic crew offload</li>
|
||||
|
||||
<li>Salvage points awarded based on vehicle value!</li>
|
||||
</ol>
|
||||
|
||||
<h3>Salvage Value Scale</h3>
|
||||
<p>Value is determined by the destroyed vehicle type (from catalog):</p>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Vehicle Type</th>
|
||||
<th>Salvage Points</th>
|
||||
<th>Examples</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Light Vehicles</td>
|
||||
<td>1-5 points</td>
|
||||
<td>Humvees, trucks, light armor</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Medium Vehicles</td>
|
||||
<td>5-15 points</td>
|
||||
<td>APCs, IFVs, light tanks</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Heavy Vehicles</td>
|
||||
<td>15-30 points</td>
|
||||
<td>MBTs, heavy armor</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Special Assets</td>
|
||||
<td>30-50 points</td>
|
||||
<td>SAMs, artillery, C2 vehicles</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="pro-tip">
|
||||
<strong>Example:</strong> Rescue a T-90 crew = ~25 salvage points
|
||||
</div>
|
||||
|
||||
<h3>MEDEVAC F10 Menu Commands</h3>
|
||||
<ul>
|
||||
<li><code>F10 > Operations > MEDEVAC > List Active Missions</code> - Shows all pending rescues with locations</li>
|
||||
<li><code>F10 > Operations > MEDEVAC > Vectors to Nearest Crew</code> - Bearing/distance to closest MEDEVAC</li>
|
||||
<li><code>F10 > Operations > MEDEVAC > Coalition Salvage Points</code> - Check your coalition's total salvage balance</li>
|
||||
</ul>
|
||||
|
||||
<h2>📦 SALVAGE METHOD #2: SLING-LOAD RECOVERY <span class="badge badge-salvage2">EQUIPMENT SALVAGE</span></h2>
|
||||
|
||||
<p><strong>CONCEPT:</strong> Recover enemy equipment wreckage via DCS sling-load mechanics</p>
|
||||
|
||||
<h3>How It Works</h3>
|
||||
<ol class="step-list">
|
||||
<li>When <strong>ENEMY</strong> ground units die, there's a <strong>15% chance</strong> (configurable) to spawn a physical cargo crate near the wreck for <strong>YOUR coalition</strong> to collect</li>
|
||||
|
||||
<li>Crate naming:
|
||||
<ul>
|
||||
<li><code>SALVAGE-B-XXXXXX</code> (Blue coalition can collect, spawns from RED deaths)</li>
|
||||
<li><code>SALVAGE-R-XXXXXX</code> (Red coalition can collect, spawns from BLUE deaths)</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Orange smoke marks crate location for 2 minutes after spawn</li>
|
||||
|
||||
<li>Crate has a random weight class (determines helicopter requirement & reward)</li>
|
||||
|
||||
<li>Use standard <strong>DCS F6 RADIO MENU</strong> sling-load to hook the crate</li>
|
||||
|
||||
<li>Fly to a Salvage Collection Zone (create via F10 > Field Tools menu)</li>
|
||||
|
||||
<li>Land/drop crate inside the zone boundary</li>
|
||||
|
||||
<li>Automatic detection awards salvage points based on weight + condition!</li>
|
||||
|
||||
<li>Crate expires after <strong>3 HOURS</strong> if not collected (warnings at 30min & 5min)</li>
|
||||
</ol>
|
||||
|
||||
<div class="warning-box">
|
||||
<strong>NOT hover-pickup!</strong> This is pure DCS sling-load mechanics using F6 RADIO MENU!
|
||||
</div>
|
||||
|
||||
<h3>Weight Classes & Reward Matrix</h3>
|
||||
<p>Crate weight determines both helicopter requirements and base reward value:</p>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Weight Class</th>
|
||||
<th>Weight Range</th>
|
||||
<th>Helicopter</th>
|
||||
<th>Base Reward</th>
|
||||
<th>Spawn Chance</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Light</strong></td>
|
||||
<td>1500-2500 kg</td>
|
||||
<td>UH-1H Huey, UH-60</td>
|
||||
<td>2 pts/500kg</td>
|
||||
<td>50%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Medium</strong></td>
|
||||
<td>2501-5000 kg</td>
|
||||
<td>Mi-8 Hip, Ka-50</td>
|
||||
<td>3 pts/500kg</td>
|
||||
<td>30%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Heavy</strong></td>
|
||||
<td>5001-8000 kg</td>
|
||||
<td>Large Helos</td>
|
||||
<td>5 pts/500kg</td>
|
||||
<td>15%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Super Heavy</strong></td>
|
||||
<td>8001-12000 kg</td>
|
||||
<td>CH-47 Chinook ONLY</td>
|
||||
<td>8 pts/500kg</td>
|
||||
<td>5%</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>Reward Calculation Formula</h3>
|
||||
<div class="pro-tip">
|
||||
<strong>Final Reward = (Weight ÷ 500) × Base Multiplier × Condition Bonus</strong>
|
||||
<br><br>
|
||||
<strong>Example Light Crate (2000kg):</strong>
|
||||
<ul style="margin-top: 10px;">
|
||||
<li>Base: (2000 ÷ 500) × 2 = <strong>8 points</strong></li>
|
||||
<li>If Undamaged: 8 × 1.5 = <strong>12 points</strong></li>
|
||||
<li>If Damaged: 8 × 1.0 = <strong>8 points</strong></li>
|
||||
<li>If Heavy Damage: 8 × 0.5 = <strong>4 points</strong></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3>⚠️ Condition-Based Multipliers - FLY CAREFULLY!</h3>
|
||||
<p>Crate health affects your reward! Damage reduces salvage value:</p>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Condition</th>
|
||||
<th>Health Range</th>
|
||||
<th>Multiplier</th>
|
||||
<th>Example (8pt base)</th>
|
||||
</tr>
|
||||
<tr style="background: rgba(78, 205, 196, 0.15);">
|
||||
<td><strong>UNDAMAGED ✓</strong></td>
|
||||
<td>≥ 90% health</td>
|
||||
<td><strong>1.5x</strong></td>
|
||||
<td><strong>12 points (+50% BONUS!)</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Damaged</td>
|
||||
<td>50-89% health</td>
|
||||
<td>1.0x</td>
|
||||
<td>8 points (normal)</td>
|
||||
</tr>
|
||||
<tr style="background: rgba(255, 107, 107, 0.1);">
|
||||
<td><strong>Heavy Damage ⚠</strong></td>
|
||||
<td>< 50% health</td>
|
||||
<td><strong>0.5x</strong></td>
|
||||
<td><strong>4 points (-50% penalty)</strong></td>
|
||||
</tr>
|
||||
<tr style="background: rgba(255, 107, 107, 0.2);">
|
||||
<td><strong>DESTROYED ✗</strong></td>
|
||||
<td>0% health</td>
|
||||
<td><strong>0x</strong></td>
|
||||
<td><strong>0 points (crate lost)</strong></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="pro-tip">
|
||||
Smooth flying = 50% bonus! Crash landing = 50% penalty!
|
||||
</div>
|
||||
|
||||
<h3>Example Salvage Scenarios</h3>
|
||||
|
||||
<div class="scenario-box">
|
||||
<h4>Scenario A: Light Crate, Perfect Delivery</h4>
|
||||
<ul>
|
||||
<li>Crate: 2000kg Light class</li>
|
||||
<li>Flown carefully, no damage</li>
|
||||
<li><strong>Reward: (2000÷500) × 2 × 1.5 = 12 salvage points</strong></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="scenario-box">
|
||||
<h4>Scenario B: Medium Crate, Rough Landing</h4>
|
||||
<ul>
|
||||
<li>Crate: 4000kg Medium class</li>
|
||||
<li>Damaged during transport (60% health)</li>
|
||||
<li><strong>Reward: (4000÷500) × 3 × 1.0 = 24 salvage points</strong></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="scenario-box">
|
||||
<h4>Scenario C: Super Heavy Crate, Crashed</h4>
|
||||
<ul>
|
||||
<li>Crate: 10,000kg Super Heavy (Chinook required!)</li>
|
||||
<li>Heavy damage (40% health remaining)</li>
|
||||
<li><strong>Reward: (10000÷500) × 8 × 0.5 = 80 salvage points</strong></li>
|
||||
<li><em>(Would be 160 if undamaged!)</em></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="scenario-box">
|
||||
<h4>Scenario D: Heavy Crate, Destroyed</h4>
|
||||
<ul>
|
||||
<li>Crate: 7000kg Heavy class</li>
|
||||
<li>Crate destroyed in crash</li>
|
||||
<li><strong>Reward: 0 points (crate removed from mission)</strong></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3>Sling-Load Salvage F10 Menu Commands</h3>
|
||||
<ul>
|
||||
<li><code>F10 > Field Tools > Salvage Collection Zones > Create Salvage Zone Here</code> - Spawns a 300m collection zone at your position</li>
|
||||
<li><code>F10 > Field Tools > Salvage Collection Zones > Show Active Salvage Zones</code> - Lists all active salvage drop-off points</li>
|
||||
<li><code>F10 > Navigation > Vectors to Nearest Salvage Crate</code> - Bearing/distance/weight/value info</li>
|
||||
</ul>
|
||||
|
||||
<h3>Spawn Restrictions</h3>
|
||||
<p>Salvage crates will <strong>NOT</strong> spawn:</p>
|
||||
<ul>
|
||||
<li>Within 1000m of active pickup zones (prevents clutter)</li>
|
||||
<li>Within 1km of airbases (avoids spawn on runways)</li>
|
||||
<li>10-25 meters from wreck location (random placement)</li>
|
||||
</ul>
|
||||
|
||||
<h3>Lifecycle & Warnings</h3>
|
||||
<ul>
|
||||
<li><strong>Spawn:</strong> Orange smoke + coalition announcement (grid, weight, estimated value)</li>
|
||||
<li><strong>30 Minutes Remaining:</strong> First warning message</li>
|
||||
<li><strong>5 Minutes Remaining:</strong> Urgent warning message</li>
|
||||
<li><strong>Expiration:</strong> Crate removed + expiration message</li>
|
||||
<li><strong>Total Lifetime:</strong> 3 HOURS (10,800 seconds, configurable)</li>
|
||||
</ul>
|
||||
|
||||
<h2>💰 Using Salvage Points</h2>
|
||||
|
||||
<h3>What Are Salvage Points?</h3>
|
||||
<p>Salvage points are a <strong>coalition-wide resource pool</strong> that allows you to build equipment that is normally out-of-stock at your current location.</p>
|
||||
|
||||
<h3>When Salvage Is Used</h3>
|
||||
<p>Salvage auto-applies when:</p>
|
||||
<ol>
|
||||
<li>You request a crate that is <strong>OUT OF STOCK</strong> at nearest supply zone</li>
|
||||
<li>Coalition has enough salvage points to cover the cost</li>
|
||||
<li>Cost = item's required crate count (e.g., M1 Abrams = 3 crates = 3 salvage)</li>
|
||||
</ol>
|
||||
|
||||
<h3>Salvage Balance</h3>
|
||||
<p>Check your coalition's salvage point balance:</p>
|
||||
<p><code>F10 > Operations > MEDEVAC > Coalition Salvage Points</code></p>
|
||||
<p><em>Or build/request menu will show salvage balance when out-of-stock</em></p>
|
||||
|
||||
<h2>🎯 Strategic Considerations</h2>
|
||||
|
||||
<div class="comparison">
|
||||
<div class="medevac">
|
||||
<h4 style="color: #ff6b6b;">MEDEVAC Advantages</h4>
|
||||
<ul>
|
||||
<li>✓ More consistent rewards (vehicle value-based)</li>
|
||||
<li>✓ Easier execution (normal troop pickup + land at MASH)</li>
|
||||
<li>✓ Lower skill requirement</li>
|
||||
<li>✓ Supports role-play/immersion</li>
|
||||
<li>✓ No condition penalties</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="slingload">
|
||||
<h4 style="color: #ffe66d;">Sling-Load Salvage Advantages</h4>
|
||||
<ul>
|
||||
<li>✓ Higher potential rewards (up to 160pts for perfect Chinook delivery!)</li>
|
||||
<li>✓ More frequent opportunities (every enemy kill = 15% chance)</li>
|
||||
<li>✓ Skill-based system (rewards good flying)</li>
|
||||
<li>✓ Can be done solo or coordinated</li>
|
||||
<li>✓ Creates dynamic battlefield scavenging gameplay</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Combined Strategy</h3>
|
||||
<p>Smart coalitions will:</p>
|
||||
<ul>
|
||||
<li>Assign dedicated MEDEVAC pilots for steady income</li>
|
||||
<li>Have salvage scavengers follow the front line for crate collection</li>
|
||||
<li>Prioritize high-value targets for maximum salvage spawns</li>
|
||||
<li>Practice smooth sling-load flying for condition bonuses</li>
|
||||
<li>Coordinate Chinook pilots for Super Heavy crate recovery</li>
|
||||
</ul>
|
||||
|
||||
<h2>🚀 Quick Reference</h2>
|
||||
|
||||
<div class="quick-ref">
|
||||
<div class="quick-ref-card">
|
||||
<h4>MEDEVAC Quick Steps</h4>
|
||||
<ol>
|
||||
<li>Listen for MEDEVAC announcement (friendly vehicle crew spawned)</li>
|
||||
<li><code>F10 > Ops > MEDEVAC > Vectors to Nearest Crew</code></li>
|
||||
<li>Fly to location, follow smoke</li>
|
||||
<li>Land near crew (auto-loads like troops)</li>
|
||||
<li>Fly to MASH zone</li>
|
||||
<li>Land and wait 15 seconds</li>
|
||||
<li>Salvage awarded! Vehicle respawns shortly after.</li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
<div class="quick-ref-card">
|
||||
<h4>Sling-Load Salvage Quick Steps</h4>
|
||||
<ol>
|
||||
<li>Listen for salvage spawn announcement (enemy died → crate spawned)</li>
|
||||
<li><code>F10 > Navigation > Vectors to Nearest Salvage Crate</code></li>
|
||||
<li>Fly to location (orange smoke = crate)</li>
|
||||
<li>Use <strong>DCS F6 RADIO MENU > Sling Load > Hook Cargo</strong></li>
|
||||
<li>Fly carefully to Salvage Collection Zone</li>
|
||||
<li>Land or drop crate inside zone</li>
|
||||
<li>Salvage awarded based on weight + condition!</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Key Differences</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Feature</th>
|
||||
<th>MEDEVAC</th>
|
||||
<th>Sling-Load Salvage</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Pickup Method</td>
|
||||
<td>Hover pickup OR land → auto-loads troops</td>
|
||||
<td>DCS F6 menu sling-load ONLY (not CTLD hover pickup!)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Reward Type</td>
|
||||
<td>Fixed value per vehicle type</td>
|
||||
<td>Variable value based on weight + flying skill</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Time Window</td>
|
||||
<td>1-hour window before crew KIA</td>
|
||||
<td>3-hour window before crate expires</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Skill Level</td>
|
||||
<td>Easy to Medium</td>
|
||||
<td>Medium to Hard (condition bonuses)</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h2>🔧 Troubleshooting</h2>
|
||||
|
||||
<h3>"I can't sling-load the salvage crate!"</h3>
|
||||
<ul>
|
||||
<li>Use DCS F6 RADIO MENU, not F10 CTLD hover pickup</li>
|
||||
<li>Make sure helicopter supports sling-load (Huey, Hip, Chinook, etc.)</li>
|
||||
<li>Check crate weight vs. helicopter capacity</li>
|
||||
</ul>
|
||||
|
||||
<h3>"Crate disappeared before I got there!"</h3>
|
||||
<ul>
|
||||
<li>Crates expire after 3 hours</li>
|
||||
<li>Check <code>F10 > Navigation > Vectors</code> for time remaining</li>
|
||||
<li>Warnings sent at 30min and 5min</li>
|
||||
</ul>
|
||||
|
||||
<h3>"I didn't get full reward for my delivery!"</h3>
|
||||
<ul>
|
||||
<li>Check crate health - damage reduces reward by up to 50%</li>
|
||||
<li>Fly smoothly, avoid crashes, gentle landings</li>
|
||||
<li>Undamaged crates give 50% BONUS!</li>
|
||||
</ul>
|
||||
|
||||
<h3>"No MEDEVAC missions spawning!"</h3>
|
||||
<ul>
|
||||
<li>Check crew survival chance settings (default 50%)</li>
|
||||
<li>Only friendly vehicle deaths spawn MEDEVAC</li>
|
||||
<li>5-minute delay after death before crew spawns</li>
|
||||
</ul>
|
||||
|
||||
<h3>"Where do I create Salvage Collection Zones?"</h3>
|
||||
<ul>
|
||||
<li><code>F10 > Field Tools > Salvage Collection Zones > Create Salvage Zone Here</code></li>
|
||||
<li>Zone spawns at your current position with 300m radius</li>
|
||||
</ul>
|
||||
|
||||
<h2>⚙️ Configuration Notes</h2>
|
||||
<p>Mission makers can adjust:</p>
|
||||
<ul>
|
||||
<li>MEDEVAC crew survival chance (default 50% per coalition)</li>
|
||||
<li>Sling-load salvage spawn chance (default 15% per coalition)</li>
|
||||
<li>Crate lifetime (default 3 hours)</li>
|
||||
<li>Weight class probabilities and reward rates</li>
|
||||
<li>Condition multipliers</li>
|
||||
<li>MANPADS spawn chance with crews (default 10%)</li>
|
||||
<li>Spawn restrictions and distances</li>
|
||||
</ul>
|
||||
<p>All settings are per-coalition and fully configurable via the CTLD config table.</p>
|
||||
|
||||
<div class="footer">
|
||||
<p><strong>System Design:</strong> F99th Squadron + AI Collaboration</p>
|
||||
<p><strong>Implementation:</strong> MOOSE Framework + CTLD Module</p>
|
||||
<p><strong>Concept Inspiration:</strong> Real-world combat salvage & rescue operations</p>
|
||||
<p><strong>Gameplay Balance:</strong> Community tested & refined</p>
|
||||
<br>
|
||||
<p style="font-size: 1.2em; color: #4ecdc4;">Fly safe. Rescue smart. Salvage everything. 🚁📦</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
13718
Moose_CTLD.lua
Normal file
13718
Moose_CTLD.lua
Normal file
File diff suppressed because it is too large
Load Diff
1756
Moose_CTLD_FAC.lua
Normal file
1756
Moose_CTLD_FAC.lua
Normal file
File diff suppressed because it is too large
Load Diff
118
Moose_CTLD_Init_DualCoalitions.lua
Normal file
118
Moose_CTLD_Init_DualCoalitions.lua
Normal file
@ -0,0 +1,118 @@
|
||||
-- init_mission_dual_coalition.lua
|
||||
-- Use in Mission Editor with DO SCRIPT FILE load order:
|
||||
-- 1) Moose.lua
|
||||
-- 2) Moose_CTLD_Pure/Moose_CTLD.lua
|
||||
-- 3) Moose_CTLD_Pure/catalogs/CrateCatalog_CTLD_Extract.lua -- optional but recommended catalog with BLUE+RED items (_CTLD_EXTRACTED_CATALOG)
|
||||
-- 4) Moose_CTLD_Pure/Moose_CTLD_FAC.lua -- optional FAC/RECCE support
|
||||
-- 5) DO SCRIPT: dofile on this file OR paste the block below directly
|
||||
--
|
||||
-- IMPORTANT: F10 menu ordering depends on script execution order!
|
||||
-- Load this initialization script BEFORE other mission scripts (TADC, CVN, Intel, etc.)
|
||||
-- to ensure CTLD and FAC appear earlier in the F10 menu.
|
||||
--
|
||||
-- Zones you should create in the Mission Editor (as trigger zones):
|
||||
-- BLUE: PICKUP_BLUE_MAIN, DROP_BLUE_1, FOB_BLUE_A
|
||||
-- RED : PICKUP_RED_MAIN, DROP_RED_1, FOB_RED_A
|
||||
-- Adjust names below if you use different zone names.
|
||||
|
||||
|
||||
-- Create CTLD instances only if Moose and CTLD are available
|
||||
if _MOOSE_CTLD and _G.BASE then
|
||||
local blueCfg = {
|
||||
CoalitionSide = coalition.side.BLUE,
|
||||
PickupZoneSmokeColor = trigger.smokeColor.Green,
|
||||
AllowedAircraft = { -- transport-capable unit type names (case-sensitive as in DCS DB)
|
||||
'UH-1H','Mi-8MTV2','Mi-24P','SA342M','SA342L','SA342Minigun','UH-60L','CH-47Fbl1','CH-47F','Mi-17','GazelleAI'
|
||||
},
|
||||
-- Optional: drive zone activation from mission flags (preferred: set per-zone below via flag/activeWhen)
|
||||
|
||||
MapDraw = {
|
||||
Enabled = true,
|
||||
DrawMASHZones = true, -- Enable MASH zone drawing
|
||||
},
|
||||
|
||||
Zones = {
|
||||
PickupZones = { { name = 'ALPHA', flag = 9001, activeWhen = 0 } },
|
||||
DropZones = { { name = 'BRAVO', flag = 9002, activeWhen = 0 } },
|
||||
FOBZones = { { name = 'CHARLIE', flag = 9003, activeWhen = 0 } },
|
||||
MASHZones = { { name = 'MASH Alpha', freq = '251.0 AM', radius = 500, flag = 9010, activeWhen = 0 } },
|
||||
SalvageDropZones = { { name = 'S1', flag = 9020, radius = 500, activeWhen = 0 } },
|
||||
},
|
||||
BuildRequiresGroundCrates = true,
|
||||
}
|
||||
env.info('[DEBUG] blueCfg.Zones.MASHZones count: ' .. tostring(blueCfg.Zones and blueCfg.Zones.MASHZones and #blueCfg.Zones.MASHZones or 'NIL'))
|
||||
if blueCfg.Zones and blueCfg.Zones.MASHZones and blueCfg.Zones.MASHZones[1] then
|
||||
env.info('[DEBUG] blueCfg.Zones.MASHZones[1].name: ' .. tostring(blueCfg.Zones.MASHZones[1].name))
|
||||
end
|
||||
ctldBlue = _MOOSE_CTLD:New(blueCfg)
|
||||
|
||||
local redCfg = {
|
||||
CoalitionSide = coalition.side.RED,
|
||||
PickupZoneSmokeColor = trigger.smokeColor.Green,
|
||||
AllowedAircraft = { -- transport-capable unit type names (case-sensitive as in DCS DB)
|
||||
'UH-1H','Mi-8MTV2','Mi-24P','SA342M','SA342L','SA342Minigun','UH-60L','CH-47Fbl1','CH-47F','Mi-17','GazelleAI'
|
||||
|
||||
},
|
||||
-- Optional: drive zone activation for RED via per-zone flag/activeWhen
|
||||
|
||||
MapDraw = {
|
||||
Enabled = true,
|
||||
DrawMASHZones = true, -- Enable MASH zone drawing
|
||||
},
|
||||
|
||||
Zones = {
|
||||
PickupZones = { { name = 'DELTA', flag = 9101, activeWhen = 0 } },
|
||||
DropZones = { { name = 'ECHO', flag = 9102, activeWhen = 0 } },
|
||||
FOBZones = { { name = 'FOXTROT', flag = 9103, activeWhen = 0 } },
|
||||
MASHZones = { { name = 'MASH Bravo', freq = '252.0 AM', radius = 500, flag = 9111, activeWhen = 0 } },
|
||||
SalvageDropZones = { { name = 'S2', flag = 9020, radius = 500, activeWhen = 0 } },
|
||||
},
|
||||
BuildRequiresGroundCrates = true,
|
||||
}
|
||||
env.info('[DEBUG] redCfg.Zones.MASHZones count: ' .. tostring(redCfg.Zones and redCfg.Zones.MASHZones and #redCfg.Zones.MASHZones or 'NIL'))
|
||||
if redCfg.Zones and redCfg.Zones.MASHZones and redCfg.Zones.MASHZones[1] then
|
||||
env.info('[DEBUG] redCfg.Zones.MASHZones[1].name: ' .. tostring(redCfg.Zones.MASHZones[1].name))
|
||||
end
|
||||
ctldRed = _MOOSE_CTLD:New(redCfg)
|
||||
|
||||
-- Merge catalog into both CTLD instances if catalog was loaded
|
||||
env.info('[init_mission_dual_coalition] Checking for catalog: '..((_CTLD_EXTRACTED_CATALOG and 'FOUND') or 'NOT FOUND'))
|
||||
if _CTLD_EXTRACTED_CATALOG then
|
||||
local count = 0
|
||||
for k,v in pairs(_CTLD_EXTRACTED_CATALOG) do count = count + 1 end
|
||||
env.info('[init_mission_dual_coalition] Catalog has '..tostring(count)..' entries')
|
||||
env.info('[init_mission_dual_coalition] Merging catalog into CTLD instances')
|
||||
ctldBlue:MergeCatalog(_CTLD_EXTRACTED_CATALOG)
|
||||
ctldRed:MergeCatalog(_CTLD_EXTRACTED_CATALOG)
|
||||
env.info('[init_mission_dual_coalition] Catalog merged successfully')
|
||||
-- Verify merge
|
||||
local blueCount = 0
|
||||
for k,v in pairs(ctldBlue.Config.CrateCatalog) do blueCount = blueCount + 1 end
|
||||
env.info('[init_mission_dual_coalition] BLUE catalog now has '..tostring(blueCount)..' entries')
|
||||
else
|
||||
env.info('[init_mission_dual_coalition] WARNING: _CTLD_EXTRACTED_CATALOG not found - catalog not loaded!')
|
||||
env.info('[init_mission_dual_coalition] Available globals: '..((_G._CTLD_EXTRACTED_CATALOG and 'in _G') or 'not in _G'))
|
||||
end
|
||||
else
|
||||
env.info('[init_mission_dual_coalition] Moose or CTLD missing; skipping CTLD init')
|
||||
end
|
||||
|
||||
|
||||
-- Optional: FAC/RECCE for both sides (requires Moose_CTLD_FAC.lua)
|
||||
if _MOOSE_CTLD_FAC and _G.BASE and ctldBlue and ctldRed then
|
||||
facBlue = _MOOSE_CTLD_FAC:New(ctldBlue, {
|
||||
CoalitionSide = coalition.side.BLUE,
|
||||
Arty = { Enabled = false },
|
||||
})
|
||||
-- facBlue:AddRecceZone({ name = 'RECCE_BLUE_1' })
|
||||
facBlue:Run()
|
||||
|
||||
facRed = _MOOSE_CTLD_FAC:New(ctldRed, {
|
||||
CoalitionSide = coalition.side.RED,
|
||||
Arty = { Enabled = false },
|
||||
})
|
||||
-- facRed:AddRecceZone({ name = 'RECCE_RED_1' })
|
||||
facRed:Run()
|
||||
else
|
||||
env.info('[init_mission_dual_coalition] FAC not initialized (missing Moose/CTLD/FAC or CTLD not created)')
|
||||
end
|
||||
8
Moose_CTLD_Pure.code-workspace
Normal file
8
Moose_CTLD_Pure.code-workspace
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "."
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
}
|
||||
BIN
Moose_CTLD_Pure.miz
Normal file
BIN
Moose_CTLD_Pure.miz
Normal file
Binary file not shown.
301
Player_Mission_Guide.html
Normal file
301
Player_Mission_Guide.html
Normal file
@ -0,0 +1,301 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>Complete MOOSE CTLD System — Player & Mission Setup Guide</title>
|
||||
<style>
|
||||
body { font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif; line-height: 1.5; color: #1b1f23; padding: 2rem; max-width: 960px; margin: auto; }
|
||||
h1, h2, h3 { line-height: 1.25; }
|
||||
code, pre { background: #f6f8fa; border-radius: 4px; padding: 0.2em 0.4em; }
|
||||
.note { background: #fff8c5; border: 1px solid #e3d888; padding: 0.75rem; border-radius: 6px; }
|
||||
.screenshot { border: 1px dashed #c9d1d9; padding: 0.75rem; border-radius: 8px; color: #57606a; background: #f6f8fa; margin: 1rem 0; }
|
||||
.screenshot strong { color: #24292f; }
|
||||
hr { border: 0; border-top: 1px solid #d0d7de; margin: 2rem 0; }
|
||||
ul { margin: 0.25rem 0 1rem 1.25rem; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Complete MOOSE CTLD System — Player & Mission Setup Guide</h1>
|
||||
<p>Welcome! This guide explains what logistics means in DCS, how the CTLD system lets players change the battlefield, and exactly how to use the in-game menus. It also includes a concise mission-maker setup section.</p>
|
||||
<hr />
|
||||
|
||||
<h2>What is CTLD and why it matters</h2>
|
||||
<ul>
|
||||
<li>CTLD (logistics & troop transport) turns helicopters and transports into force multipliers.</li>
|
||||
<li>You request “crates” at Supply (Pickup) Zones, deliver them, and build combat units, SAM sites, radars, FOBs, and support vehicles.</li>
|
||||
<li>You can also transport troops and deploy them to hold ground or attack.</li>
|
||||
<li>Every delivered asset can change the front line: new air defenses, JTACs, EWR coverage, armor pushes, or an FOB that shortens logistics legs.</li>
|
||||
</ul>
|
||||
<div class="screenshot"><strong>Screenshot placeholder:</strong> F10 -> CTLD root menu</div>
|
||||
<p><em>Tip:</em> The loop you’ll repeat is <strong>Request → Deliver → Build → Fight</strong>.</p>
|
||||
<hr />
|
||||
|
||||
<h2>Getting started (players)</h2>
|
||||
<ol>
|
||||
<li>Spawn in a supported helicopter or transport.</li>
|
||||
<li>Fly to a friendly Supply (Pickup) Zone.</li>
|
||||
<li>Open F10 Other -> CTLD.</li>
|
||||
<li>Use <em>Logistics -> Request Crate</em> to spawn crates; use <em>Operations -> Build</em> to assemble units/sites.</li>
|
||||
<li>Use <em>Navigation</em> to get vectors and Hover Coach, and <em>Field Tools</em> to mark or create a quick Drop Zone.</li>
|
||||
<li>Deliver, build, and watch the mission evolve.</li>
|
||||
</ol>
|
||||
<div class="screenshot"><strong>Screenshot placeholder:</strong> Example Pickup Zone with smoke</div>
|
||||
<hr />
|
||||
|
||||
<h2>Menu overview (matches in-game structure)</h2>
|
||||
<p>Below are the menu groups and the common actions you’ll see under each. Some options appear only when relevant (e.g., inventory enabled, crates nearby, zones configured).</p>
|
||||
|
||||
<h3>Operations</h3>
|
||||
<div class="screenshot"><strong>Screenshot placeholder:</strong> Operations menu open</div>
|
||||
<ul>
|
||||
<li><strong>Troop Transport</strong>
|
||||
<ul>
|
||||
<li><strong>Load Troops</strong>: Load infantry while inside an ACTIVE Supply (Pickup) Zone if the mission enforces this rule.</li>
|
||||
<li><strong>Deploy Troops (Defend)</strong>: Unload troops to hold the current area and defend nearby.</li>
|
||||
<li><strong>Deploy Troops (Attack)</strong>: Unload troops and order them to seek and engage enemies or move toward enemy-held bases (mission-configured behavior and speed). Static/unsuitable units will hold position.</li>
|
||||
<li><em>Notes:</em>
|
||||
<ul>
|
||||
<li>Troop loading may be restricted to Pickup Zones. The nearest zone will be shown in messages if you’re outside.</li>
|
||||
<li>Deployment is blocked inside Pickup Zones when restrictions are enabled.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Build</strong>
|
||||
<ul>
|
||||
<li><strong>Build Here</strong>: Consumes nearby crates (within the Build Radius) and spawns the unit/site at your position. Includes a “confirm within X seconds” safety and a cooldown between builds.</li>
|
||||
<li><strong>Build (Advanced) → Buildable Near You</strong>
|
||||
<ul>
|
||||
<li>Lists everything that can be built with crates you’ve dropped nearby (and optionally what you’re carrying, depending on mission settings).</li>
|
||||
<li>Per item you’ll see:
|
||||
<ul>
|
||||
<li><strong>Build [Hold Position]</strong>: Spawns and orders the unit/site to hold.</li>
|
||||
<li><strong>Build [Attack (N m)]</strong>: Spawns and orders mobile units to seek/attack within the configured radius. Static/unsuitable units will still hold.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Refresh Buildable List</strong>: Re-scan nearby crates and update the list.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>FOB-only recipes can require building inside an FOB Zone when enabled (mission-specific rule).</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>Logistics</h3>
|
||||
<div class="screenshot"><strong>Screenshot placeholder:</strong> Logistics -> Request Crate</div>
|
||||
<ul>
|
||||
<li><strong>Request Crate</strong>
|
||||
<ul>
|
||||
<li>Menu is organized by categories (e.g., Combat Vehicles, AAA, SAM short range, Support, Artillery, etc.).</li>
|
||||
<li>Each entry shows how many crates are required (e.g., “M1097 Avenger (2 crates)”).</li>
|
||||
<li>Requests generally require being within the maximum distance to an ACTIVE Pickup Zone.</li>
|
||||
<li>When inventory is enabled, stock is tracked per zone; out-of-stock types cannot be requested at that location until resupplied.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Recipe Info</strong>
|
||||
<ul>
|
||||
<li>Browse categories and see each item’s description; use this to plan which crates you need to build a unit or a multi-crate site.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Request Crate (In Stock Here)</strong>
|
||||
<ul>
|
||||
<li>Appears when inventory menus are enabled and the mission-maker has exposed this view.</li>
|
||||
<li>Shows only items in stock at your nearest active Supply Zone and lets you spawn them directly.</li>
|
||||
<li>Includes a “Refresh” option to update the list after requests.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Crate handling tips</strong>
|
||||
<ul>
|
||||
<li>Crates are marked with smoke at spawn.</li>
|
||||
<li>Use <em>Navigation → Request Vectors to Nearest Crate</em> if you lose sight of it.</li>
|
||||
<li>Hover pickup: hold roughly 5–20 m AGL, very low ground speed, steady for a few seconds to auto-load.</li>
|
||||
<li>Crates have a mission-configured lifetime and will self-cleanup if not used.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>Field Tools</h3>
|
||||
<div class="screenshot"><strong>Screenshot placeholder:</strong> Field Tools menu open</div>
|
||||
<ul>
|
||||
<li><strong>Create Drop Zone (AO)</strong>: Quickly creates a temporary Drop Zone around your current position for coordination or scripted objectives.</li>
|
||||
<li><strong>Smoke My Location</strong>: Green / Red / White / Orange / Blue — mark your current spot with smoke to help other players find you or the build point.</li>
|
||||
</ul>
|
||||
|
||||
<h3>Navigation</h3>
|
||||
<div class="screenshot"><strong>Screenshot placeholder:</strong> Navigation menu open</div>
|
||||
<ul>
|
||||
<li><strong>Hover Coach: Enable / Disable</strong>: In-game guidance messages to help you nail the hover pickup window (AGL, drift, speed, “hold steady” cues).</li>
|
||||
<li><strong>Request Vectors to Nearest Crate</strong>: Prints bearing and range to the closest friendly crate.</li>
|
||||
<li><strong>Vectors to Nearest Pickup Zone</strong>: Bearing and range to the nearest active Supply (Pickup) Zone; if none are active, you’ll get helpful direction to the nearest configured one.</li>
|
||||
</ul>
|
||||
|
||||
<h3>Admin/Help</h3>
|
||||
<div class="screenshot"><strong>Screenshot placeholder:</strong> Admin/Help menu open</div>
|
||||
<ul>
|
||||
<li><strong>Show CTLD Status</strong>: Quick summary of active crates, how many zones exist, and whether Build Confirm/Cooldown are ON.</li>
|
||||
<li><strong>Draw CTLD Zones on Map / Clear CTLD Map Drawings</strong>: Draws labeled circles for Pickup/Drop/FOB zones on the F10 map for your coalition; clear them when you’re done.</li>
|
||||
<li><strong>Debug → Enable/Disable logging</strong>: Toggle detailed logging (mission maker troubleshooting).</li>
|
||||
<li><strong>Player Guides</strong>: Zones – Guide; Inventory – How It Works; CTLD Basics; Troop Transport & JTAC Use; Hover Pickup & Slingloading; Build System; SAM Sites.</li>
|
||||
<li><strong>Coalition Summary</strong> (if exposed by mission maker): A roll-up of coalition CTLD activity.</li>
|
||||
</ul>
|
||||
|
||||
<hr />
|
||||
<h2>How players influence the mission</h2>
|
||||
<ul>
|
||||
<li>Build air defenses (SAM/AAA) to protect friendly FARPs/FOBs and deny enemy air.</li>
|
||||
<li>Deploy armor and ATGM teams to push objectives, ambush enemy convoys, or hold key terrain.</li>
|
||||
<li>Build EWR/JTAC for better situational awareness and targeting support.</li>
|
||||
<li>Establish FOBs to create forward supply hubs and shorten flight times.</li>
|
||||
</ul>
|
||||
<div class="screenshot"><strong>Screenshot placeholder:</strong> Example built SAM site</div>
|
||||
|
||||
<hr />
|
||||
<h2>Mission setup (for mission makers)</h2>
|
||||
<p>Keep this section short and focused. You can find the defaults and toggles inside:</p>
|
||||
<ul>
|
||||
<li><code>Moose_CTLD_Pure/Moose_CTLD.lua</code> (main CTLD implementation; see the <code>CTLD.Config</code> table)</li>
|
||||
<li><code>Moose_CTLD_Pure/Moose_CTLD_FAC.lua</code> (optional FAC/RECCE support)</li>
|
||||
<li><code>Moose_CTLD_Pure/catalogs/</code> (example catalogs with ready-to-use recipes)</li>
|
||||
<li><code>Moose_CTLD_Pure/init_mission_dual_coalition.lua</code> (ready-to-use minimal init for BLUE+RED)</li>
|
||||
</ul>
|
||||
|
||||
<h3>Load order (Do Script File in Mission Editor)</h3>
|
||||
<ol>
|
||||
<li><code>Moose.lua</code></li>
|
||||
<li><code>Moose_CTLD_Pure/Moose_CTLD.lua</code></li>
|
||||
<li>A catalog file from <code>Moose_CTLD_Pure/catalogs/</code> (optional but recommended)</li>
|
||||
<li><code>Moose_CTLD_Pure/Moose_CTLD_FAC.lua</code> (optional FAC/RECCE)</li>
|
||||
<li>Your mission init block (you can use <code>Moose_CTLD_Pure/init_mission_dual_coalition.lua</code> as-is or adapt it)</li>
|
||||
</ol>
|
||||
<div class="screenshot"><strong>Screenshot placeholder:</strong> Mission Editor Do Script File list</div>
|
||||
|
||||
<p><strong>Minimal snippet (example)</strong> — keep it to the point:</p>
|
||||
<ul>
|
||||
<li>Create a CTLD instance per coalition with: CoalitionSide, AllowedAircraft, Zones (Pickup/Drop/FOB definitions), and key toggles.</li>
|
||||
<li>Optionally create a FAC module instance and run it.</li>
|
||||
<li>Optionally merge a crate catalog.</li>
|
||||
</ul>
|
||||
<p><em>Hint:</em> See the shipped <code>init_mission_dual_coalition.lua</code> for a clean example of both BLUE and RED.</p>
|
||||
|
||||
<h3>Zones you must create in the Mission Editor</h3>
|
||||
<ul>
|
||||
<li>Pickup (Supply): e.g., <code>ALPHA</code> (BLUE), <code>DELTA</code> (RED)</li>
|
||||
<li>Drop: e.g., <code>BRAVO</code> (BLUE), <code>ECHO</code> (RED)</li>
|
||||
<li>FOB: e.g., <code>CHARLIE</code> (BLUE), <code>FOXTROT</code> (RED)</li>
|
||||
</ul>
|
||||
<p>Use the names referenced by your init script. The example init uses flags to control active/inactive state.</p>
|
||||
<div class="screenshot"><strong>Screenshot placeholder:</strong> Trigger zones for Pickup/Drop/FOB</div>
|
||||
|
||||
<h3>Frequently configured options (where to change)</h3>
|
||||
<p>All of the following live under <code>CTLD.Config</code> in <code>Moose_CTLD.lua</code> or can be provided in the table passed to <code>_MOOSE_CTLD:New({...})</code> in your init script.</p>
|
||||
<ul>
|
||||
<li><strong>Logistics rules</strong>
|
||||
<ul>
|
||||
<li><code>RequirePickupZoneForCrateRequest</code></li>
|
||||
<li><code>RequirePickupZoneForTroopLoad</code></li>
|
||||
<li><code>PickupZoneMaxDistance</code></li>
|
||||
<li><code>ForbidDropsInsidePickupZones</code></li>
|
||||
<li><code>ForbidTroopDeployInsidePickupZones</code></li>
|
||||
<li><code>ForbidChecksActivePickupOnly</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Building behavior</strong>
|
||||
<ul>
|
||||
<li><code>BuildRadius</code></li>
|
||||
<li><code>BuildSpawnOffset</code></li>
|
||||
<li><code>BuildConfirmEnabled</code> + <code>BuildConfirmWindowSeconds</code></li>
|
||||
<li><code>BuildCooldownEnabled</code> + <code>BuildCooldownSeconds</code></li>
|
||||
<li><code>RestrictFOBToZones</code></li>
|
||||
<li><code>AutoBuildFOBInZones</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Inventory system (per-zone stock)</strong>
|
||||
<ul>
|
||||
<li><code>Inventory.Enabled</code></li>
|
||||
<li><code>Inventory.ShowStockInMenu</code></li>
|
||||
<li><code>Inventory.HideZeroStockMenu</code></li>
|
||||
<li><code>Inventory.FOBStockFactor</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Hover & pickup quality-of-life</strong>
|
||||
<ul>
|
||||
<li><code>HoverCoachConfig</code> (messages/timing/thresholds)</li>
|
||||
<li><code>TroopSpawnOffset</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>AI behavior for Attack builds</strong>
|
||||
<ul>
|
||||
<li><code>AttackAI.VehicleSearchRadius</code></li>
|
||||
<li><code>AttackAI.MoveSpeedKmh</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Menus</strong>
|
||||
<ul>
|
||||
<li><code>UseGroupMenus</code></li>
|
||||
<li><code>UseCategorySubmenus</code></li>
|
||||
<li><code>PickupZoneSmokeColor</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>Crate catalog (recipes)</h3>
|
||||
<ul>
|
||||
<li>Use one of the provided catalogs under <code>Moose_CTLD_Pure/catalogs/</code> or your own.</li>
|
||||
<li>Each entry defines a display label, side, category, stock, and a build function.</li>
|
||||
<li>Multi-crate “SITE” entries build multi-unit groups (SAM sites or composite systems).</li>
|
||||
<li><strong>Typical workflow</strong>
|
||||
<ul>
|
||||
<li>Load your chosen catalog after <code>Moose_CTLD.lua</code>.</li>
|
||||
<li>Merge it into each CTLD instance you created.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="screenshot"><strong>Screenshot placeholder:</strong> Request Crate categories</div>
|
||||
|
||||
<h3>Dual-coalition setup</h3>
|
||||
<ul>
|
||||
<li>Instantiate two CTLD instances (one per side), each with its own zone names and smoke colors.</li>
|
||||
<li>Instantiate two FAC modules if you want auto-lase/RECCE for both sides.</li>
|
||||
<li>The included <code>init_mission_dual_coalition.lua</code> shows a minimal working setup.</li>
|
||||
</ul>
|
||||
|
||||
<h3>FAC/RECCE (optional, from <code>Moose_CTLD_FAC.lua</code>)</h3>
|
||||
<ul>
|
||||
<li><strong>What it adds</strong>: Auto-lase with configurable laser codes, IR markers, map marks; manual target lists; multi-strike helper; artillery/naval/air tasking; RECCE sweeps with DMS/MGRS.</li>
|
||||
<li><strong>Player usage</strong>: Look for an F10 FAC/RECCE menu in qualifying aircraft or groups.</li>
|
||||
<li><strong>Mission knobs</strong>: CoalitionSide, auto-lase behavior, code reservations, marker type/color, on-station logic—see <code>Moose_CTLD_FAC.lua</code> or pass overrides to <code>:New()</code>.</li>
|
||||
</ul>
|
||||
|
||||
<h3>Sanity checks and troubleshooting</h3>
|
||||
<ul>
|
||||
<li>Use <em>Admin/Help -> Show CTLD Status</em> to verify counts and toggles quickly.</li>
|
||||
<li>Draw zones to confirm names/positions match your intent.</li>
|
||||
<li>If crates don’t spawn: check zone active state, distance to zone, and inventory stock.</li>
|
||||
<li>If builds don’t trigger: check Build Radius, confirm window, cooldown, and that the crates match the recipe.</li>
|
||||
</ul>
|
||||
|
||||
<hr />
|
||||
<h2>Screenshot ideas (drop your captures in the placeholders above)</h2>
|
||||
<ul>
|
||||
<li>CTLD root menu with the five groups (Operations, Logistics, Field Tools, Navigation, Admin/Help)</li>
|
||||
<li>Request Crate with category submenus visible</li>
|
||||
<li>Build (Advanced) -> Buildable Near You list</li>
|
||||
<li>Hover Coach prompt during a near-perfect hover</li>
|
||||
<li>Vectors message to a crate / pickup zone</li>
|
||||
<li>Zone drawings on the F10 map (Pickup/Drop/FOB labeled)</li>
|
||||
<li>In Stock Here list (if enabled)</li>
|
||||
<li>Example SAM site placed after a build</li>
|
||||
</ul>
|
||||
|
||||
<hr />
|
||||
<h2>Appendix: File locations and names</h2>
|
||||
<ul>
|
||||
<li>Main CTLD: <code>Moose_CTLD_Pure/Moose_CTLD.lua</code></li>
|
||||
<li>FAC/RECCE: <code>Moose_CTLD_Pure/Moose_CTLD_FAC.lua</code></li>
|
||||
<li>Example dual-coalition init: <code>Moose_CTLD_Pure/init_mission_dual_coalition.lua</code></li>
|
||||
<li>Catalogs: <code>Moose_CTLD_Pure/catalogs/</code></li>
|
||||
</ul>
|
||||
<p>No large code is required; most options are cleanly exposed in the config tables. Keep snippets tiny when needed.</p>
|
||||
</body>
|
||||
</html>
|
||||
438
Player_Mission_Guide.md
Normal file
438
Player_Mission_Guide.md
Normal file
@ -0,0 +1,438 @@
|
||||
# Complete MOOSE CTLD System — Player & Mission Setup Guide
|
||||
|
||||
Welcome! This guide explains what logistics means in DCS, how the CTLD system lets players change the battlefield, and exactly how to use the in-game menus. It also includes a concise mission-maker setup section.
|
||||
|
||||
---
|
||||
|
||||
## What is CTLD and why it matters
|
||||
|
||||
- CTLD (logistics & troop transport) turns helicopters and transports into force multipliers.
|
||||
- You request “crates” at Supply (Pickup) Zones, deliver them, and build combat units, SAM sites, radars, FOBs, and support vehicles.
|
||||
- You can also transport troops and deploy them to hold ground or attack.
|
||||
- Every delivered asset can change the front line: new air defenses, JTACs, EWR coverage, armor pushes, or an FOB that shortens logistics legs.
|
||||
|
||||
[screenshot: F10 -> CTLD root menu]
|
||||
|
||||
Tip: The loop you’ll repeat is Request → Pickup → Transport → Deliver → Build → Fight.
|
||||
|
||||
---
|
||||
|
||||
## Getting started (players)
|
||||
|
||||
1) Spawn in a supported helicopter or transport.
|
||||
2) Fly to a friendly Supply (Pickup) Zone.
|
||||
3) Open F10 Other -> CTLD.
|
||||
4) Use Logistics -> Request Crate to spawn crates; use Operations -> Build to assemble units/sites.
|
||||
5) Use Navigation to get vectors and Hover Coach, and Field Tools to mark or create a quick Drop Zone.
|
||||
6) Deliver, build, and watch the mission evolve.
|
||||
|
||||
[screenshot: Example Pickup Zone with smoke]
|
||||
|
||||
---
|
||||
|
||||
## Menu overview (matches in-game structure)
|
||||
|
||||
Below are the menu groups and the common actions you’ll see under each. Some options appear only when relevant (e.g., inventory enabled, crates nearby, zones configured).
|
||||
|
||||
### Operations
|
||||
|
||||
[screenshot: Operations menu open]
|
||||
|
||||
- Troop Transport
|
||||
- Load Troops: Load infantry while inside an ACTIVE Supply (Pickup) Zone if the mission enforces this rule.
|
||||
- Deploy Troops (Defend): Unload troops to hold the current area and defend nearby.
|
||||
- Deploy Troops (Attack): Unload troops and order them to seek and engage enemies or move toward enemy-held bases (mission-configured behavior and speed). Static/unsuitable units will hold position.
|
||||
- Notes
|
||||
- Troop loading may be restricted to Pickup Zones. The nearest zone will be shown in messages if you’re outside.
|
||||
- Deployment is blocked inside Pickup Zones when restrictions are enabled.
|
||||
|
||||
- Build
|
||||
- Build Here: Consumes nearby crates (within the Build Radius) and spawns the unit/site at your position. Includes a "confirm within X seconds" safety and a cooldown between builds.
|
||||
- Build (Advanced) → Buildable Near You
|
||||
- Lists everything that can be built with crates you've dropped nearby (and optionally what you're carrying, depending on mission settings).
|
||||
- Per item you'll see:
|
||||
- Build [Hold Position]: Spawns and orders the unit/site to hold.
|
||||
- Build [Attack (N m)]: Spawns and orders mobile units to seek/attack within the configured radius. Static/unsuitable units will still hold.
|
||||
- Refresh Buildable List: Re-scan nearby crates and update the list.
|
||||
- FOB-only recipes can require building inside an FOB Zone when enabled (mission-specific rule).
|
||||
|
||||
- MEDEVAC (if enabled in mission)
|
||||
- List Active MEDEVAC Requests: Shows all pending rescue missions with grid coordinates and time remaining
|
||||
- Nearest MEDEVAC Location: Bearing and range to the closest MEDEVAC crew needing rescue
|
||||
- Coalition Salvage Points: Display current salvage point balance for your coalition
|
||||
- Vectors to Nearest MEDEVAC: Full details (bearing, range, time remaining) to nearest crew
|
||||
- MASH Locations: Shows all active MASH (Mobile Army Surgical Hospital) zones where you can deliver crews
|
||||
- Pop Smoke at Crew Locations: Marks all active crew locations with smoke for easier visual identification
|
||||
- Pop Smoke at MASH Zones: Marks all MASH zones with smoke
|
||||
- MASH & Salvage System - Guide: In-game quick reference for the MEDEVAC system (same as in Admin/Help -> Player Guides)
|
||||
- Admin/Settings → Clear All MEDEVAC Missions: Debug/admin tool to reset all active MEDEVAC missions
|
||||
|
||||
### Logistics
|
||||
|
||||
[screenshot: Logistics -> Request Crate]
|
||||
|
||||
- Request Crate
|
||||
- Menu is organized by categories (e.g., Combat Vehicles, AAA, SAM short range, Support, Artillery, etc.).
|
||||
- Each entry shows how many crates are required (e.g., “M1097 Avenger (2 crates)”).
|
||||
- Requests generally require being within the maximum distance to an ACTIVE Pickup Zone.
|
||||
- When inventory is enabled, stock is tracked per zone; out-of-stock types cannot be requested at that location until resupplied.
|
||||
|
||||
- Recipe Info
|
||||
- Browse categories and see each item’s description; use this to plan which crates you need to build a unit or a multi-crate site.
|
||||
|
||||
- Request Crate (In Stock Here)
|
||||
- Appears when inventory menus are enabled and the mission-maker has exposed this view.
|
||||
- Shows only items in stock at your nearest active Supply Zone and lets you spawn them directly.
|
||||
- Includes a “Refresh” option to update the list after requests.
|
||||
|
||||
- Crate handling tips
|
||||
- Crates are marked with smoke at spawn.
|
||||
- Use Navigation -> Request Vectors to Nearest Crate if you lose sight of it.
|
||||
- Hover pickup: hold roughly 5–20 m AGL, very low ground speed, steady for a few seconds to auto-load.
|
||||
- Crates have a mission-configured lifetime and will self-cleanup if not used.
|
||||
|
||||
### Field Tools
|
||||
|
||||
[screenshot: Field Tools menu open]
|
||||
|
||||
- Create Drop Zone (AO)
|
||||
- Quickly creates a temporary Drop Zone around your current position for coordination or scripted objectives.
|
||||
|
||||
- Smoke My Location
|
||||
- Green / Red / White / Orange / Blue: Mark your current spot with smoke to help other players find you or the build point.
|
||||
|
||||
### Navigation
|
||||
|
||||
[screenshot: Navigation menu open]
|
||||
|
||||
- Hover Coach: Enable / Disable
|
||||
- In-game guidance messages to help you nail the hover pickup window (AGL, drift, speed, “hold steady” cues).
|
||||
|
||||
- Request Vectors to Nearest Crate
|
||||
- Prints bearing and range to the closest friendly crate.
|
||||
|
||||
- Vectors to Nearest Pickup Zone
|
||||
- Bearing and range to the nearest active Supply (Pickup) Zone; if none are active, you’ll get helpful direction to the nearest configured one.
|
||||
|
||||
### Admin/Help
|
||||
|
||||
[screenshot: Admin/Help menu open]
|
||||
|
||||
- Show CTLD Status
|
||||
- Quick summary of active crates, how many zones exist, and whether Build Confirm/Cooldown are ON.
|
||||
|
||||
- Draw CTLD Zones on Map / Clear CTLD Map Drawings
|
||||
- Draws labeled circles for Pickup/Drop/FOB zones on the F10 map for your coalition; clear them when you’re done.
|
||||
|
||||
- Debug → Enable logging / Disable logging
|
||||
- Toggles detailed logging (mission maker troubleshooting).
|
||||
|
||||
- Player Guides (in-game quick reference)
|
||||
- Zones – Guide
|
||||
- Inventory – How It Works
|
||||
- CTLD Basics (2-minute tour)
|
||||
- Troop Transport & JTAC Use
|
||||
- Hover Pickup & Slingloading
|
||||
- Build System: Build Here and Advanced
|
||||
- SAM Sites: Building, Repairing, and Augmenting
|
||||
|
||||
- Coalition Summary (if exposed by mission maker)
|
||||
- A roll-up of coalition CTLD activity (counts, highlights). Exact placement depends on mission configuration.
|
||||
|
||||
---
|
||||
|
||||
## How players influence the mission
|
||||
|
||||
- Build air defenses (SAM/AAA): Protect friendly FARPs/FOBs and deny enemy air.
|
||||
- Deploy armor and ATGM teams: Push objectives, ambush enemy convoys, or hold key terrain.
|
||||
- Build EWR/JTAC: Improve situational awareness and targeting support.
|
||||
- Establish FOBs: Create forward supply hubs to shorten flight times and increase the tempo of logistics.
|
||||
- Rescue MEDEVAC crews: Save downed vehicle crews, earn salvage points, and keep friendly vehicles in the fight.
|
||||
|
||||
[screenshot: Example built SAM site]
|
||||
|
||||
Practical tip: Coordinate. One player can shuttle crates while others escort or build. FOBs multiply everyone's effectiveness.
|
||||
|
||||
---
|
||||
|
||||
## MEDEVAC & Salvage System (Player Operations Guide)
|
||||
|
||||
The MEDEVAC (Medical Evacuation) and Salvage system adds a high-stakes rescue mission layer to logistics. When friendly ground vehicles are destroyed, their crews may survive and call for rescue. Successfully rescuing and delivering these crews to MASH zones earns your coalition Salvage Points—a critical resource that keeps logistics flowing even when supply zones run dry.
|
||||
|
||||
### What is MEDEVAC?
|
||||
|
||||
- **Vehicle destruction triggers rescue missions**: When a friendly ground vehicle (tank, APC, AA vehicle, etc.) is destroyed, the crew has a chance to survive and spawn near the wreck.
|
||||
- **Time-limited rescue window**: Crews have a limited time (typically 60 minutes) to be rescued. If no one comes, they're KIA and the vehicle is permanently lost.
|
||||
- **Coalition-wide benefit**: Any helicopter pilot can attempt the rescue. Successful delivery to MASH earns salvage points for the entire coalition.
|
||||
|
||||
### How the rescue workflow works
|
||||
|
||||
1. **Vehicle destroyed → Crew spawns** (after a delay, typically 5 minutes to let the battle clear)
|
||||
- Crew spawns near the wreck with a small offset toward the nearest enemy
|
||||
- Invulnerability period during announcement (crews can't be killed immediately)
|
||||
- MEDEVAC request broadcast to coalition with grid coordinates and salvage value
|
||||
- Map marker created (if enabled) showing location and time remaining
|
||||
|
||||
2. **Navigate to crew location**
|
||||
- Use Operations → MEDEVAC → Vectors to Nearest MEDEVAC for bearing and range
|
||||
- Or check Navigation → Vectors to Nearest MEDEVAC Crew
|
||||
- Crews pop smoke when they detect approaching helicopters (typically within 8 km)
|
||||
- Watch for humorous greeting messages when you get close!
|
||||
|
||||
3. **Load the crew**
|
||||
- Hover nearby and load troops normally (Operations → Troop Transport → Load Troops)
|
||||
- System automatically detects MEDEVAC crew and marks them as rescued
|
||||
- **Original vehicle respawns at its death location** (if enabled), fully repaired and ready to fight
|
||||
- You'll see a confirmation message with crew size and salvage value
|
||||
|
||||
4. **Deliver to MASH zone**
|
||||
- Fly to any friendly MASH (Mobile Army Surgical Hospital) zone
|
||||
- Use Operations → MEDEVAC → MASH Locations or Navigation → Vectors to Nearest MASH
|
||||
- Deploy troops inside the MASH zone (Operations → Troop Transport → Deploy)
|
||||
- **Salvage points automatically awarded** to your coalition
|
||||
- Coalition-wide message announces the delivery, points earned, and new total
|
||||
|
||||
### Warning system
|
||||
|
||||
The mission keeps you informed of time-critical rescues:
|
||||
- **15-minute warning**: "WARNING: [vehicle] crew at [grid] - rescue window expires in 15 minutes!"
|
||||
- **5-minute warning**: "URGENT: [vehicle] crew at [grid] - rescue window expires in 5 minutes!"
|
||||
- **Timeout**: If rescue window expires, crew is KIA and vehicle is permanently lost
|
||||
|
||||
### MASH Zones (Mobile Army Surgical Hospital)
|
||||
|
||||
**Fixed MASH zones** are pre-configured by the mission maker at friendly bases or FARPs. These are always active and visible on the map (use Admin/Help → Draw CTLD Zones to see them).
|
||||
|
||||
**Mobile MASH** can be built by players using MASH crates from the logistics catalog:
|
||||
- Request and build Mobile MASH crates like any other unit
|
||||
- Creates a new delivery zone with radio beacon
|
||||
- Perfect for forward operations near active combat zones
|
||||
- Multiple mobile MASHs can be deployed to reduce delivery times
|
||||
- If destroyed, that MASH zone stops accepting deliveries
|
||||
|
||||
### Salvage Points: The economic engine
|
||||
|
||||
**Earning salvage**:
|
||||
- Each vehicle type has a salvage value (typically 1 point per crew member)
|
||||
- Deliver crews to MASH to earn points for your coalition
|
||||
- Coalition-wide pool: everyone benefits from everyone's rescues
|
||||
|
||||
**Using salvage**:
|
||||
- When you request crates and the supply zone is OUT OF STOCK, salvage automatically applies (if enabled)
|
||||
- System consumes salvage points equal to the item's cost
|
||||
- Lets you build critical items even when supply lines are exhausted
|
||||
- Check current balance: Operations → MEDEVAC → Coalition Salvage Points
|
||||
|
||||
**Strategic value**:
|
||||
- High-value vehicles (tanks, AA systems) typically award more salvage
|
||||
- Prioritize rescues based on salvage value and proximity
|
||||
- Mobile MASH deployment near combat zones multiplies salvage income
|
||||
- Salvage can unlock mission-critical capabilities when inventory runs low
|
||||
|
||||
### Crew survival mechanics (mission-configurable)
|
||||
|
||||
- **Survival chance**: Configurable per coalition (default ~50%). Not every destroyed vehicle spawns a crew.
|
||||
- **MANPADS chance**: Some crew members may spawn with anti-air weapons (default ~10%), providing limited self-defense
|
||||
- **Crew size**: Varies by vehicle type (catalog-defined). Tanks typically have 3-4 crew, APCs 2-3.
|
||||
- **Crew defense**: Crews will return fire if engaged during rescue (can be disabled)
|
||||
- **Invulnerability**: Crews are typically immortal during the announcement delay and often remain protected until rescue to prevent instant death
|
||||
|
||||
### Best practices for MEDEVAC operations
|
||||
|
||||
1. **Monitor requests actively**: Use Operations → MEDEVAC → List Active MEDEVAC Requests to see all pending missions
|
||||
2. **Prioritize by value and time**: High salvage + low time remaining = top priority
|
||||
3. **Deploy Mobile MASH forward**: Reduce delivery time by placing MASH near active combat zones
|
||||
4. **Coordinate with team**: Share MEDEVAC locations. One player can rescue while another delivers to MASH.
|
||||
5. **Use smoke marking**: Operations → MEDEVAC → Pop Smoke at Crew Locations marks all crews with smoke
|
||||
6. **Check salvage before major operations**: Know your coalition's salvage balance before pushing objectives
|
||||
7. **Risk assessment**: Don't sacrifice your aircraft for low-value rescues in hot zones. Dead rescuer = no rescue.
|
||||
|
||||
### MEDEVAC menu quick reference (Operations → MEDEVAC)
|
||||
|
||||
- **List Active MEDEVAC Requests**: Overview of all pending rescues (grid, vehicle type, time left)
|
||||
- **Nearest MEDEVAC Location**: Quick bearing/range to closest crew
|
||||
- **Vectors to Nearest MEDEVAC**: Detailed navigation info with time remaining
|
||||
- **Coalition Salvage Points**: Check current balance
|
||||
- **MASH Locations**: Shows all active MASH zones (fixed and mobile)
|
||||
- **Pop Smoke at Crew Locations**: Visual marking for all active crews
|
||||
- **Pop Smoke at MASH Zones**: Visual marking for all delivery zones
|
||||
- **MASH & Salvage System - Guide**: In-game reference (same content available in Admin/Help → Player Guides)
|
||||
|
||||
### MEDEVAC statistics (if enabled)
|
||||
|
||||
Some missions track detailed statistics available via Admin/Help → Show MEDEVAC Statistics:
|
||||
- Crews spawned, rescued, delivered to MASH
|
||||
- Timed out and killed in action
|
||||
- Vehicles respawned
|
||||
- Salvage earned, used, and current balance
|
||||
|
||||
[screenshot: MEDEVAC request message with grid coordinates]
|
||||
[screenshot: Operations → MEDEVAC menu]
|
||||
[screenshot: Mobile MASH deployed with beacon]
|
||||
|
||||
---
|
||||
|
||||
## How players influence the mission
|
||||
|
||||
- Build air defenses (SAM/AAA): Protect friendly FARPs/FOBs and deny enemy air.
|
||||
- Deploy armor and ATGM teams: Push objectives, ambush enemy convoys, or hold key terrain.
|
||||
- Build EWR/JTAC: Improve situational awareness and targeting support.
|
||||
- Establish FOBs: Create forward supply hubs to shorten flight times and increase the tempo of logistics.
|
||||
- Rescue MEDEVAC crews: Save downed vehicle crews, earn salvage points, and keep friendly vehicles in the fight.
|
||||
|
||||
[screenshot: Example built SAM site]
|
||||
|
||||
Practical tip: Coordinate. One player can shuttle crates while others escort or build. FOBs multiply everyone's effectiveness.
|
||||
|
||||
---
|
||||
|
||||
## Mission setup (for mission makers)
|
||||
|
||||
Keep this section short and focused. You can find the defaults and toggles inside:
|
||||
- `Moose_CTLD_Pure/Moose_CTLD.lua` (main CTLD implementation; see the `CTLD.Config` table)
|
||||
- `Moose_CTLD_Pure/Moose_CTLD_FAC.lua` (optional FAC/RECCE support)
|
||||
- `Moose_CTLD_Pure/catalogs/` (example catalogs with ready-to-use recipes)
|
||||
- `Moose_CTLD_Pure/init_mission_dual_coalition.lua` (ready-to-use minimal init for BLUE+RED)
|
||||
|
||||
### Load order (Do Script File in Mission Editor)
|
||||
|
||||
1) `Moose.lua`
|
||||
2) `Moose_CTLD.lua`
|
||||
3) A catalog file from `/catalogs/`
|
||||
4) `Moose_CTLD_FAC.lua` (optional FAC/RECCE)
|
||||
5) Your mission init block (you can use `Moose_CTLD_Pure/init_mission_dual_coalition.lua` as-is or adapt it)
|
||||
|
||||
<img width="390" height="170" alt="image" src="https://github.com/user-attachments/assets/fd468f5c-5240-47f0-8603-a7996e20ba7e" />
|
||||
|
||||
|
||||
Minimal snippet (example) — keep it to the point:
|
||||
|
||||
- Create a CTLD instance per coalition with: CoalitionSide, AllowedAircraft, Zones (Pickup/Drop/FOB definitions), and key toggles.
|
||||
- Optionally create a FAC module instance and run it.
|
||||
- Optionally merge a crate catalog.
|
||||
|
||||
Hint: See the shipped `init_mission_dual_coalition.lua` for a clean example of both BLUE and RED.
|
||||
|
||||
### Zones you must create in the Mission Editor
|
||||
|
||||
- Pickup (Supply): e.g., `ALPHA` (BLUE), `DELTA` (RED)
|
||||
- Drop: e.g., `BRAVO` (BLUE), `ECHO` (RED)
|
||||
- FOB: e.g., `CHARLIE` (BLUE), `FOXTROT` (RED)
|
||||
- MASH (optional, for MEDEVAC): e.g., `MASH_BLUE_1`, `MASH_RED_1` (accepts crew deliveries for salvage points)
|
||||
|
||||
Use the names referenced by your init script. The example init uses flags to control active/inactive state.
|
||||
|
||||
[screenshot: Trigger zones for Pickup/Drop/FOB/MASH]
|
||||
|
||||
### Frequently configured options (where to change)
|
||||
|
||||
All of the following live under `CTLD.Config` in `Moose_CTLD.lua` or can be provided in the table passed to `_MOOSE_CTLD:New({...})` in your init script.
|
||||
|
||||
- Logistics rules
|
||||
- `RequirePickupZoneForCrateRequest`: Enforce being near an ACTIVE Supply Zone to request crates
|
||||
- `RequirePickupZoneForTroopLoad`: Enforce being inside a Supply Zone to load troops
|
||||
- `PickupZoneMaxDistance`: Max distance to the nearest ACTIVE zone for crate requests
|
||||
- `ForbidDropsInsidePickupZones`: Block dropping crates inside Supply Zones
|
||||
- `ForbidTroopDeployInsidePickupZones`: Block troop deployment inside Supply Zones
|
||||
- `ForbidChecksActivePickupOnly`: If true, restrictions apply only to ACTIVE zones
|
||||
|
||||
- Building behavior
|
||||
- `BuildRadius`: How far to search for crates around the player when building
|
||||
- `BuildSpawnOffset`: Push spawn a few meters ahead of the aircraft to avoid collisions
|
||||
- `BuildConfirmEnabled` + `BuildConfirmWindowSeconds`: Double-press safety to prevent accidental builds
|
||||
- `BuildCooldownEnabled` + `BuildCooldownSeconds`: Per-group cooldown after a successful build
|
||||
- `RestrictFOBToZones`: When true, FOB-only builds must occur inside an FOB Zone
|
||||
- `AutoBuildFOBInZones`: When true, crates for FOBs inside an FOB Zone can auto-build
|
||||
|
||||
- Inventory system (per-zone stock)
|
||||
- `Inventory.Enabled`: Track stock per Supply Zone and FOB
|
||||
- `Inventory.ShowStockInMenu`: Show counts in menu labels
|
||||
- `Inventory.HideZeroStockMenu`: Enable the special “In Stock Here” menu at nearest zone
|
||||
- `Inventory.FOBStockFactor`: % of initial stock seeded when a new FOB is built
|
||||
|
||||
- Hover & pickup quality-of-life
|
||||
- `HoverCoachConfig`: Message timing and thresholds for the in-game hover guidance
|
||||
- `TroopSpawnOffset`: Spawn troops slightly forward to avoid overlaps
|
||||
|
||||
- AI behavior for Attack builds
|
||||
- `AttackAI.VehicleSearchRadius`: How far spawned vehicles look for enemies when ordered to Attack
|
||||
- `AttackAI.MoveSpeedKmh`: Movement speed for Attack orders
|
||||
|
||||
- MEDEVAC & Salvage system (optional feature)
|
||||
- `MEDEVAC.Enabled`: Master switch for the rescue/salvage system
|
||||
- `MEDEVAC.CrewSurvivalChance`: Per-coalition probability that destroyed vehicle crews survive (0.0-1.0)
|
||||
- `MEDEVAC.ManPadSpawnChance`: Probability crews spawn with MANPADS for self-defense
|
||||
- `MEDEVAC.CrewSpawnDelay`: Seconds after death before crew spawns (allows battle to clear)
|
||||
- `MEDEVAC.CrewTimeout`: Max time for rescue before crew is KIA (default 3600 = 1 hour)
|
||||
- `MEDEVAC.CrewImmortalDuringDelay`: Invulnerability during announcement delay
|
||||
- `MEDEVAC.PopSmokeOnApproach`: Auto-smoke when helos get close (default true)
|
||||
- `MEDEVAC.RespawnOnPickup`: Original vehicle respawns when crew is rescued (default true)
|
||||
- `MEDEVAC.Salvage.Enabled`: Enable salvage points economy
|
||||
- `MEDEVAC.Salvage.AutoApply`: Auto-use salvage for out-of-stock items (default true)
|
||||
- `MEDEVAC.MapMarkers.Enabled`: Create F10 map markers for active MEDEVAC requests
|
||||
- `Zones.MASHZones`: Configure fixed MASH delivery zones (Mobile MASH can be built by players)
|
||||
|
||||
- Menus
|
||||
- `UseGroupMenus`: Per-group F10 menus (recommended)
|
||||
- `UseCategorySubmenus`: Organize Request Crate/Recipe Info by category
|
||||
- `PickupZoneSmokeColor`: Color for crate spawn smoke marks
|
||||
|
||||
### Crate catalog (recipes)
|
||||
|
||||
- Use one of the provided catalogs under `Moose_CTLD_Pure/catalogs/` or your own.
|
||||
- Each entry defines a display label, side, category, stock, and a build function.
|
||||
- Multi-crate “SITE” entries build multi-unit groups (SAM sites or composite systems).
|
||||
- Typical workflow
|
||||
- Load your chosen catalog after `Moose_CTLD.lua`.
|
||||
- Merge it into each CTLD instance you created.
|
||||
|
||||
[screenshot: Request Crate categories]
|
||||
|
||||
### Dual-coalition setup
|
||||
|
||||
- Instantiate two CTLD instances (one per side), each with its own zone names and smoke colors.
|
||||
- Instantiate two FAC modules if you want auto-lase/RECCE for both sides.
|
||||
- The included `init_mission_dual_coalition.lua` shows a minimal working setup.
|
||||
|
||||
### FAC/RECCE (optional, from `Moose_CTLD_FAC.lua`)
|
||||
|
||||
- What it adds
|
||||
- Auto-lase with configurable laser codes, IR markers, map marks
|
||||
- Manual target lists, quick multi-strike helper
|
||||
- Artillery/Naval/Air tasking (HE/illum/mortar, carpet/TALD prompts)
|
||||
- RECCE sweeps: detects and marks units with DMS/MGRS
|
||||
- Player usage
|
||||
- Look for an F10 FAC/RECCE menu in qualifying aircraft or groups
|
||||
- Mission knobs
|
||||
- CoalitionSide, auto-lase behavior, code reservations, marker type/color, and on-station logic are configurable in `Moose_CTLD_FAC.lua` or via `:New()` overrides
|
||||
|
||||
### Sanity checks and troubleshooting
|
||||
|
||||
- Use Admin/Help -> Show CTLD Status to verify counts and toggles quickly.
|
||||
- Draw zones to confirm names/positions match your intent.
|
||||
- If crates don’t spawn: check zone active state, distance to zone, and inventory stock.
|
||||
- If builds don’t trigger: check Build Radius, confirm window, cooldown, and that the crates match the recipe.
|
||||
|
||||
---
|
||||
|
||||
## Screenshot ideas (drop your captures in the placeholders above)
|
||||
|
||||
- CTLD root menu with the five groups (Operations, Logistics, Field Tools, Navigation, Admin/Help)
|
||||
- Request Crate with category submenus visible
|
||||
- Build (Advanced) -> Buildable Near You list
|
||||
- Hover Coach prompt during a near-perfect hover
|
||||
- Vectors message to a crate / pickup zone
|
||||
- Zone drawings on the F10 map (Pickup/Drop/FOB labeled)
|
||||
- In Stock Here list (if enabled)
|
||||
- Example SAM site placed after a build
|
||||
|
||||
---
|
||||
|
||||
## Appendix: File locations and names
|
||||
|
||||
- Main CTLD: `Moose_CTLD_Pure/Moose_CTLD.lua`
|
||||
- FAC/RECCE: `Moose_CTLD_Pure/Moose_CTLD_FAC.lua`
|
||||
- Example dual-coalition init: `Moose_CTLD_Pure/init_mission_dual_coalition.lua`
|
||||
- Catalogs: `Moose_CTLD_Pure/catalogs/`
|
||||
|
||||
No large code is required; most options are cleanly exposed in the config tables. Keep snippets tiny when needed.
|
||||
25
Voice Attack/CTLD_TEST.vap
Normal file
25
Voice Attack/CTLD_TEST.vap
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-16"?>
|
||||
<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<Name>DCS CTLD Menu Navigation</Name>
|
||||
<Id>a8f7c9d2-4e6b-4c1a-9f3e-2a8d7c6b5e4f</Id>
|
||||
<Commands>
|
||||
<Command>
|
||||
<Id>3a7f2b1e-8c4d-4f9a-b2e1-5d6c7a8b9c0d</Id>
|
||||
<CommandString>load troops</CommandString>
|
||||
<ActionSequence>
|
||||
<PressKey>
|
||||
<KeyCodes>{RALT}\{F2}{F1}{F1}</KeyCodes>
|
||||
</PressKey>
|
||||
</ActionSequence>
|
||||
</Command>
|
||||
<Command>
|
||||
<Id>4b8c9d0e-1f2a-3b4c-5d6e-7f8a9b0c1d2e</Id>
|
||||
<CommandString>show status;ctld status;check status</CommandString>
|
||||
<ActionSequence>
|
||||
<PressKey>
|
||||
<KeyCodes>{RALT}\{F5}{F2}</KeyCodes>
|
||||
</PressKey>
|
||||
</ActionSequence>
|
||||
</Command>
|
||||
</Commands>
|
||||
</Profile>
|
||||
266
Voice Attack/CTLD_VoiceAttack_Guide.md
Normal file
266
Voice Attack/CTLD_VoiceAttack_Guide.md
Normal file
@ -0,0 +1,266 @@
|
||||
# DCS CTLD Voice Attack Profile Guide
|
||||
|
||||
## Overview
|
||||
This Voice Attack profile provides voice command navigation for the Moose CTLD (Combat Troop and Logistics Deployment) menu system in DCS World. All commands use direct navigation - saying the command automatically navigates through the entire F10 menu path.
|
||||
|
||||
## Installation
|
||||
|
||||
### 1. Import the Profile
|
||||
1. Open Voice Attack
|
||||
2. Click the wrench icon (Edit Profile)
|
||||
3. Click "Import Profile"
|
||||
4. Navigate to `CTLD_VoiceAttack_Profile.xml`
|
||||
5. Select the profile and click OK
|
||||
|
||||
### 2. DCS Key Binding (No Configuration Needed!)
|
||||
The profile uses **Right Alt + Backslash** (`RAlt + \`) which works in all situations:
|
||||
|
||||
- **On the ground:** Backslash `\` alone opens F10, but `RAlt + \` also works
|
||||
- **In the air:** Only `RAlt + \` works (backslash alone is disabled)
|
||||
|
||||
The profile uses `RAlt + \` for all commands, ensuring compatibility both on ground and in air.
|
||||
|
||||
**No DCS configuration changes needed** - this is the default binding!
|
||||
|
||||
## F10 Key Binding
|
||||
|
||||
### How DCS F10 Menu Works
|
||||
- **On ground:** Backslash `\` key opens F10 menu
|
||||
- **In the air:** `\` is disabled, must use `Right Alt + \`
|
||||
|
||||
### Voice Attack Profile
|
||||
All commands use **`RAlt + \`** which works in both situations:
|
||||
```
|
||||
"load troops" → RAlt + \ + F2 + F1 + F1
|
||||
"build here" → RAlt + \ + F2 + F2 + F1
|
||||
"vectors to pickup" → RAlt + \ + F4 + F2
|
||||
```
|
||||
|
||||
This ensures voice commands work whether you're on the ground or flying!
|
||||
|
||||
## Command Reference
|
||||
|
||||
### OPERATIONS: Troop Transport
|
||||
|
||||
| Voice Command | Action | Menu Path |
|
||||
|--------------|--------|-----------|
|
||||
| "load troops" | Load troops at supply zone | Operations → Troop Transport → Load Troops |
|
||||
| "deploy troops"<br>"deploy hold"<br>"deploy defend" | Deploy troops in defensive posture | Operations → Troop Transport → Deploy [Hold Position] |
|
||||
| "deploy attack"<br>"troops attack" | Deploy troops with attack orders | Operations → Troop Transport → Deploy [Attack] |
|
||||
|
||||
### OPERATIONS: Build
|
||||
|
||||
| Voice Command | Action | Menu Path |
|
||||
|--------------|--------|-----------|
|
||||
| "build here"<br>"build at position" | Build collected crates at location | Operations → Build → Build Here |
|
||||
| "refresh buildable list"<br>"refresh build list" | Update list of buildable items | Operations → Build → Refresh Buildable List |
|
||||
|
||||
### OPERATIONS: MEDEVAC (if enabled)
|
||||
|
||||
| Voice Command | Action | Menu Path |
|
||||
|--------------|--------|-----------|
|
||||
| "list medevac"<br>"active medevac requests" | Show all active MEDEVAC missions | Operations → MEDEVAC → List Active MEDEVAC Requests |
|
||||
| "nearest medevac location"<br>"medevac location" | Show nearest MEDEVAC crew location | Operations → MEDEVAC → Nearest MEDEVAC Location |
|
||||
| "salvage points"<br>"check salvage" | Display coalition salvage points | Operations → MEDEVAC → Coalition Salvage Points |
|
||||
| "vectors to medevac"<br>"medevac vectors" | Get bearing/range to nearest crew | Operations → MEDEVAC → Vectors to Nearest MEDEVAC |
|
||||
| "mash locations"<br>"show mash" | List all MASH zones | Operations → MEDEVAC → MASH Locations |
|
||||
| "smoke crew locations"<br>"mark crews" | Pop smoke at MEDEVAC crew positions | Operations → MEDEVAC → Pop Smoke at Crew Locations |
|
||||
| "smoke mash zones"<br>"mark mash" | Pop smoke at MASH delivery zones | Operations → MEDEVAC → Pop Smoke at MASH Zones |
|
||||
|
||||
### LOGISTICS: Crate Management
|
||||
|
||||
| Voice Command | Action | Menu Path |
|
||||
|--------------|--------|-----------|
|
||||
| "drop one crate"<br>"drop crate" | Drop single loaded crate | Logistics → Crate Management → Drop One Loaded Crate |
|
||||
| "drop all crates"<br>"drop cargo" | Drop all loaded crates | Logistics → Crate Management → Drop All Loaded Crates |
|
||||
| "mark nearest crate"<br>"smoke crate"<br>"remark crate" | Re-mark closest crate with smoke | Logistics → Crate Management → Re-mark Nearest Crate |
|
||||
| "show inventory"<br>"check inventory"<br>"zone inventory" | Display zone inventory | Logistics → Show Inventory at Nearest Zone |
|
||||
|
||||
### FIELD TOOLS
|
||||
|
||||
| Voice Command | Action | Menu Path |
|
||||
|--------------|--------|-----------|
|
||||
| "create drop zone"<br>"mark drop zone" | Create new drop zone at position | Field Tools → Create Drop Zone (AO) |
|
||||
| "smoke green"<br>"green smoke" | Pop green smoke at location | Field Tools → Smoke My Location → Green |
|
||||
| "smoke red"<br>"red smoke" | Pop red smoke at location | Field Tools → Smoke My Location → Red |
|
||||
| "smoke white"<br>"white smoke" | Pop white smoke at location | Field Tools → Smoke My Location → White |
|
||||
| "smoke orange"<br>"orange smoke" | Pop orange smoke at location | Field Tools → Smoke My Location → Orange |
|
||||
| "smoke blue"<br>"blue smoke" | Pop blue smoke at location | Field Tools → Smoke My Location → Blue |
|
||||
|
||||
### NAVIGATION
|
||||
|
||||
| Voice Command | Action | Menu Path |
|
||||
|--------------|--------|-----------|
|
||||
| "vectors to crate"<br>"find crate"<br>"nearest crate" | Get bearing/range to nearest crate | Navigation → Request Vectors to Nearest Crate |
|
||||
| "vectors to pickup"<br>"find pickup zone"<br>"nearest pickup" | Get bearing/range to pickup zone | Navigation → Vectors to Nearest Pickup Zone |
|
||||
| "smoke nearest zone"<br>"mark nearest zone" | Smoke closest zone (any type) | Navigation → Smoke Nearest Zone |
|
||||
| "smoke all zones"<br>"mark all zones"<br>"smoke nearby zones" | Smoke all zones within 5km | Navigation → Smoke All Nearby Zones (5km) |
|
||||
| "vectors to mash"<br>"find mash"<br>"nearest mash" | Get bearing/range to MASH | Navigation → Vectors to Nearest MASH |
|
||||
| "enable hover coach"<br>"hover coach on" | Enable hover pickup guidance | Navigation → Hover Coach: Enable |
|
||||
| "disable hover coach"<br>"hover coach off" | Disable hover pickup guidance | Navigation → Hover Coach: Disable |
|
||||
|
||||
### STATUS & ADMIN
|
||||
|
||||
| Voice Command | Action | Menu Path |
|
||||
|--------------|--------|-----------|
|
||||
| "show status"<br>"ctld status"<br>"check status" | Display CTLD system status | Admin/Help → Show CTLD Status |
|
||||
| "draw zones on map"<br>"show zones"<br>"mark zones on map" | Draw all zones on F10 map | Admin/Help → Draw CTLD Zones on Map |
|
||||
| "clear map drawings"<br>"clear map marks"<br>"remove zone marks" | Remove zone drawings from map | Admin/Help → Clear CTLD Map Drawings |
|
||||
| "medevac statistics"<br>"medevac stats"<br>"show medevac stats" | Display MEDEVAC statistics | Admin/Help → Show MEDEVAC Statistics |
|
||||
|
||||
### QUICK ACCESS COMMANDS
|
||||
|
||||
These are alternate phrases for commonly used functions:
|
||||
|
||||
| Voice Command | Equivalent To |
|
||||
|--------------|---------------|
|
||||
| "quick pickup"<br>"pickup mode" | "load troops" |
|
||||
| "quick deploy"<br>"fast deploy" | "deploy troops" |
|
||||
| "quick build"<br>"fast build" | "build here" |
|
||||
|
||||
## Usage Tips
|
||||
|
||||
### 1. Voice Recognition Accuracy
|
||||
- Speak clearly and at normal volume
|
||||
- Pause briefly between words for best recognition
|
||||
- If a command doesn't work, try an alternate phrase
|
||||
- Train Voice Attack with your voice for better accuracy
|
||||
|
||||
### 2. Menu Navigation Timing
|
||||
- Commands execute instantly with no delays
|
||||
- DCS menu system is fast - no need to wait between commands
|
||||
- If you're in a different menu, the command will navigate from wherever you are
|
||||
|
||||
### 3. Common Workflows
|
||||
|
||||
**Troop Transport Mission:**
|
||||
1. "vectors to pickup" (find supply zone)
|
||||
2. "load troops" (board passengers)
|
||||
3. Fly to destination
|
||||
4. "deploy hold" or "deploy attack" (unload with orders)
|
||||
|
||||
**Crate Logistics Mission:**
|
||||
1. "vectors to pickup" (find supply zone)
|
||||
2. Use manual F10 menu to request specific crates
|
||||
3. "vectors to crate" (find spawned crate)
|
||||
4. Pick up crate
|
||||
5. "build here" (deploy at destination)
|
||||
|
||||
**MEDEVAC Mission:**
|
||||
1. "list medevac" (check active requests)
|
||||
2. "vectors to medevac" (find nearest crew)
|
||||
3. Pick up crew (auto-load when landed nearby)
|
||||
4. "vectors to mash" (find hospital)
|
||||
5. Deploy at MASH (auto-unload)
|
||||
6. "salvage points" (check rewards)
|
||||
|
||||
**Reconnaissance:**
|
||||
1. "smoke all zones" (mark nearby objectives)
|
||||
2. "draw zones on map" (see all zones on F10)
|
||||
3. "vectors to pickup" (return to base)
|
||||
4. "clear map drawings" (clean up map)
|
||||
|
||||
### 4. Combat Situations
|
||||
Voice commands work best when:
|
||||
- ✓ Flying stable (not in combat maneuvers)
|
||||
- ✓ Hands free for flight controls
|
||||
- ✓ Clear of radio chatter/background noise
|
||||
- ✗ Not recommended during combat or emergency procedures
|
||||
|
||||
### 5. Request Crate Limitation
|
||||
**Note:** The profile does NOT include voice commands for requesting specific crate types because:
|
||||
- There are dozens of crate types (vehicles, SAMs, FOBs, etc.)
|
||||
- Categories vary by mission configuration
|
||||
- Manual F10 navigation (F2 → Logistics → Request Crate) is more practical
|
||||
|
||||
Use voice commands for navigation/status, manual F10 for crate requests.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Command Not Recognized
|
||||
1. Check Voice Attack is running and profile is active
|
||||
2. Train Voice Attack with your voice (Tools → Train Profile)
|
||||
3. Try alternate phrases for the command
|
||||
4. Verify microphone input levels
|
||||
|
||||
### Wrong Menu Opens
|
||||
1. Verify DCS is using default key bindings (RAlt + \ for F10)
|
||||
2. Check that backslash key isn't rebound in DCS controls
|
||||
3. Try manual RAlt + \ to verify F10 menu opens
|
||||
|
||||
### Command Works But Menu Doesn't Navigate
|
||||
1. Verify DCS is the active window
|
||||
2. Check F10 menu is not already open
|
||||
3. Ensure no other key bindings conflict with F-keys
|
||||
4. Try manual navigation to verify menu structure matches profile
|
||||
|
||||
### MEDEVAC Commands Not Available
|
||||
- These commands only work if MEDEVAC system is enabled in the mission
|
||||
- Check mission briefing or use "show status" to verify MEDEVAC is active
|
||||
|
||||
## Profile Customization
|
||||
|
||||
### Adding New Commands
|
||||
1. Open Voice Attack profile editor
|
||||
2. Click "New Command"
|
||||
3. Set "When I say" to your phrase
|
||||
4. Add Action: "Send keys to active window"
|
||||
5. Enter key sequence (e.g., `{RALT}{F2}{F1}{F1}`)
|
||||
6. Save command
|
||||
|
||||
### Modifying Existing Commands
|
||||
1. Find command in list
|
||||
2. Click "Edit"
|
||||
3. Modify "When I say" phrases
|
||||
4. Update key sequence if menu structure changed
|
||||
5. Save changes
|
||||
|
||||
### Key Sequence Format
|
||||
- `{RALT}` = Right Alt key
|
||||
- `\\` = Backslash key (escaped in XML)
|
||||
- `{F1}` through `{F9}` = Function keys
|
||||
- Example: `{RALT}\\{F2}{F3}{F1}` = RAlt, \, F2, F3, F1 in sequence
|
||||
|
||||
## Menu Structure Reference
|
||||
|
||||
```
|
||||
CTLD (Root - F2)
|
||||
├── F1: Operations
|
||||
│ ├── F1: Troop Transport
|
||||
│ ├── F2: Build
|
||||
│ └── F3: MEDEVAC
|
||||
├── F2: Logistics
|
||||
│ ├── F1: Request Crate
|
||||
│ ├── F2: Recipe Info
|
||||
│ ├── F3: Crate Management
|
||||
│ └── F4: Show Inventory
|
||||
├── F3: Field Tools
|
||||
├── F4: Navigation
|
||||
└── F5: Admin/Help
|
||||
```
|
||||
|
||||
See full menu tree diagram in main documentation.
|
||||
|
||||
## Version Information
|
||||
|
||||
- **Profile Version:** 1.0
|
||||
- **CTLD Version:** 0.1.0-alpha (Moose_CTLD_Pure)
|
||||
- **Voice Attack Version:** 1.8+ (tested on 1.10)
|
||||
- **DCS Version:** Compatible with current stable/open beta
|
||||
|
||||
## Support & Updates
|
||||
|
||||
If the menu structure changes in future CTLD updates:
|
||||
1. Check `Moose_CTLD.lua` function `BuildGroupMenus()` (around line 2616)
|
||||
2. Update key sequences in Voice Attack profile
|
||||
3. Test each command to verify navigation
|
||||
|
||||
## Credits
|
||||
|
||||
- **CTLD System:** Moose_CTLD_Pure custom implementation
|
||||
- **Voice Attack:** VoiceAttack by VoiceAttack.com
|
||||
- **DCS World:** Eagle Dynamics
|
||||
|
||||
---
|
||||
|
||||
**Happy Flying! 🚁**
|
||||
1138
Voice Attack/CTLD_VoiceAttack_Profile.vap
Normal file
1138
Voice Attack/CTLD_VoiceAttack_Profile.vap
Normal file
File diff suppressed because it is too large
Load Diff
1497
Voice Attack/CTLD_VoiceAttack_Profile_F10.vap
Normal file
1497
Voice Attack/CTLD_VoiceAttack_Profile_F10.vap
Normal file
File diff suppressed because it is too large
Load Diff
587
Voice Attack/CTLD_VoiceAttack_Profile_F10_commands.html
Normal file
587
Voice Attack/CTLD_VoiceAttack_Profile_F10_commands.html
Normal file
@ -0,0 +1,587 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>CTLD VoiceAttack Profile — Command Reference</title>
|
||||
<style>
|
||||
:root {
|
||||
color-scheme: light dark;
|
||||
--bg: #0f141a;
|
||||
--bg-alt: #162029;
|
||||
--fg: #f0f3f6;
|
||||
--fg-muted: #c8d2dd;
|
||||
--accent: #2f8dda;
|
||||
--accent-soft: rgba(47, 141, 218, 0.14);
|
||||
--border: rgba(240, 243, 246, 0.14);
|
||||
--border-strong: rgba(240, 243, 246, 0.28);
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: "Segoe UI", "Roboto", sans-serif;
|
||||
font-size: 15px;
|
||||
line-height: 1.6;
|
||||
background: var(--bg);
|
||||
color: var(--fg);
|
||||
}
|
||||
|
||||
main {
|
||||
margin: 0 auto;
|
||||
padding: 48px 32px 64px;
|
||||
max-width: 1180px;
|
||||
}
|
||||
|
||||
header {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
margin: -48px -32px 36px;
|
||||
padding: 36px 32px 24px;
|
||||
background: linear-gradient(160deg, rgba(47, 141, 218, 0.35), rgba(15, 20, 26, 0.0));
|
||||
border-bottom: 1px solid var(--border);
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0 0 4px;
|
||||
font-size: 30px;
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-top: 44px;
|
||||
margin-bottom: 12px;
|
||||
font-size: 22px;
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
p.lead {
|
||||
margin: 8px 0 16px;
|
||||
color: var(--fg-muted);
|
||||
max-width: 880px;
|
||||
}
|
||||
|
||||
.callout {
|
||||
background: var(--bg-alt);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 12px;
|
||||
padding: 18px 22px;
|
||||
margin-bottom: 28px;
|
||||
box-shadow: 0 16px 32px rgba(0, 0, 0, 0.22);
|
||||
}
|
||||
|
||||
.callout strong {
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
background: var(--bg-alt);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 12px 28px rgba(0, 0, 0, 0.18);
|
||||
}
|
||||
|
||||
thead {
|
||||
background: rgba(47, 141, 218, 0.18);
|
||||
color: var(--fg);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding: 14px 18px;
|
||||
vertical-align: top;
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
tbody tr:last-child td {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
tbody tr:nth-child(odd) {
|
||||
background: rgba(255, 255, 255, 0.02);
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: "Cascadia Code", "Fira Code", monospace;
|
||||
font-size: 13px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
padding: 2px 6px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
ul {
|
||||
padding-left: 22px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.phrases span {
|
||||
display: inline-block;
|
||||
background: var(--accent-soft);
|
||||
color: var(--accent);
|
||||
border: 1px solid rgba(47, 141, 218, 0.35);
|
||||
border-radius: 999px;
|
||||
padding: 4px 12px;
|
||||
margin: 2px 6px 2px 0;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin-top: 64px;
|
||||
font-size: 13px;
|
||||
color: var(--fg-muted);
|
||||
border-top: 1px solid var(--border);
|
||||
padding-top: 18px;
|
||||
}
|
||||
|
||||
@media (max-width: 900px) {
|
||||
main {
|
||||
padding: 36px 18px 48px;
|
||||
}
|
||||
header {
|
||||
margin: -36px -18px 24px;
|
||||
padding: 28px 18px 18px;
|
||||
}
|
||||
table, thead, tbody, th, td, tr {
|
||||
display: block;
|
||||
}
|
||||
thead {
|
||||
display: none;
|
||||
}
|
||||
tbody tr {
|
||||
margin-bottom: 18px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
}
|
||||
td {
|
||||
border: none;
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
td::before {
|
||||
content: attr(data-label);
|
||||
display: block;
|
||||
font-weight: 600;
|
||||
margin-bottom: 6px;
|
||||
color: var(--accent);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
font-size: 11px;
|
||||
}
|
||||
tbody tr:last-child td {
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<header>
|
||||
<h1>CTLD VoiceAttack Command Reference</h1>
|
||||
<p class="lead">All phrases below assume the VoiceAttack profile sends <code>Right Alt + Backslash</code> to open the radio menu, then <code>F10 > F2</code> to enter the CTLD root. Speak any phrase shown to run the navigation sequence automatically.</p>
|
||||
</header>
|
||||
|
||||
<section class="callout">
|
||||
<strong>Pro Tip:</strong> Fine-tune the pause durations inside VoiceAttack if your DCS instance needs more/less time for menus to populate. You can also add your own synonyms by editing the command string list for any entry.
|
||||
</section>
|
||||
|
||||
<h2>Operations — Troop Transport</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Phrases</th>
|
||||
<th scope="col">Action</th>
|
||||
<th scope="col">Menu Path</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>load troops</span>
|
||||
<span>load infantry</span>
|
||||
</td>
|
||||
<td data-label="Action">Load default troop package.</td>
|
||||
<td data-label="Menu Path">Operations → Troop Transport → Load Troops</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>load assault squad</span>
|
||||
<span>load assault team</span>
|
||||
</td>
|
||||
<td data-label="Action">Load Assault Squad preset (AS).</td>
|
||||
<td data-label="Menu Path">Operations → Troop Transport → Load Troops (Type) → Assault Squad</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>load manpads team</span>
|
||||
<span>load aa squad</span>
|
||||
</td>
|
||||
<td data-label="Action">Load MANPADS Team preset (AA).</td>
|
||||
<td data-label="Menu Path">Operations → Troop Transport → Load Troops (Type) → MANPADS Team</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>load anti tank team</span>
|
||||
<span>load at squad</span>
|
||||
</td>
|
||||
<td data-label="Action">Load Anti-Tank Team preset (AT).</td>
|
||||
<td data-label="Menu Path">Operations → Troop Transport → Load Troops (Type) → AT Team</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>load mortar team</span>
|
||||
<span>load mortar squad</span>
|
||||
</td>
|
||||
<td data-label="Action">Load Mortar Team preset (AR).</td>
|
||||
<td data-label="Menu Path">Operations → Troop Transport → Load Troops (Type) → Mortar Team</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>deploy troops hold</span>
|
||||
<span>deploy hold</span>
|
||||
</td>
|
||||
<td data-label="Action">Unload troops with Hold/Defend behavior.</td>
|
||||
<td data-label="Menu Path">Operations → Troop Transport → Deploy [Hold Position]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>deploy troops attack</span>
|
||||
<span>deploy attack</span>
|
||||
</td>
|
||||
<td data-label="Action">Unload troops with Attack/Advance behavior.</td>
|
||||
<td data-label="Menu Path">Operations → Troop Transport → Deploy [Attack]</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>Operations — Build</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Phrases</th>
|
||||
<th scope="col">Action</th>
|
||||
<th scope="col">Menu Path</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>build here</span>
|
||||
<span>build at position</span>
|
||||
</td>
|
||||
<td data-label="Action">Build using nearby crates (with confirm/cooldown rules).</td>
|
||||
<td data-label="Menu Path">Operations → Build → Build Here</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>open build advanced</span>
|
||||
<span>build advanced menu</span>
|
||||
</td>
|
||||
<td data-label="Action">Open the dynamic build menu.</td>
|
||||
<td data-label="Menu Path">Operations → Build → Build (Advanced)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>open buildable near you</span>
|
||||
<span>show buildable list</span>
|
||||
</td>
|
||||
<td data-label="Action">Focus the “Buildable Near You” submenu.</td>
|
||||
<td data-label="Menu Path">Operations → Build → Build (Advanced) → Buildable Near You</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>refresh build list</span>
|
||||
<span>refresh buildable list</span>
|
||||
</td>
|
||||
<td data-label="Action">Rescan crate availability for builds.</td>
|
||||
<td data-label="Menu Path">Operations → Build → Refresh Buildable List</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>Operations — MEDEVAC</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Phrases</th>
|
||||
<th scope="col">Action</th>
|
||||
<th scope="col">Menu Path</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>list medevac requests</span>
|
||||
<span>active medevac</span>
|
||||
</td>
|
||||
<td data-label="Action">Show all active MEDEVAC crews.</td>
|
||||
<td data-label="Menu Path">Operations → MEDEVAC → List Active MEDEVAC Requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>nearest medevac location</span>
|
||||
<span>medevac location</span>
|
||||
</td>
|
||||
<td data-label="Action">Display nearest crew position.</td>
|
||||
<td data-label="Menu Path">Operations → MEDEVAC → Nearest MEDEVAC Location</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>check salvage points</span>
|
||||
<span>show salvage</span>
|
||||
</td>
|
||||
<td data-label="Action">Report coalition salvage totals.</td>
|
||||
<td data-label="Menu Path">Operations → MEDEVAC → Coalition Salvage Points</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>vectors to medevac</span>
|
||||
<span>medevac vectors</span>
|
||||
</td>
|
||||
<td data-label="Action">Provide bearing/range to nearest crew.</td>
|
||||
<td data-label="Menu Path">Operations → MEDEVAC → Vectors to Nearest MEDEVAC</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>show mash locations</span>
|
||||
<span>list mash</span>
|
||||
</td>
|
||||
<td data-label="Action">List all MASH delivery zones.</td>
|
||||
<td data-label="Menu Path">Operations → MEDEVAC → MASH Locations</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>smoke crew locations</span>
|
||||
<span>mark crews</span>
|
||||
</td>
|
||||
<td data-label="Action">Drop smoke on every active crew.</td>
|
||||
<td data-label="Menu Path">Operations → MEDEVAC → Pop Smoke at Crew Locations</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>smoke mash zones</span>
|
||||
<span>mark mash</span>
|
||||
</td>
|
||||
<td data-label="Action">Drop smoke on all MASH zones.</td>
|
||||
<td data-label="Menu Path">Operations → MEDEVAC → Pop Smoke at MASH Zones</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>medevac guide</span>
|
||||
<span>salvage guide</span>
|
||||
</td>
|
||||
<td data-label="Action">Show in-game MEDEVAC/salvage quick reference.</td>
|
||||
<td data-label="Menu Path">Operations → MEDEVAC → MASH & Salvage System – Guide</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>Logistics</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Phrases</th>
|
||||
<th scope="col">Action</th>
|
||||
<th scope="col">Menu Path</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>open request crate</span>
|
||||
<span>request crate menu</span>
|
||||
</td>
|
||||
<td data-label="Action">Open the crate request submenu (choose item manually).</td>
|
||||
<td data-label="Menu Path">Logistics → Request Crate</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>open recipe info</span>
|
||||
<span>recipe info menu</span>
|
||||
</td>
|
||||
<td data-label="Action">Open recipe info submenu.</td>
|
||||
<td data-label="Menu Path">Logistics → Recipe Info</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>drop one crate</span>
|
||||
<span>drop crate</span>
|
||||
</td>
|
||||
<td data-label="Action">Drop a single loaded crate.</td>
|
||||
<td data-label="Menu Path">Logistics → Crate Management → Drop One Loaded Crate</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>drop all crates</span>
|
||||
<span>drop cargo</span>
|
||||
</td>
|
||||
<td data-label="Action">Drop every loaded crate.</td>
|
||||
<td data-label="Menu Path">Logistics → Crate Management → Drop All Loaded Crates</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>remark nearest crate</span>
|
||||
<span>smoke crate</span>
|
||||
</td>
|
||||
<td data-label="Action">Smoke the nearest friendly crate.</td>
|
||||
<td data-label="Menu Path">Logistics → Crate Management → Re-mark Nearest Crate (Smoke)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>show zone inventory</span>
|
||||
<span>check inventory</span>
|
||||
</td>
|
||||
<td data-label="Action">Show stock at nearest supply/FOB zone.</td>
|
||||
<td data-label="Menu Path">Logistics → Show Inventory at Nearest Zone</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>Field Tools</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Phrases</th>
|
||||
<th scope="col">Action</th>
|
||||
<th scope="col">Menu Path</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>create drop zone</span>
|
||||
<span>mark drop zone</span>
|
||||
</td>
|
||||
<td data-label="Action">Create a player drop zone (AO).</td>
|
||||
<td data-label="Menu Path">Field Tools → Create Drop Zone (AO)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>smoke green</span>
|
||||
<span>green smoke</span>
|
||||
</td>
|
||||
<td data-label="Action">Drop green smoke at your position.</td>
|
||||
<td data-label="Menu Path">Field Tools → Smoke My Location → Green</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>smoke red</span>
|
||||
<span>red smoke</span>
|
||||
</td>
|
||||
<td data-label="Action">Drop red smoke at your position.</td>
|
||||
<td data-label="Menu Path">Field Tools → Smoke My Location → Red</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>smoke white</span>
|
||||
<span>white smoke</span>
|
||||
</td>
|
||||
<td data-label="Action">Drop white smoke at your position.</td>
|
||||
<td data-label="Menu Path">Field Tools → Smoke My Location → White</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>smoke orange</span>
|
||||
<span>orange smoke</span>
|
||||
</td>
|
||||
<td data-label="Action">Drop orange smoke at your position.</td>
|
||||
<td data-label="Menu Path">Field Tools → Smoke My Location → Orange</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>smoke blue</span>
|
||||
<span>blue smoke</span>
|
||||
</td>
|
||||
<td data-label="Action">Drop blue smoke at your position.</td>
|
||||
<td data-label="Menu Path">Field Tools → Smoke My Location → Blue</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>Navigation & Hover Coach</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Phrases</th>
|
||||
<th scope="col">Action</th>
|
||||
<th scope="col">Menu Path</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>vectors to crate</span>
|
||||
<span>find crate</span>
|
||||
</td>
|
||||
<td data-label="Action">Show bearing/range to nearest friendly crate.</td>
|
||||
<td data-label="Menu Path">Navigation → Request Vectors to Nearest Crate</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>vectors to pickup zone</span>
|
||||
<span>find pickup zone</span>
|
||||
</td>
|
||||
<td data-label="Action">Show bearing/range to nearest supply zone.</td>
|
||||
<td data-label="Menu Path">Navigation → Vectors to Nearest Pickup Zone</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>smoke nearest zone</span>
|
||||
<span>mark nearest zone</span>
|
||||
</td>
|
||||
<td data-label="Action">Smoke the closest zone (pickup/drop/FOB/MASH).</td>
|
||||
<td data-label="Menu Path">Navigation → Smoke Nearest Zone (Pickup/Drop/FOB/MASH)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>smoke all zones</span>
|
||||
<span>mark all zones</span>
|
||||
</td>
|
||||
<td data-label="Action">Smoke every zone within 5 km.</td>
|
||||
<td data-label="Menu Path">Navigation → Smoke All Nearby Zones (5km)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>vectors to medevac crew</span>
|
||||
<span>find medevac crew</span>
|
||||
</td>
|
||||
<td data-label="Action">Show bearing/range to the nearest crew (shortcut).</td>
|
||||
<td data-label="Menu Path">Navigation → Vectors to Nearest MEDEVAC Crew</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>vectors to mash</span>
|
||||
<span>find mash</span>
|
||||
</td>
|
||||
<td data-label="Action">Show bearing/range to nearest MASH.</td>
|
||||
<td data-label="Menu Path">Navigation → Vectors to Nearest MASH</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>enable hover coach</span>
|
||||
<span>hover coach on</span>
|
||||
</td>
|
||||
<td data-label="Action">Enable hover coach prompts for this group.</td>
|
||||
<td data-label="Menu Path">Navigation → Hover Coach: Enable</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="phrases" data-label="Phrases">
|
||||
<span>disable hover coach</span>
|
||||
<span>hover coach off</span>
|
||||
</td>
|
||||
<td data-label="Action">Disable hover coach prompts for this group.</td>
|
||||
<td data-label="Menu Path">Navigation → Hover Coach: Disable</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<footer>
|
||||
Generated for <code>CTLD_VoiceAttack_Profile_F10.vap</code> (Right Alt + Backslash → F10 → F2). Tweak phrases or delays directly inside VoiceAttack to match your mission's pace.
|
||||
</footer>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
74
Voice Attack/CTLD_VoiceAttack_Profile_Fixed.vap
Normal file
74
Voice Attack/CTLD_VoiceAttack_Profile_Fixed.vap
Normal file
@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="utf-16"?>
|
||||
<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<Name>DCS CTLD Menu Navigation</Name>
|
||||
<Id>a8f7c9d2-4e6b-4c1a-9f3e-2a8d7c6b5e4f</Id>
|
||||
<Commands>
|
||||
<!-- OPERATIONS: TROOP TRANSPORT -->
|
||||
<Command>
|
||||
<CommandString>load troops</CommandString>
|
||||
<ActionSequence>
|
||||
<CommandAction>
|
||||
<Id>3a7f2b1e-8c4d-4f9a-b2e1-5d6c7a8b9c0d</Id>
|
||||
<ActionType>PressKey</ActionType>
|
||||
<Delay>0</Delay>
|
||||
<KeyCodes>
|
||||
<unsignedShort>165</unsignedShort>
|
||||
</KeyCodes>
|
||||
</CommandAction>
|
||||
<CommandAction>
|
||||
<Id>3a7f2b1e-8c4d-4f9a-b2e1-5d6c7a8b9c0e</Id>
|
||||
<ActionType>Pause</ActionType>
|
||||
<Delay>200</Delay>
|
||||
</CommandAction>
|
||||
<CommandAction>
|
||||
<Id>3a7f2b1e-8c4d-4f9a-b2e1-5d6c7a8b9c0f</Id>
|
||||
<ActionType>PressKey</ActionType>
|
||||
<Delay>0</Delay>
|
||||
<KeyCodes>
|
||||
<unsignedShort>220</unsignedShort>
|
||||
</KeyCodes>
|
||||
</CommandAction>
|
||||
<CommandAction>
|
||||
<Id>3a7f2b1e-8c4d-4f9a-b2e1-5d6c7a8b9c10</Id>
|
||||
<ActionType>Pause</ActionType>
|
||||
<Delay>300</Delay>
|
||||
</CommandAction>
|
||||
<CommandAction>
|
||||
<Id>3a7f2b1e-8c4d-4f9a-b2e1-5d6c7a8b9c11</Id>
|
||||
<ActionType>PressKey</ActionType>
|
||||
<Delay>0</Delay>
|
||||
<KeyCodes>
|
||||
<unsignedShort>113</unsignedShort>
|
||||
</KeyCodes>
|
||||
</CommandAction>
|
||||
<CommandAction>
|
||||
<Id>3a7f2b1e-8c4d-4f9a-b2e1-5d6c7a8b9c12</Id>
|
||||
<ActionType>Pause</ActionType>
|
||||
<Delay>300</Delay>
|
||||
</CommandAction>
|
||||
<CommandAction>
|
||||
<Id>3a7f2b1e-8c4d-4f9a-b2e1-5d6c7a8b9c13</Id>
|
||||
<ActionType>PressKey</ActionType>
|
||||
<Delay>0</Delay>
|
||||
<KeyCodes>
|
||||
<unsignedShort>112</unsignedShort>
|
||||
</KeyCodes>
|
||||
</CommandAction>
|
||||
<CommandAction>
|
||||
<Id>3a7f2b1e-8c4d-4f9a-b2e1-5d6c7a8b9c14</Id>
|
||||
<ActionType>Pause</ActionType>
|
||||
<Delay>300</Delay>
|
||||
</CommandAction>
|
||||
<CommandAction>
|
||||
<Id>3a7f2b1e-8c4d-4f9a-b2e1-5d6c7a8b9c15</Id>
|
||||
<ActionType>PressKey</ActionType>
|
||||
<Delay>0</Delay>
|
||||
<KeyCodes>
|
||||
<unsignedShort>112</unsignedShort>
|
||||
</KeyCodes>
|
||||
</CommandAction>
|
||||
</ActionSequence>
|
||||
<Id>3a7f2b1e-8c4d-4f9a-b2e1-5d6c7a8b9c0d</Id>
|
||||
</Command>
|
||||
</Commands>
|
||||
</Profile>
|
||||
174
Voice Attack/CTLD_VoiceAttack_QuickRef.md
Normal file
174
Voice Attack/CTLD_VoiceAttack_QuickRef.md
Normal file
@ -0,0 +1,174 @@
|
||||
# CTLD Voice Attack - Quick Reference Card
|
||||
|
||||
## Essential Commands (Most Used)
|
||||
|
||||
### Troop Operations
|
||||
```
|
||||
"load troops" → Load troops at supply zone
|
||||
"deploy hold" → Deploy troops (defensive)
|
||||
"deploy attack" → Deploy troops (offensive)
|
||||
```
|
||||
|
||||
### Logistics
|
||||
```
|
||||
"build here" → Build crates at position
|
||||
"drop all crates" → Drop all loaded cargo
|
||||
"show inventory" → Check zone stock
|
||||
```
|
||||
|
||||
### Navigation
|
||||
```
|
||||
"vectors to pickup" → Find supply zone
|
||||
"vectors to crate" → Find dropped crate
|
||||
"smoke nearest zone" → Mark closest zone
|
||||
```
|
||||
|
||||
### MEDEVAC (if enabled)
|
||||
```
|
||||
"list medevac" → Show active requests
|
||||
"vectors to medevac" → Find crew
|
||||
"vectors to mash" → Find hospital
|
||||
"salvage points" → Check rewards
|
||||
```
|
||||
|
||||
### Status
|
||||
```
|
||||
"show status" → CTLD system status
|
||||
"hover coach on/off" → Toggle pickup guidance
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Full Command List
|
||||
|
||||
### OPERATIONS
|
||||
| Command | Action |
|
||||
|---------|--------|
|
||||
| load troops | Board passengers |
|
||||
| deploy hold / deploy defend | Unload defensive |
|
||||
| deploy attack / troops attack | Unload offensive |
|
||||
| build here / build at position | Build collected crates |
|
||||
| refresh buildable list | Update build options |
|
||||
|
||||
### MEDEVAC (if enabled)
|
||||
| Command | Action |
|
||||
|---------|--------|
|
||||
| list medevac / active medevac requests | List all missions |
|
||||
| nearest medevac location | Find closest crew |
|
||||
| salvage points / check salvage | Show points |
|
||||
| vectors to medevac / medevac vectors | Bearing to crew |
|
||||
| mash locations / show mash | List hospitals |
|
||||
| smoke crew locations / mark crews | Mark crews |
|
||||
| smoke mash zones / mark mash | Mark hospitals |
|
||||
|
||||
### LOGISTICS
|
||||
| Command | Action |
|
||||
|---------|--------|
|
||||
| drop one crate / drop crate | Drop single crate |
|
||||
| drop all crates / drop cargo | Drop all crates |
|
||||
| mark nearest crate / smoke crate | Re-mark crate |
|
||||
| show inventory / check inventory | Zone stock |
|
||||
|
||||
### FIELD TOOLS
|
||||
| Command | Action |
|
||||
|---------|--------|
|
||||
| create drop zone / mark drop zone | New drop zone |
|
||||
| smoke green / green smoke | Green smoke |
|
||||
| smoke red / red smoke | Red smoke |
|
||||
| smoke white / white smoke | White smoke |
|
||||
| smoke orange / orange smoke | Orange smoke |
|
||||
| smoke blue / blue smoke | Blue smoke |
|
||||
|
||||
### NAVIGATION
|
||||
| Command | Action |
|
||||
|---------|--------|
|
||||
| vectors to crate / find crate | Find crate |
|
||||
| vectors to pickup / find pickup zone | Find supply |
|
||||
| smoke nearest zone / mark nearest zone | Mark nearest |
|
||||
| smoke all zones / smoke nearby zones | Mark all <5km |
|
||||
| vectors to mash / find mash | Find MASH |
|
||||
| enable hover coach / hover coach on | Coach ON |
|
||||
| disable hover coach / hover coach off | Coach OFF |
|
||||
|
||||
### STATUS & ADMIN
|
||||
| Command | Action |
|
||||
|---------|--------|
|
||||
| show status / ctld status | System status |
|
||||
| draw zones on map / show zones | Draw zones |
|
||||
| clear map drawings | Clear drawings |
|
||||
| medevac statistics / medevac stats | MEDEVAC stats |
|
||||
|
||||
### QUICK ACCESS
|
||||
| Command | Same As |
|
||||
|---------|---------|
|
||||
| quick pickup / pickup mode | load troops |
|
||||
| quick deploy / fast deploy | deploy hold |
|
||||
| quick build / fast build | build here |
|
||||
|
||||
---
|
||||
|
||||
## F10 Key Binding
|
||||
|
||||
**DCS Default (No config needed):**
|
||||
- On ground: `\` key opens F10
|
||||
- In air: `RAlt + \` required (backslash alone disabled)
|
||||
|
||||
**Voice Attack Profile:**
|
||||
- All commands use `RAlt + \` (works everywhere)
|
||||
- Example: "load troops" → **RAlt \ F2 F1 F1**
|
||||
|
||||
---
|
||||
|
||||
## Common Workflows
|
||||
|
||||
### Troop Transport
|
||||
1. "vectors to pickup"
|
||||
2. "load troops"
|
||||
3. Fly to LZ
|
||||
4. "deploy hold" or "deploy attack"
|
||||
|
||||
### Crate Delivery
|
||||
1. "vectors to pickup"
|
||||
2. Request crates (manual F10)
|
||||
3. "vectors to crate"
|
||||
4. Pick up & deliver
|
||||
5. "build here"
|
||||
|
||||
### MEDEVAC
|
||||
1. "list medevac"
|
||||
2. "vectors to medevac"
|
||||
3. Land near crew (auto-load)
|
||||
4. "vectors to mash"
|
||||
5. Land at MASH (auto-unload)
|
||||
6. "salvage points"
|
||||
|
||||
### Zone Recon
|
||||
1. "smoke all zones" (mark <5km)
|
||||
2. "draw zones on map" (F10 view)
|
||||
3. "vectors to pickup" (navigate)
|
||||
4. "clear map drawings" (cleanup)
|
||||
|
||||
---
|
||||
|
||||
## Tips
|
||||
✓ Speak clearly at normal volume
|
||||
✓ Use alternate phrases if not recognized
|
||||
✓ Train Voice Attack with your voice
|
||||
✓ Best when flying stable, not in combat
|
||||
✗ Don't use for crate requests (too many types)
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
- **Not recognized:** Train profile, try alternate phrase
|
||||
- **Wrong menu:** Check F10 key (RAlt vs slash)
|
||||
- **Doesn't navigate:** DCS must be active window
|
||||
- **MEDEVAC missing:** System not enabled in mission
|
||||
|
||||
---
|
||||
|
||||
**Print this card for cockpit reference!**
|
||||
|
||||
Profile: CTLD_VoiceAttack_Profile.xml
|
||||
Guide: CTLD_VoiceAttack_Guide.md
|
||||
CTLD Version: 0.1.0-alpha
|
||||
283
Voice Attack/README_VoiceAttack.md
Normal file
283
Voice Attack/README_VoiceAttack.md
Normal file
@ -0,0 +1,283 @@
|
||||
# CTLD Voice Attack Integration
|
||||
|
||||
This directory contains a complete Voice Attack profile for hands-free navigation of the Moose CTLD (Combat Troop and Logistics Deployment) menu system in DCS World.
|
||||
|
||||
## Files in This Package
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| **CTLD_VoiceAttack_Profile.xml** | Voice Attack profile (import this) |
|
||||
| **CTLD_VoiceAttack_Guide.md** | Complete user guide with all commands |
|
||||
| **CTLD_VoiceAttack_QuickRef.md** | Quick reference card (print for cockpit) |
|
||||
| **CTLD_Menu_Structure.md** | Full F10 menu tree diagram |
|
||||
| **Moose_CTLD.lua** | Source CTLD system (menu structure defined here) |
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Install
|
||||
1. Open Voice Attack
|
||||
2. Import `CTLD_VoiceAttack_Profile.xml`
|
||||
3. Activate the profile
|
||||
|
||||
### 2. F10 Key Binding (Already Configured!)
|
||||
|
||||
**DCS Default Behavior:**
|
||||
- On ground: `\` (backslash) opens F10 menu
|
||||
- In air: `RAlt + \` required (backslash alone disabled)
|
||||
|
||||
**Voice Attack Profile:**
|
||||
- Uses `RAlt + \` for all commands
|
||||
- Works both on ground and in air
|
||||
- **No DCS configuration needed!**
|
||||
|
||||
### 3. Test
|
||||
In DCS, say: **"show status"**
|
||||
- Should open: F10 → CTLD → Admin/Help → Show CTLD Status
|
||||
|
||||
## Most Useful Commands
|
||||
|
||||
```
|
||||
"load troops" → Load passengers
|
||||
"deploy hold" → Unload defensive
|
||||
"build here" → Build crates
|
||||
"drop all crates" → Drop cargo
|
||||
"vectors to pickup" → Find supply zone
|
||||
"vectors to crate" → Find crate
|
||||
"smoke nearest zone" → Mark zone
|
||||
"show status" → System info
|
||||
```
|
||||
|
||||
## Command Categories
|
||||
|
||||
- **Troop Operations:** Load, deploy (defensive/offensive)
|
||||
- **Build Operations:** Build here, refresh list
|
||||
- **MEDEVAC:** List requests, vectors, MASH locations, salvage points
|
||||
- **Logistics:** Drop crates, re-mark crate, check inventory
|
||||
- **Navigation:** Vectors to zones/crates/MASH, smoke zones
|
||||
- **Field Tools:** Create drop zone, smoke colors
|
||||
- **Status:** Show status, draw zones, statistics
|
||||
|
||||
See `CTLD_VoiceAttack_Guide.md` for complete command list.
|
||||
|
||||
## Documentation
|
||||
|
||||
### For New Users
|
||||
Start here: **CTLD_VoiceAttack_Guide.md**
|
||||
- Installation instructions
|
||||
- All commands with examples
|
||||
- Common workflows
|
||||
- Troubleshooting
|
||||
|
||||
### For Flying
|
||||
Print this: **CTLD_VoiceAttack_QuickRef.md**
|
||||
- One-page command list
|
||||
- Essential workflows
|
||||
- Tips for in-flight use
|
||||
|
||||
### For Developers
|
||||
Reference: **CTLD_Menu_Structure.md**
|
||||
- Complete F10 menu tree
|
||||
- Key path tables
|
||||
- Menu behavior notes
|
||||
- Source code references
|
||||
|
||||
## How It Works
|
||||
|
||||
### Direct Navigation
|
||||
All commands use **direct navigation** - one voice command executes the entire menu path:
|
||||
|
||||
```
|
||||
Say: "load troops"
|
||||
Sends: RAlt + \ + F2 + F1 + F1
|
||||
Result: Operations → Troop Transport → Load Troops
|
||||
```
|
||||
|
||||
No step-by-step navigation, no waiting between keys.
|
||||
|
||||
### No TTS Feedback
|
||||
Commands execute silently - DCS provides on-screen feedback.
|
||||
|
||||
### All Non-Admin Functions Included
|
||||
Profile includes:
|
||||
- ✓ All operational commands
|
||||
- ✓ All status/info commands
|
||||
- ✓ Navigation and smoke
|
||||
- ✓ MEDEVAC operations
|
||||
- ✗ Specific crate requests (too many types - use manual F10)
|
||||
- ✗ Debug/admin functions (intentionally excluded)
|
||||
|
||||
## Voice Attack Tips
|
||||
|
||||
### Improve Recognition
|
||||
1. Train profile with your voice (Tools → Train Profile)
|
||||
2. Speak clearly at normal volume
|
||||
3. Use alternate phrases if not recognized
|
||||
4. Reduce background noise
|
||||
|
||||
### Best Practices
|
||||
- ✓ Use during stable flight
|
||||
- ✓ Keep hands free for controls
|
||||
- ✓ Combine with manual F10 for crate requests
|
||||
- ✗ Don't use during combat maneuvers
|
||||
- ✗ Don't use during emergency procedures
|
||||
|
||||
## Menu Structure Overview
|
||||
|
||||
```
|
||||
CTLD (F2)
|
||||
├── Operations (F1)
|
||||
│ ├── Troop Transport
|
||||
│ ├── Build
|
||||
│ └── MEDEVAC
|
||||
├── Logistics (F2)
|
||||
│ ├── Request Crate
|
||||
│ ├── Recipe Info
|
||||
│ ├── Crate Management
|
||||
│ └── Show Inventory
|
||||
├── Field Tools (F3)
|
||||
├── Navigation (F4)
|
||||
└── Admin/Help (F5)
|
||||
```
|
||||
|
||||
Full structure: `CTLD_Menu_Structure.md`
|
||||
|
||||
## Limitations
|
||||
|
||||
### Not Included
|
||||
1. **Crate Requests:** Too many types (dozens of vehicles, SAMs, etc.)
|
||||
- Use manual F10: CTLD → Logistics → Request Crate
|
||||
|
||||
2. **Typed Troop Loading:** Submenu with 4+ troop types
|
||||
- Use manual F10: CTLD → Operations → Troop Transport → Load Troops (Type)
|
||||
|
||||
3. **Advanced Build Menu:** Dynamic list of buildable items
|
||||
- Use manual F10: CTLD → Operations → Build → Build (Advanced)
|
||||
|
||||
4. **Debug Commands:** Admin logging controls
|
||||
- Not needed for normal operations
|
||||
|
||||
### Why These Are Excluded
|
||||
- **Crate requests:** Mission-specific, too many variations
|
||||
- **Typed troops:** Rare use case, 4+ submenu items
|
||||
- **Advanced build:** Dynamic content, better with manual selection
|
||||
- **Debug:** Admin-only, not for regular flight ops
|
||||
|
||||
Use voice commands for quick actions, manual F10 for detailed selections.
|
||||
|
||||
## Compatibility
|
||||
|
||||
- **CTLD Version:** 0.1.0-alpha (Moose_CTLD_Pure)
|
||||
- **Voice Attack:** 1.8+ (tested on 1.10)
|
||||
- **DCS World:** Current stable/open beta
|
||||
- **Menu Type:** Per-player (MENU_GROUP)
|
||||
|
||||
## Customization
|
||||
|
||||
### Add New Commands
|
||||
1. Open profile in Voice Attack
|
||||
2. Study menu structure: `CTLD_Menu_Structure.md`
|
||||
3. Create command with key sequence
|
||||
4. Test in DCS
|
||||
|
||||
### Update for Menu Changes
|
||||
1. Check `Moose_CTLD.lua` function `BuildGroupMenus()` (~line 2616)
|
||||
2. Update key sequences in Voice Attack
|
||||
3. Update documentation files
|
||||
4. Test all modified commands
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Problem | Solution |
|
||||
|---------|----------|
|
||||
| Command not recognized | Train profile, try alternate phrase |
|
||||
| Wrong menu opens | Verify DCS default binding (RAlt + \), check Controls settings |
|
||||
| Menu doesn't navigate | DCS must be active window, F10 not already open |
|
||||
| MEDEVAC missing | System not enabled in mission |
|
||||
| Works on ground but not in air | Expected! Profile uses RAlt + \ (works in air) |
|
||||
|
||||
Full troubleshooting: `CTLD_VoiceAttack_Guide.md`
|
||||
|
||||
## Examples
|
||||
|
||||
### Troop Transport Mission
|
||||
```
|
||||
1. Say: "vectors to pickup" → Find supply zone
|
||||
2. Fly to zone
|
||||
3. Say: "load troops" → Board passengers
|
||||
4. Fly to LZ
|
||||
5. Say: "deploy hold" → Unload defensive
|
||||
```
|
||||
|
||||
### Crate Logistics Mission
|
||||
```
|
||||
1. Say: "vectors to pickup" → Find supply zone
|
||||
2. Manual F10 to request crates → (Too many types for voice)
|
||||
3. Say: "vectors to crate" → Find spawned crate
|
||||
4. Pick up and fly to target
|
||||
5. Say: "build here" → Deploy at destination
|
||||
```
|
||||
|
||||
### MEDEVAC Mission
|
||||
```
|
||||
1. Say: "list medevac" → Check active requests
|
||||
2. Say: "vectors to medevac" → Find nearest crew
|
||||
3. Land nearby (auto-load)
|
||||
4. Say: "vectors to mash" → Find hospital
|
||||
5. Land at MASH (auto-unload)
|
||||
6. Say: "salvage points" → Check rewards
|
||||
```
|
||||
|
||||
### Reconnaissance
|
||||
```
|
||||
1. Say: "smoke all zones" → Mark nearby zones
|
||||
2. Say: "draw zones on map" → See all zones on F10
|
||||
3. Manual F10 map navigation
|
||||
4. Say: "clear map drawings" → Clean up
|
||||
```
|
||||
|
||||
More workflows: `CTLD_VoiceAttack_Guide.md`
|
||||
|
||||
## Support
|
||||
|
||||
### If Menu Structure Changes
|
||||
Menu structure is defined in `Moose_CTLD.lua`:
|
||||
- Function: `CTLD:BuildGroupMenus(group)`
|
||||
- Line: ~2616
|
||||
|
||||
Compare with `CTLD_Menu_Structure.md` to identify changes.
|
||||
|
||||
### Profile Updates
|
||||
1. Check code for menu changes
|
||||
2. Update Voice Attack key sequences
|
||||
3. Update documentation
|
||||
4. Test all commands
|
||||
|
||||
### Help Resources
|
||||
- CTLD source code: `Moose_CTLD.lua`
|
||||
- Menu diagram: `CTLD_Menu_Structure.md`
|
||||
- Full guide: `CTLD_VoiceAttack_Guide.md`
|
||||
- Quick ref: `CTLD_VoiceAttack_QuickRef.md`
|
||||
|
||||
## Version History
|
||||
|
||||
### Version 1.0 (Current)
|
||||
- Initial release
|
||||
- 40+ voice commands
|
||||
- Direct navigation (no step-by-step)
|
||||
- No TTS feedback
|
||||
- Supports RAlt or slash key for F10
|
||||
- All non-admin functions included
|
||||
- Comprehensive documentation
|
||||
|
||||
## Credits
|
||||
|
||||
- **CTLD System:** Moose_CTLD_Pure custom implementation
|
||||
- **Voice Attack:** VoiceAttack by VoiceAttack.com
|
||||
- **DCS World:** Eagle Dynamics
|
||||
- **MOOSE Framework:** FlightControl-Master
|
||||
|
||||
---
|
||||
|
||||
**Ready to fly hands-free? Import the profile and start with "show status"!**
|
||||
|
||||
Questions? See `CTLD_VoiceAttack_Guide.md` for detailed help.
|
||||
334
catalogs/Moose_CTLD_Catalog.lua
Normal file
334
catalogs/Moose_CTLD_Catalog.lua
Normal file
@ -0,0 +1,334 @@
|
||||
-- CrateCatalog_CTLD_Extract.lua
|
||||
-- Auto-generated from CTLD.lua (Operation_Polar_Shield) spawnableCrates config
|
||||
-- Returns a table of crate definitions suitable for CTLD:MergeCatalog()
|
||||
-- Notes:
|
||||
-- - Each entry has keys: description/menu, dcsCargoType, required or requires (composite), side, category, build(point, headingDeg)
|
||||
-- - Single-unit entries spawn one unit by DCS type. Composite "SITE" entries spawn a multi-unit group approximating system components.
|
||||
|
||||
local function singleUnit(unitType)
|
||||
return function(point, headingDeg)
|
||||
local name = string.format('%s-%d', unitType, math.random(100000,999999))
|
||||
local hdg = math.rad(headingDeg or 0)
|
||||
return {
|
||||
visible=false, lateActivation=false, tasks={}, task='Ground Nothing', route={},
|
||||
units={ { type=unitType, name=name, x=point.x, y=point.z, heading=hdg } },
|
||||
name = 'CTLD_'..name
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
-- Build a single AIR unit that spawns in the air at a configured altitude/speed.
|
||||
-- Falls back gracefully to singleUnit behavior if config is unavailable/disabled.
|
||||
local function singleAirUnit(unitType)
|
||||
return function(point, headingDeg)
|
||||
local cfg = (rawget(_G, 'CTLD') and CTLD.Config and CTLD.Config.DroneAirSpawn) or nil
|
||||
if not cfg or cfg.Enabled == false then
|
||||
return singleUnit(unitType)(point, headingDeg)
|
||||
end
|
||||
|
||||
local name = string.format('%s-%d', unitType, math.random(100000,999999))
|
||||
local hdgDeg = headingDeg or 0
|
||||
local hdg = math.rad(hdgDeg)
|
||||
local alt = tonumber(cfg.AltitudeMeters) or 1200
|
||||
local spd = tonumber(cfg.SpeedMps) or 120
|
||||
|
||||
-- Create a tiny 2-point route to ensure forward flight at the chosen altitude.
|
||||
local function fwdOffset(px, pz, meters, headingRadians)
|
||||
return px + math.sin(headingRadians) * meters, pz + math.cos(headingRadians) * meters
|
||||
end
|
||||
local p1x, p1z = point.x, point.z
|
||||
local p2x, p2z = fwdOffset(point.x, point.z, 1000, hdg) -- 1 km ahead
|
||||
|
||||
local group = {
|
||||
visible=false,
|
||||
lateActivation=false,
|
||||
tasks={},
|
||||
task='CAS',
|
||||
route={
|
||||
points={
|
||||
{
|
||||
alt = alt, alt_type = 'BARO',
|
||||
type = 'Turning Point', action = 'Turning Point',
|
||||
x = p1x, y = p1z,
|
||||
speed = spd, ETA = 0, ETA_locked = false,
|
||||
task = {}
|
||||
},
|
||||
{
|
||||
alt = alt, alt_type = 'BARO',
|
||||
type = 'Turning Point', action = 'Turning Point',
|
||||
x = p2x, y = p2z,
|
||||
speed = spd, ETA = 0, ETA_locked = false,
|
||||
task = {}
|
||||
}
|
||||
}
|
||||
},
|
||||
units={
|
||||
{
|
||||
type=unitType, name=name,
|
||||
x=p1x, y=p1z,
|
||||
heading=hdg,
|
||||
speed = spd,
|
||||
alt = alt, alt_type = 'BARO'
|
||||
}
|
||||
},
|
||||
name = 'CTLD_'..name
|
||||
}
|
||||
return group
|
||||
end
|
||||
end
|
||||
|
||||
local function multiUnits(units)
|
||||
-- units: array of { type, dx, dz }
|
||||
return function(point, headingDeg)
|
||||
local hdg = math.rad(headingDeg or 0)
|
||||
local function off(dx, dz) return { x = point.x + dx, z = point.z + dz } end
|
||||
local list = {}
|
||||
for i,u in ipairs(units) do
|
||||
local p = off(u.dx or 0, u.dz or 3*i)
|
||||
table.insert(list, {
|
||||
type = u.type, name = string.format('CTLD-%s-%d', u.type, math.random(100000,999999)),
|
||||
x = p.x, y = p.z, heading = hdg
|
||||
})
|
||||
end
|
||||
return { visible=false, lateActivation=false, tasks={}, task='Ground Nothing', route={}, units=list, name=string.format('CTLD_SITE_%d', math.random(100000,999999)) }
|
||||
end
|
||||
end
|
||||
|
||||
local BLUE = coalition.side.BLUE
|
||||
local RED = coalition.side.RED
|
||||
|
||||
local cat = {}
|
||||
|
||||
cat['BLUE_M1128_STRYKER_MGS_CRATE'] = { hidden=true, description='M1128 Stryker MGS crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M1128_STRYKER_MGS'] = { menuCategory='Combat Vehicles', menu='M1128 Stryker MGS', description='M1128 Stryker MGS', dcsCargoType='container_cargo', requires={ BLUE_M1128_STRYKER_MGS_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1128 Stryker MGS'), unitType='M1128 Stryker MGS', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['BLUE_M60A3_PATTON_CRATE'] = { hidden=true, description='M-60A3 Patton crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M60A3_PATTON'] = { menuCategory='Combat Vehicles', menu='M-60A3 Patton', description='M-60A3 Patton', dcsCargoType='container_cargo', requires={ BLUE_M60A3_PATTON_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M-60'), unitType='M-60', MEDEVAC=true, salvageValue=3, crewSize=4 }
|
||||
cat['BLUE_HMMWV_TOW_CRATE'] = { hidden=true, description='Humvee - TOW crate', dcsCargoType='container_cargo', required=1, initialStock=36, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_HMMWV_TOW'] = { menuCategory='Combat Vehicles', menu='Humvee - TOW', description='Humvee - TOW', dcsCargoType='container_cargo', requires={ BLUE_HMMWV_TOW_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1045 HMMWV TOW'), unitType='M1045 HMMWV TOW', MEDEVAC=true, salvageValue=3, crewSize=2 }
|
||||
cat['BLUE_M1134_STRYKER_ATGM_CRATE']= { hidden=true, description='M1134 Stryker ATGM crate', dcsCargoType='container_cargo', required=1, initialStock=24, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M1134_STRYKER_ATGM'] = { menuCategory='Combat Vehicles', menu='M1134 Stryker ATGM', description='M1134 Stryker ATGM', dcsCargoType='container_cargo', requires={ BLUE_M1134_STRYKER_ATGM_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1134 Stryker ATGM'), unitType='M1134 Stryker ATGM', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['BLUE_LAV25_CRATE'] = { hidden=true, description='LAV-25 crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_LAV25'] = { menuCategory='Combat Vehicles', menu='LAV-25', description='LAV-25', dcsCargoType='container_cargo', requires={ BLUE_LAV25_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('LAV-25'), unitType='LAV-25', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['BLUE_M2A2_BRADLEY_CRATE'] = { hidden=true, description='M2A2 Bradley crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M2A2_BRADLEY'] = { menuCategory='Combat Vehicles', menu='M2A2 Bradley', description='M2A2 Bradley', dcsCargoType='container_cargo', requires={ BLUE_M2A2_BRADLEY_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M-2 Bradley'), unitType='M-2 Bradley', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['BLUE_VAB_MEPHISTO_CRATE'] = { hidden=true, description='ATGM VAB Mephisto crate', dcsCargoType='container_cargo', required=1, initialStock=24, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_VAB_MEPHISTO'] = { menuCategory='Combat Vehicles', menu='ATGM VAB Mephisto', description='ATGM VAB Mephisto', dcsCargoType='container_cargo', requires={ BLUE_VAB_MEPHISTO_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('VAB_Mephisto'), unitType='VAB_Mephisto', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['BLUE_M1A2C_ABRAMS_CRATE'] = { hidden=true, description='M1A2C Abrams crate', dcsCargoType='container_cargo', required=1, initialStock=24, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M1A2C_ABRAMS'] = { menuCategory='Combat Vehicles', menu='M1A2C Abrams', description='M1A2C Abrams', dcsCargoType='container_cargo', requires={ BLUE_M1A2C_ABRAMS_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1A2C_SEP_V3'), unitType='M1A2C_SEP_V3', MEDEVAC=true, salvageValue=3, crewSize=4 }
|
||||
|
||||
-- Combat Vehicles (RED)
|
||||
cat['RED_BTR82A_CRATE'] = { hidden=true, description='BTR-82A crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BTR82A'] = { menuCategory='Combat Vehicles', menu='BTR-82A', description='BTR-82A', dcsCargoType='container_cargo', requires={ RED_BTR82A_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BTR-82A'), unitType='BTR-82A', MEDEVAC=true, salvageValue=2, crewSize=3 }
|
||||
cat['RED_BRDM2_CRATE'] = { hidden=true, description='BRDM-2 crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BRDM2'] = { menuCategory='Combat Vehicles', menu='BRDM-2', description='BRDM-2', dcsCargoType='container_cargo', requires={ RED_BRDM2_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BRDM-2'), unitType='BRDM-2', MEDEVAC=true, salvageValue=2, crewSize=2 }
|
||||
cat['RED_BMP3_CRATE'] = { hidden=true, description='BMP-3 crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BMP3'] = { menuCategory='Combat Vehicles', menu='BMP-3', description='BMP-3', dcsCargoType='container_cargo', requires={ RED_BMP3_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BMP-3'), unitType='BMP-3', MEDEVAC=true, salvageValue=2, crewSize=3 }
|
||||
cat['RED_BMP2_CRATE'] = { hidden=true, description='BMP-2 crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BMP2'] = { menuCategory='Combat Vehicles', menu='BMP-2', description='BMP-2', dcsCargoType='container_cargo', requires={ RED_BMP2_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BMP-2'), unitType='BMP-2', MEDEVAC=true, salvageValue=2, crewSize=3 }
|
||||
cat['RED_BTR80_CRATE'] = { hidden=true, description='BTR-80 crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BTR80'] = { menuCategory='Combat Vehicles', menu='BTR-80', description='BTR-80', dcsCargoType='container_cargo', requires={ RED_BTR80_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BTR-80'), unitType='BTR-80', MEDEVAC=true, salvageValue=2, crewSize=3 }
|
||||
cat['RED_T72B3_CRATE'] = { hidden=true, description='T-72B3 crate', dcsCargoType='container_cargo', required=1, initialStock=24, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_T72B3'] = { menuCategory='Combat Vehicles', menu='T-72B3', description='T-72B3', dcsCargoType='container_cargo', requires={ RED_T72B3_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('T-72B3'), unitType='T-72B3', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['RED_T90M_CRATE'] = { hidden=true, description='T-90M crate', dcsCargoType='container_cargo', required=1, initialStock=24, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_T90M'] = { menuCategory='Combat Vehicles', menu='T-90M', description='T-90M', dcsCargoType='container_cargo', requires={ RED_T90M_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('CHAP_T90M'), unitType='CHAP_T90M', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
|
||||
-- Support (BLUE)
|
||||
cat['BLUE_MRAP_JTAC'] = { menuCategory='Support', menu='MRAP - JTAC', description='JTAC MRAP', dcsCargoType='container_cargo', required=1, initialStock=12, side=BLUE, category=Group.Category.GROUND, build=singleUnit('MaxxPro_MRAP'), MEDEVAC=true, salvageValue=1, crewSize=4, roles={'JTAC'}, jtac={ platform='ground' } }
|
||||
cat['BLUE_M818_AMMO'] = { menuCategory='Support', menu='M-818 Ammo Truck', description='M-818 Ammo Truck', dcsCargoType='container_cargo', required=1, initialStock=12, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M 818'), salvageValue=1, crewSize=2 }
|
||||
cat['BLUE_M978_TANKER'] = { menuCategory='Support', menu='M-978 Tanker', description='M-978 Tanker', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M978 HEMTT Tanker'), salvageValue=1, crewSize=2 }
|
||||
cat['BLUE_EWR_FPS117'] = { menuCategory='Support', menu='EWR Radar FPS-117', description='EWR Radar FPS-117', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, build=singleUnit('FPS-117'), salvageValue=1, crewSize=3 }
|
||||
|
||||
-- Support (RED)
|
||||
cat['RED_TIGR_JTAC'] = { menuCategory='Support', menu='Tigr - JTAC', description='JTAC Tigr', dcsCargoType='container_cargo', required=1, initialStock=12, side=RED, category=Group.Category.GROUND, build=singleUnit('Tigr_233036'), MEDEVAC=true, salvageValue=1, crewSize=4, roles={'JTAC'}, jtac={ platform='ground' } }
|
||||
cat['RED_URAL4320_AMMO'] = { menuCategory='Support', menu='Ural-4320-31 Ammo Truck', description='Ural-4320-31 Ammo Truck', dcsCargoType='container_cargo', required=1, initialStock=12, side=RED, category=Group.Category.GROUND, build=singleUnit('Ural-4320-31'), salvageValue=1, crewSize=2 }
|
||||
cat['RED_ATZ10_TANKER'] = { menuCategory='Support', menu='ATZ-10 Refueler', description='ATZ-10 Refueler', dcsCargoType='container_cargo', required=1, initialStock=10, side=RED, category=Group.Category.GROUND, build=singleUnit('ATZ-10'), salvageValue=1, crewSize=2 }
|
||||
cat['RED_EWR_1L13'] = { menuCategory='Support', menu='EWR Radar 1L13', description='EWR Radar 1L13', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, build=singleUnit('1L13 EWR'), salvageValue=1, crewSize=3 }
|
||||
|
||||
-- Artillery (BLUE)
|
||||
cat['BLUE_MLRS_CRATE'] = { hidden=true, description='MLRS crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_MLRS'] = { menuCategory='Artillery', menu='MLRS', description='MLRS', dcsCargoType='container_cargo', requires={ BLUE_MLRS_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('MLRS'), salvageValue=2, crewSize=3 }
|
||||
cat['BLUE_SMERCH_CM_CRATE'] = { hidden=true, description='Smerch (CM) crate', dcsCargoType='container_cargo', required=1, initialStock=12, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_SMERCH_CM'] = { menuCategory='Artillery', menu='Smerch_CM', description='Smerch (CM)', dcsCargoType='container_cargo', requires={ BLUE_SMERCH_CM_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Smerch'), salvageValue=2, crewSize=3 }
|
||||
cat['BLUE_L118_105MM'] = { menuCategory='Artillery', menu='L118 Light Artillery 105mm', description='L118 105mm', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('L118_Unit'), salvageValue=1, crewSize=5 }
|
||||
cat['BLUE_SMERCH_HE_CRATE'] = { hidden=true, description='Smerch (HE) crate', dcsCargoType='container_cargo', required=1, initialStock=12, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_SMERCH_HE'] = { menuCategory='Artillery', menu='Smerch_HE', description='Smerch (HE)', dcsCargoType='container_cargo', requires={ BLUE_SMERCH_HE_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Smerch_HE'), salvageValue=2, crewSize=3 }
|
||||
cat['BLUE_M109_CRATE'] = { hidden=true, description='M-109 crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M109'] = { menuCategory='Artillery', menu='M-109', description='M-109', dcsCargoType='container_cargo', requires={ BLUE_M109_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M-109'), salvageValue=2, crewSize=4 }
|
||||
|
||||
-- Artillery (RED)
|
||||
cat['RED_GVOZDIKA_CRATE'] = { hidden=true, description='SAU Gvozdika crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_GVOZDika'] = { menuCategory='Artillery', menu='SAU Gvozdika', description='SAU Gvozdika', dcsCargoType='container_cargo', requires={ RED_GVOZDIKA_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('SAU Gvozdika'), salvageValue=2, crewSize=3 }
|
||||
cat['RED_2S19_MSTA_CRATE'] = { hidden=true, description='SPH 2S19 Msta crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_2S19_MSTA'] = { menuCategory='Artillery', menu='SPH 2S19 Msta', description='SPH 2S19 Msta', dcsCargoType='container_cargo', requires={ RED_2S19_MSTA_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('SAU Msta'), salvageValue=2, crewSize=4 }
|
||||
cat['RED_URAGAN_BM27_CRATE'] = { hidden=true, description='Uragan BM-27 crate', dcsCargoType='container_cargo', required=1, initialStock=12, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_URAGAN_BM27'] = { menuCategory='Artillery', menu='Uragan_BM-27', description='Uragan BM-27', dcsCargoType='container_cargo', requires={ RED_URAGAN_BM27_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('Uragan_BM-27'), salvageValue=2, crewSize=3 }
|
||||
cat['RED_BM21_GRAD_CRATE'] = { hidden=true, description='BM-21 Grad crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BM21_GRAD'] = { menuCategory='Artillery', menu='BM-21 Grad Ural', description='BM-21 Grad Ural', dcsCargoType='container_cargo', requires={ RED_BM21_GRAD_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('Grad-URAL'), salvageValue=2, crewSize=3 }
|
||||
cat['RED_PLZ05_CRATE'] = { hidden=true, description='PLZ-05 crate', dcsCargoType='container_cargo', required=1, initialStock=12, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_PLZ05'] = { menuCategory='Artillery', menu='PLZ-05 Mobile Artillery', description='PLZ-05', dcsCargoType='container_cargo', requires={ RED_PLZ05_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('PLZ05'), salvageValue=2, crewSize=4 }
|
||||
|
||||
-- AAA (BLUE)
|
||||
cat['BLUE_GEPARD'] = { menuCategory='AAA', menu='Gepard AAA', description='Gepard AAA', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Gepard'), salvageValue=1, crewSize=3 }
|
||||
cat['BLUE_CRAM'] = { menuCategory='AAA', menu='LPWS C-RAM', description='LPWS C-RAM', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('HEMTT_C-RAM_Phalanx'), salvageValue=1, crewSize=2 }
|
||||
cat['BLUE_VULCAN_M163'] = { menuCategory='AAA', menu='SPAAA Vulcan M163', description='Vulcan M163', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Vulcan'), salvageValue=1, crewSize=2 }
|
||||
cat['BLUE_BOFORS40'] = { menuCategory='AAA', menu='Bofors 40mm', description='Bofors 40mm', dcsCargoType='container_cargo', required=1, initialStock=12, side=BLUE, category=Group.Category.GROUND, build=singleUnit('bofors40'), salvageValue=1, crewSize=4 }
|
||||
|
||||
-- AAA (RED)
|
||||
cat['RED_URAL_ZU23'] = { menuCategory='AAA', menu='Ural-375 ZU-23', description='Ural-375 ZU-23', dcsCargoType='container_cargo', required=1, initialStock=12, side=RED, category=Group.Category.GROUND, build=singleUnit('Ural-375 ZU-23'), salvageValue=1, crewSize=3 }
|
||||
cat['RED_SHILKA'] = { menuCategory='AAA', menu='ZSU-23-4 Shilka', description='ZSU-23-4 Shilka', dcsCargoType='container_cargo', required=1, initialStock=10, side=RED, category=Group.Category.GROUND, build=singleUnit('ZSU-23-4 Shilka'), salvageValue=1, crewSize=3 }
|
||||
cat['RED_ZSU57_2'] = { menuCategory='AAA', menu='ZSU_57_2', description='ZSU_57_2', dcsCargoType='container_cargo', required=1, initialStock=10, side=RED, category=Group.Category.GROUND, build=singleUnit('ZSU_57_2'), salvageValue=1, crewSize=3 }
|
||||
|
||||
cat['BLUE_M1097_AVENGER_CRATE'] = { hidden=true, description='M1097 Avenger crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M1097_AVENGER'] = { menuCategory='SAM short range', menu='M1097 Avenger', description='M1097 Avenger', dcsCargoType='container_cargo', requires={ BLUE_M1097_AVENGER_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1097 Avenger') }
|
||||
cat['BLUE_M48_CHAPARRAL_CRATE'] = { hidden=true, description='M48 Chaparral crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M48_CHAPARRAL'] = { menuCategory='SAM short range', menu='M48 Chaparral', description='M48 Chaparral', dcsCargoType='container_cargo', requires={ BLUE_M48_CHAPARRAL_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M48 Chaparral') }
|
||||
cat['BLUE_ROLAND_ADS_CRATE'] = { hidden=true, description='Roland ADS crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_ROLAND_ADS'] = { menuCategory='SAM short range', menu='Roland ADS', description='Roland ADS', dcsCargoType='container_cargo', requires={ BLUE_ROLAND_ADS_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Roland ADS') }
|
||||
cat['BLUE_M6_LINEBACKER'] = { menuCategory='SAM short range', menu='M6 Linebacker', description='M6 Linebacker', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M6 Linebacker') }
|
||||
cat['BLUE_RAPIER_LN'] = { menuCategory='SAM short range', menu='Rapier Launcher', description='Rapier Launcher', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('rapier_fsa_launcher') }
|
||||
cat['BLUE_RAPIER_SR'] = { menuCategory='SAM short range', menu='Rapier SR', description='Rapier SR', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('rapier_fsa_blindfire_radar') }
|
||||
cat['BLUE_RAPIER_TR'] = { menuCategory='SAM short range', menu='Rapier Tracker', description='Rapier Tracker', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('rapier_fsa_optical_tracker_unit') }
|
||||
cat['BLUE_RAPIER_SITE'] = { menuCategory='SAM short range', menu='Rapier - All crates', description='Rapier Site', dcsCargoType='container_cargo', requires={ BLUE_RAPIER_LN=1, BLUE_RAPIER_SR=1, BLUE_RAPIER_TR=1 }, initialStock=0, side=BLUE, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='rapier_fsa_launcher'}, {type='rapier_fsa_blindfire_radar', dx=12, dz=6}, {type='rapier_fsa_optical_tracker_unit', dx=-12, dz=6} }) }
|
||||
|
||||
-- SAM short range (RED)
|
||||
cat['RED_OSA_9K33_CRATE'] = { hidden=true, description='9K33 Osa crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_OSA_9K33'] = { menuCategory='SAM short range', menu='9K33 Osa', description='9K33 Osa', dcsCargoType='container_cargo', requires={ RED_OSA_9K33_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('Osa 9A33 ln') }
|
||||
cat['RED_STRELA1_9P31_CRATE'] = { hidden=true, description='9P31 Strela-1 crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_STRELA1_9P31'] = { menuCategory='SAM short range', menu='9P31 Strela-1', description='9P31 Strela-1', dcsCargoType='container_cargo', requires={ RED_STRELA1_9P31_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('Strela-1 9P31') }
|
||||
cat['RED_TUNGUSKA_2S6_CRATE'] = { hidden=true, description='2K22 Tunguska crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_TUNGUSKA_2S6'] = { menuCategory='SAM short range', menu='2K22 Tunguska', description='2K22 Tunguska', dcsCargoType='container_cargo', requires={ RED_TUNGUSKA_2S6_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('2S6 Tunguska') }
|
||||
cat['RED_STRELA10M3_CRATE'] = { hidden=true, description='SA-13 Strela-10M3 crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_STRELA10M3'] = { menuCategory='SAM short range', menu='SA-13 Strela-10M3', description='SA-13 Strela-10M3', dcsCargoType='container_cargo', requires={ RED_STRELA10M3_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('Strela-10M3') }
|
||||
-- HQ-7 components and site
|
||||
cat['RED_HQ7_LN_CRATE'] = { hidden=true, description='HQ-7 Launcher crate', dcsCargoType='container_cargo', required=1, initialStock=20, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_HQ7_LN'] = { menuCategory='SAM short range', menu='HQ-7_Launcher', description='HQ-7 Launcher', dcsCargoType='container_cargo', requires={ RED_HQ7_LN_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('HQ-7_LN_SP') }
|
||||
cat['RED_HQ7_STR'] = { menuCategory='SAM short range', menu='HQ-7_STR_SP', description='HQ-7 STR', dcsCargoType='container_cargo', required=1, initialStock=10, side=RED, category=Group.Category.GROUND, build=singleUnit('HQ-7_STR_SP') }
|
||||
cat['RED_HQ7_SITE'] = { menuCategory='SAM short range', menu='HQ-7 - All crates', description='HQ-7 Site', dcsCargoType='container_cargo', requires={ RED_HQ7_LN=1, RED_HQ7_STR=1 }, initialStock=0, side=RED, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='HQ-7_LN_SP'}, {type='HQ-7_STR_SP', dx=10, dz=8} }) }
|
||||
|
||||
-- SAM mid range (BLUE) HAWK + NASAMS
|
||||
cat['BLUE_HAWK_LN'] = { menuCategory='SAM mid range', menu='HAWK Launcher', description='HAWK Launcher', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk ln') }
|
||||
cat['BLUE_HAWK_SR'] = { menuCategory='SAM mid range', menu='HAWK Search Radar', description='HAWK SR', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk sr') }
|
||||
cat['BLUE_HAWK_TR'] = { menuCategory='SAM mid range', menu='HAWK Track Radar', description='HAWK TR', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk tr') }
|
||||
cat['BLUE_HAWK_PCP'] = { menuCategory='SAM mid range', menu='HAWK PCP', description='HAWK PCP', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk pcp') }
|
||||
cat['BLUE_HAWK_CWAR'] = { menuCategory='SAM mid range', menu='HAWK CWAR', description='HAWK CWAR', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk cwar') }
|
||||
cat['BLUE_HAWK_SITE'] = { menuCategory='SAM mid range', menu='HAWK - All crates', description='HAWK Site', dcsCargoType='container_cargo', requires={ BLUE_HAWK_LN=1, BLUE_HAWK_SR=1, BLUE_HAWK_TR=1, BLUE_HAWK_PCP=1, BLUE_HAWK_CWAR=1 }, initialStock=0, side=BLUE, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='Hawk ln'}, {type='Hawk sr', dx=12, dz=8}, {type='Hawk tr', dx=-12, dz=8}, {type='Hawk pcp', dx=18, dz=12}, {type='Hawk cwar', dx=-18, dz=12} }) }
|
||||
|
||||
-- HAWK site repair/augment (adds +1 launcher, repairs site by respawn)
|
||||
cat['BLUE_HAWK_REPAIR'] = { menuCategory='SAM mid range', menu='HAWK Repair/Launcher +1', description='HAWK Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg)
|
||||
-- Build is handled specially in CTLD:BuildSpecificAtGroup for isRepair entries
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
|
||||
cat['BLUE_NASAMS_LN'] = { menuCategory='SAM mid range', menu='NASAMS Launcher 120C', description='NASAMS LN 120C', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_LN_C') }
|
||||
cat['BLUE_NASAMS_RADAR'] = { menuCategory='SAM mid range', menu='NASAMS Search/Track Radar', description='NASAMS Radar', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_Radar_MPQ64F1') }
|
||||
cat['BLUE_NASAMS_CP'] = { menuCategory='SAM mid range', menu='NASAMS Command Post', description='NASAMS CP', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_Command_Post') }
|
||||
cat['BLUE_NASAMS_SITE'] = { menuCategory='SAM mid range', menu='NASAMS - All crates', description='NASAMS Site', dcsCargoType='container_cargo', requires={ BLUE_NASAMS_LN=1, BLUE_NASAMS_RADAR=1, BLUE_NASAMS_CP=1 }, initialStock=0, side=BLUE, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='NASAMS_LN_C'}, {type='NASAMS_Radar_MPQ64F1', dx=12, dz=8}, {type='NASAMS_Command_Post', dx=-12, dz=8} }) }
|
||||
|
||||
-- SAM mid range (RED) KUB
|
||||
cat['RED_KUB_LN'] = { menuCategory='SAM mid range', menu='KUB Launcher', description='KUB Launcher', dcsCargoType='container_cargo', required=1, initialStock=8, side=RED, category=Group.Category.GROUND, build=singleUnit('Kub 2P25 ln') }
|
||||
cat['RED_KUB_RADAR'] = { menuCategory='SAM mid range', menu='KUB Radar', description='KUB Radar', dcsCargoType='container_cargo', required=1, initialStock=8, side=RED, category=Group.Category.GROUND, build=singleUnit('Kub 1S91 str') }
|
||||
cat['RED_KUB_SITE'] = { menuCategory='SAM mid range', menu='KUB - All crates', description='KUB Site', dcsCargoType='container_cargo', requires={ RED_KUB_LN=1, RED_KUB_RADAR=1 }, initialStock=0, side=RED, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='Kub 2P25 ln'}, {type='Kub 1S91 str', dx=12, dz=8} }) }
|
||||
|
||||
-- KUB site repair/augment (adds +1 launcher, repairs site by respawn)
|
||||
cat['RED_KUB_REPAIR'] = { menuCategory='SAM mid range', menu='KUB Repair/Launcher +1', description='KUB Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=8, side=RED, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg)
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
|
||||
-- SAM long range (BLUE) Patriot
|
||||
cat['BLUE_PATRIOT_LN'] = { menuCategory='SAM long range', menu='Patriot Launcher', description='Patriot Launcher', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Patriot ln') }
|
||||
cat['BLUE_PATRIOT_RADAR'] = { menuCategory='SAM long range', menu='Patriot Radar', description='Patriot Radar', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Patriot str') }
|
||||
cat['BLUE_PATRIOT_ECS'] = { menuCategory='SAM long range', menu='Patriot ECS', description='Patriot ECS', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Patriot ECS') }
|
||||
cat['BLUE_PATRIOT_SITE'] = { menuCategory='SAM long range', menu='Patriot - All crates', description='Patriot Site', dcsCargoType='container_cargo', requires={ BLUE_PATRIOT_LN=1, BLUE_PATRIOT_RADAR=1, BLUE_PATRIOT_ECS=1 }, initialStock=0, side=BLUE, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='Patriot ln'}, {type='Patriot str', dx=14, dz=10}, {type='Patriot ECS', dx=-14, dz=10} }) }
|
||||
|
||||
-- Patriot site repair/augment (adds +1 launcher, repairs site by respawn)
|
||||
cat['BLUE_PATRIOT_REPAIR'] = { menuCategory='SAM long range', menu='Patriot Repair/Launcher +1', description='Patriot Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg)
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
|
||||
-- SAM long range (RED) BUK
|
||||
cat['RED_BUK_LN'] = { menuCategory='SAM long range', menu='BUK Launcher', description='BUK Launcher', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, build=singleUnit('SA-11 Buk LN 9A310M1') }
|
||||
cat['RED_BUK_SR'] = { menuCategory='SAM long range', menu='BUK Search Radar', description='BUK Search Radar', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, build=singleUnit('SA-11 Buk SR 9S18M1') }
|
||||
cat['RED_BUK_CC'] = { menuCategory='SAM long range', menu='BUK CC Radar', description='BUK CC Radar', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, build=singleUnit('SA-11 Buk CC 9S470M1') }
|
||||
cat['RED_BUK_SITE'] = { menuCategory='SAM long range', menu='BUK - All crates', description='BUK Site', dcsCargoType='container_cargo', requires={ RED_BUK_LN=1, RED_BUK_SR=1, RED_BUK_CC=1 }, initialStock=0, side=RED, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='SA-11 Buk LN 9A310M1'}, {type='SA-11 Buk SR 9S18M1', dx=12, dz=8}, {type='SA-11 Buk CC 9S470M1', dx=-12, dz=8} }) }
|
||||
|
||||
-- BUK site repair/augment (adds +1 launcher, repairs site by respawn)
|
||||
cat['RED_BUK_REPAIR'] = { menuCategory='SAM long range', menu='BUK Repair/Launcher +1', description='BUK Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg)
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
|
||||
-- Drones (JTAC)
|
||||
cat['BLUE_MQ9'] = { menuCategory='Drones', menu='MQ-9 Reaper - JTAC', description='MQ-9 JTAC', dcsCargoType='container_cargo', required=1, initialStock=3, side=BLUE, category=Group.Category.AIRPLANE, build=singleAirUnit('MQ-9 Reaper'), roles={'JTAC'}, jtac={ platform='air' } }
|
||||
cat['RED_WINGLOONG'] = { menuCategory='Drones', menu='WingLoong-I - JTAC', description='WingLoong-I JTAC', dcsCargoType='container_cargo', required=1, initialStock=3, side=RED, category=Group.Category.AIRPLANE, build=singleAirUnit('WingLoong-I'), roles={'JTAC'}, jtac={ platform='air' } }
|
||||
|
||||
-- FOB crates (Support) — three small crates build a FOB site
|
||||
cat['FOB_SMALL'] = { hidden=true, description='FOB small crate', dcsCargoType='container_cargo', required=1, initialStock=12, side=nil, category=Group.Category.GROUND, build=function(point, headingDeg)
|
||||
-- spawns a harmless placeholder truck for visibility; consumed by FOB_SITE build
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
cat['FOB_SITE'] = { menuCategory='Support', menu='FOB Crates - All', description='FOB Site', isFOB=true, dcsCargoType='container_cargo', requires={ FOB_SMALL=3 }, initialStock=0, side=nil, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='HEMTT TFFT'}, {type='Ural-375 PBU', dx=10, dz=8}, {type='Ural-375', dx=-10, dz=8} }) }
|
||||
|
||||
-- Mobile MASH (Support) — three crates build a Mobile MASH unit
|
||||
cat['MOBILE_MASH_SMALL'] = { hidden=true, description='Mobile MASH crate', dcsCargoType='container_cargo', required=1, initialStock=6, side=nil, category=Group.Category.GROUND, build=function(point, headingDeg)
|
||||
-- spawns placeholder truck for visibility; consumed by MOBILE_MASH build
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
cat['BLUE_MOBILE_MASH'] = { menuCategory='Support', menu='Mobile MASH - All', description='Blue Mobile MASH Unit', isMobileMASH=true, dcsCargoType='container_cargo', requires={ MOBILE_MASH_SMALL=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M-113') }
|
||||
cat['RED_MOBILE_MASH'] = { menuCategory='Support', menu='Mobile MASH - All', description='Red Mobile MASH Unit', isMobileMASH=true, dcsCargoType='container_cargo', requires={ MOBILE_MASH_SMALL=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BTR_D') }
|
||||
|
||||
-- =========================
|
||||
-- Troop Type Definitions
|
||||
-- =========================
|
||||
-- These define the composition of troop squads for Load/Unload Troops (NOT crates)
|
||||
-- Structure: { label, size, unitsBlue, unitsRed, units (fallback) }
|
||||
local troops = {}
|
||||
|
||||
-- Assault Squad: general-purpose rifles/MG
|
||||
troops['AS'] = {
|
||||
label = 'Assault Squad',
|
||||
size = 8,
|
||||
unitsBlue = { 'Soldier M4', 'Soldier M249' },
|
||||
unitsRed = { 'Infantry AK', 'Infantry AK ver3' },
|
||||
units = { 'Infantry AK' },
|
||||
}
|
||||
|
||||
-- MANPADS Team: Anti-air element
|
||||
troops['AA'] = {
|
||||
label = 'MANPADS Team',
|
||||
size = 4,
|
||||
unitsBlue = { 'Soldier stinger', 'Stinger comm' },
|
||||
unitsRed = { 'SA-18 Igla-S manpad', 'SA-18 Igla comm' },
|
||||
units = { 'Infantry AK' },
|
||||
}
|
||||
|
||||
-- AT Team: Anti-tank element
|
||||
troops['AT'] = {
|
||||
label = 'AT Team',
|
||||
size = 4,
|
||||
unitsBlue = { 'Soldier RPG', 'Soldier RPG' },
|
||||
unitsRed = { 'Soldier RPG', 'Soldier RPG' },
|
||||
units = { 'Infantry AK' },
|
||||
}
|
||||
|
||||
-- Mortar Team: Indirect fire element
|
||||
troops['AR'] = {
|
||||
label = 'Mortar Team',
|
||||
size = 4,
|
||||
unitsBlue = { '2B11 mortar' },
|
||||
unitsRed = { '2B11 mortar' },
|
||||
units = { '2B11 mortar' },
|
||||
}
|
||||
|
||||
-- Export troop types
|
||||
_CTLD_TROOP_TYPES = troops
|
||||
|
||||
-- Also export as a global for mission setups that load via DO SCRIPT FILE (no return capture)
|
||||
_CTLD_EXTRACTED_CATALOG = cat
|
||||
return cat
|
||||
334
catalogs/Moose_CTLD_Catalog_LowCounts.lua
Normal file
334
catalogs/Moose_CTLD_Catalog_LowCounts.lua
Normal file
@ -0,0 +1,334 @@
|
||||
-- CrateCatalog_CTLD_Extract.lua
|
||||
-- Auto-generated from CTLD.lua (Operation_Polar_Shield) spawnableCrates config
|
||||
-- Returns a table of crate definitions suitable for CTLD:MergeCatalog()
|
||||
-- Notes:
|
||||
-- - Each entry has keys: description/menu, dcsCargoType, required or requires (composite), side, category, build(point, headingDeg)
|
||||
-- - Single-unit entries spawn one unit by DCS type. Composite "SITE" entries spawn a multi-unit group approximating system components.
|
||||
|
||||
local function singleUnit(unitType)
|
||||
return function(point, headingDeg)
|
||||
local name = string.format('%s-%d', unitType, math.random(100000,999999))
|
||||
local hdg = math.rad(headingDeg or 0)
|
||||
return {
|
||||
visible=false, lateActivation=false, tasks={}, task='Ground Nothing', route={},
|
||||
units={ { type=unitType, name=name, x=point.x, y=point.z, heading=hdg } },
|
||||
name = 'CTLD_'..name
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
-- Build a single AIR unit that spawns in the air at a configured altitude/speed.
|
||||
-- Falls back gracefully to singleUnit behavior if config is unavailable/disabled.
|
||||
local function singleAirUnit(unitType)
|
||||
return function(point, headingDeg)
|
||||
local cfg = (rawget(_G, 'CTLD') and CTLD.Config and CTLD.Config.DroneAirSpawn) or nil
|
||||
if not cfg or cfg.Enabled == false then
|
||||
return singleUnit(unitType)(point, headingDeg)
|
||||
end
|
||||
|
||||
local name = string.format('%s-%d', unitType, math.random(100000,999999))
|
||||
local hdgDeg = headingDeg or 0
|
||||
local hdg = math.rad(hdgDeg)
|
||||
local alt = tonumber(cfg.AltitudeMeters) or 1200
|
||||
local spd = tonumber(cfg.SpeedMps) or 120
|
||||
|
||||
-- Create a tiny 2-point route to ensure forward flight at the chosen altitude.
|
||||
local function fwdOffset(px, pz, meters, headingRadians)
|
||||
return px + math.sin(headingRadians) * meters, pz + math.cos(headingRadians) * meters
|
||||
end
|
||||
local p1x, p1z = point.x, point.z
|
||||
local p2x, p2z = fwdOffset(point.x, point.z, 1000, hdg) -- 1 km ahead
|
||||
|
||||
local group = {
|
||||
visible=false,
|
||||
lateActivation=false,
|
||||
tasks={},
|
||||
task='CAS',
|
||||
route={
|
||||
points={
|
||||
{
|
||||
alt = alt, alt_type = 'BARO',
|
||||
type = 'Turning Point', action = 'Turning Point',
|
||||
x = p1x, y = p1z,
|
||||
speed = spd, ETA = 0, ETA_locked = false,
|
||||
task = {}
|
||||
},
|
||||
{
|
||||
alt = alt, alt_type = 'BARO',
|
||||
type = 'Turning Point', action = 'Turning Point',
|
||||
x = p2x, y = p2z,
|
||||
speed = spd, ETA = 0, ETA_locked = false,
|
||||
task = {}
|
||||
}
|
||||
}
|
||||
},
|
||||
units={
|
||||
{
|
||||
type=unitType, name=name,
|
||||
x=p1x, y=p1z,
|
||||
heading=hdg,
|
||||
speed = spd,
|
||||
alt = alt, alt_type = 'BARO'
|
||||
}
|
||||
},
|
||||
name = 'CTLD_'..name
|
||||
}
|
||||
return group
|
||||
end
|
||||
end
|
||||
|
||||
local function multiUnits(units)
|
||||
-- units: array of { type, dx, dz }
|
||||
return function(point, headingDeg)
|
||||
local hdg = math.rad(headingDeg or 0)
|
||||
local function off(dx, dz) return { x = point.x + dx, z = point.z + dz } end
|
||||
local list = {}
|
||||
for i,u in ipairs(units) do
|
||||
local p = off(u.dx or 0, u.dz or 3*i)
|
||||
table.insert(list, {
|
||||
type = u.type, name = string.format('CTLD-%s-%d', u.type, math.random(100000,999999)),
|
||||
x = p.x, y = p.z, heading = hdg
|
||||
})
|
||||
end
|
||||
return { visible=false, lateActivation=false, tasks={}, task='Ground Nothing', route={}, units=list, name=string.format('CTLD_SITE_%d', math.random(100000,999999)) }
|
||||
end
|
||||
end
|
||||
|
||||
local BLUE = coalition.side.BLUE
|
||||
local RED = coalition.side.RED
|
||||
|
||||
local cat = {}
|
||||
|
||||
cat['BLUE_M1128_STRYKER_MGS_CRATE'] = { hidden=true, description='M1128 Stryker MGS crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M1128_STRYKER_MGS'] = { menuCategory='Combat Vehicles', menu='M1128 Stryker MGS', description='M1128 Stryker MGS', dcsCargoType='container_cargo', requires={ BLUE_M1128_STRYKER_MGS_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1128 Stryker MGS'), unitType='M1128 Stryker MGS', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['BLUE_M60A3_PATTON_CRATE'] = { hidden=true, description='M-60A3 Patton crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M60A3_PATTON'] = { menuCategory='Combat Vehicles', menu='M-60A3 Patton', description='M-60A3 Patton', dcsCargoType='container_cargo', requires={ BLUE_M60A3_PATTON_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M-60'), unitType='M-60', MEDEVAC=true, salvageValue=3, crewSize=4 }
|
||||
cat['BLUE_HMMWV_TOW_CRATE'] = { hidden=true, description='Humvee - TOW crate', dcsCargoType='container_cargo', required=1, initialStock=36, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_HMMWV_TOW'] = { menuCategory='Combat Vehicles', menu='Humvee - TOW', description='Humvee - TOW', dcsCargoType='container_cargo', requires={ BLUE_HMMWV_TOW_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1045 HMMWV TOW'), unitType='M1045 HMMWV TOW', MEDEVAC=true, salvageValue=3, crewSize=2 }
|
||||
cat['BLUE_M1134_STRYKER_ATGM_CRATE']= { hidden=true, description='M1134 Stryker ATGM crate', dcsCargoType='container_cargo', required=1, initialStock=24, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M1134_STRYKER_ATGM'] = { menuCategory='Combat Vehicles', menu='M1134 Stryker ATGM', description='M1134 Stryker ATGM', dcsCargoType='container_cargo', requires={ BLUE_M1134_STRYKER_ATGM_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1134 Stryker ATGM'), unitType='M1134 Stryker ATGM', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['BLUE_LAV25_CRATE'] = { hidden=true, description='LAV-25 crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_LAV25'] = { menuCategory='Combat Vehicles', menu='LAV-25', description='LAV-25', dcsCargoType='container_cargo', requires={ BLUE_LAV25_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('LAV-25'), unitType='LAV-25', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['BLUE_M2A2_BRADLEY_CRATE'] = { hidden=true, description='M2A2 Bradley crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M2A2_BRADLEY'] = { menuCategory='Combat Vehicles', menu='M2A2 Bradley', description='M2A2 Bradley', dcsCargoType='container_cargo', requires={ BLUE_M2A2_BRADLEY_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M-2 Bradley'), unitType='M-2 Bradley', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['BLUE_VAB_MEPHISTO_CRATE'] = { hidden=true, description='ATGM VAB Mephisto crate', dcsCargoType='container_cargo', required=1, initialStock=24, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_VAB_MEPHISTO'] = { menuCategory='Combat Vehicles', menu='ATGM VAB Mephisto', description='ATGM VAB Mephisto', dcsCargoType='container_cargo', requires={ BLUE_VAB_MEPHISTO_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('VAB_Mephisto'), unitType='VAB_Mephisto', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['BLUE_M1A2C_ABRAMS_CRATE'] = { hidden=true, description='M1A2C Abrams crate', dcsCargoType='container_cargo', required=1, initialStock=24, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M1A2C_ABRAMS'] = { menuCategory='Combat Vehicles', menu='M1A2C Abrams', description='M1A2C Abrams', dcsCargoType='container_cargo', requires={ BLUE_M1A2C_ABRAMS_CRATE=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1A2C_SEP_V3'), unitType='M1A2C_SEP_V3', MEDEVAC=true, salvageValue=3, crewSize=4 }
|
||||
|
||||
-- Combat Vehicles (RED)
|
||||
cat['RED_BTR82A_CRATE'] = { hidden=true, description='BTR-82A crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BTR82A'] = { menuCategory='Combat Vehicles', menu='BTR-82A', description='BTR-82A', dcsCargoType='container_cargo', requires={ RED_BTR82A_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BTR-82A'), unitType='BTR-82A', MEDEVAC=true, salvageValue=2, crewSize=3 }
|
||||
cat['RED_BRDM2_CRATE'] = { hidden=true, description='BRDM-2 crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BRDM2'] = { menuCategory='Combat Vehicles', menu='BRDM-2', description='BRDM-2', dcsCargoType='container_cargo', requires={ RED_BRDM2_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BRDM-2'), unitType='BRDM-2', MEDEVAC=true, salvageValue=2, crewSize=2 }
|
||||
cat['RED_BMP3_CRATE'] = { hidden=true, description='BMP-3 crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BMP3'] = { menuCategory='Combat Vehicles', menu='BMP-3', description='BMP-3', dcsCargoType='container_cargo', requires={ RED_BMP3_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BMP-3'), unitType='BMP-3', MEDEVAC=true, salvageValue=2, crewSize=3 }
|
||||
cat['RED_BMP2_CRATE'] = { hidden=true, description='BMP-2 crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BMP2'] = { menuCategory='Combat Vehicles', menu='BMP-2', description='BMP-2', dcsCargoType='container_cargo', requires={ RED_BMP2_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BMP-2'), unitType='BMP-2', MEDEVAC=true, salvageValue=2, crewSize=3 }
|
||||
cat['RED_BTR80_CRATE'] = { hidden=true, description='BTR-80 crate', dcsCargoType='container_cargo', required=1, initialStock=30, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BTR80'] = { menuCategory='Combat Vehicles', menu='BTR-80', description='BTR-80', dcsCargoType='container_cargo', requires={ RED_BTR80_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BTR-80'), unitType='BTR-80', MEDEVAC=true, salvageValue=2, crewSize=3 }
|
||||
cat['RED_T72B3_CRATE'] = { hidden=true, description='T-72B3 crate', dcsCargoType='container_cargo', required=1, initialStock=24, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_T72B3'] = { menuCategory='Combat Vehicles', menu='T-72B3', description='T-72B3', dcsCargoType='container_cargo', requires={ RED_T72B3_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('T-72B3'), unitType='T-72B3', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
cat['RED_T90M_CRATE'] = { hidden=true, description='T-90M crate', dcsCargoType='container_cargo', required=1, initialStock=24, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_T90M'] = { menuCategory='Combat Vehicles', menu='T-90M', description='T-90M', dcsCargoType='container_cargo', requires={ RED_T90M_CRATE=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('CHAP_T90M'), unitType='CHAP_T90M', MEDEVAC=true, salvageValue=3, crewSize=3 }
|
||||
|
||||
-- Support (BLUE)
|
||||
cat['BLUE_MRAP_JTAC'] = { menuCategory='Support', menu='MRAP - JTAC', description='JTAC MRAP', dcsCargoType='container_cargo', required=1, initialStock=12, side=BLUE, category=Group.Category.GROUND, build=singleUnit('MaxxPro_MRAP'), MEDEVAC=true, salvageValue=1, crewSize=4, roles={'JTAC'}, jtac={ platform='ground' } }
|
||||
cat['BLUE_M818_AMMO'] = { menuCategory='Support', menu='M-818 Ammo Truck', description='M-818 Ammo Truck', dcsCargoType='container_cargo', required=1, initialStock=12, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M 818'), salvageValue=1, crewSize=2 }
|
||||
cat['BLUE_M978_TANKER'] = { menuCategory='Support', menu='M-978 Tanker', description='M-978 Tanker', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M978 HEMTT Tanker'), salvageValue=1, crewSize=2 }
|
||||
cat['BLUE_EWR_FPS117'] = { menuCategory='Support', menu='EWR Radar FPS-117', description='EWR Radar FPS-117', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, build=singleUnit('FPS-117'), salvageValue=1, crewSize=3 }
|
||||
|
||||
-- Support (RED)
|
||||
cat['RED_TIGR_JTAC'] = { menuCategory='Support', menu='Tigr - JTAC', description='JTAC Tigr', dcsCargoType='container_cargo', required=1, initialStock=12, side=RED, category=Group.Category.GROUND, build=singleUnit('Tigr_233036'), MEDEVAC=true, salvageValue=1, crewSize=4, roles={'JTAC'}, jtac={ platform='ground' } }
|
||||
cat['RED_URAL4320_AMMO'] = { menuCategory='Support', menu='Ural-4320-31 Ammo Truck', description='Ural-4320-31 Ammo Truck', dcsCargoType='container_cargo', required=1, initialStock=12, side=RED, category=Group.Category.GROUND, build=singleUnit('Ural-4320-31'), salvageValue=1, crewSize=2 }
|
||||
cat['RED_ATZ10_TANKER'] = { menuCategory='Support', menu='ATZ-10 Refueler', description='ATZ-10 Refueler', dcsCargoType='container_cargo', required=1, initialStock=10, side=RED, category=Group.Category.GROUND, build=singleUnit('ATZ-10'), salvageValue=1, crewSize=2 }
|
||||
cat['RED_EWR_1L13'] = { menuCategory='Support', menu='EWR Radar 1L13', description='EWR Radar 1L13', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, build=singleUnit('1L13 EWR'), salvageValue=1, crewSize=3 }
|
||||
|
||||
-- Artillery (BLUE)
|
||||
cat['BLUE_MLRS_CRATE'] = { hidden=true, description='MLRS crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_MLRS'] = { menuCategory='Artillery', menu='MLRS', description='MLRS', dcsCargoType='container_cargo', requires={ BLUE_MLRS_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('MLRS'), salvageValue=2, crewSize=3 }
|
||||
cat['BLUE_SMERCH_CM_CRATE'] = { hidden=true, description='Smerch (CM) crate', dcsCargoType='container_cargo', required=1, initialStock=12, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_SMERCH_CM'] = { menuCategory='Artillery', menu='Smerch_CM', description='Smerch (CM)', dcsCargoType='container_cargo', requires={ BLUE_SMERCH_CM_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Smerch'), salvageValue=2, crewSize=3 }
|
||||
cat['BLUE_L118_105MM'] = { menuCategory='Artillery', menu='L118 Light Artillery 105mm', description='L118 105mm', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('L118_Unit'), salvageValue=1, crewSize=5 }
|
||||
cat['BLUE_SMERCH_HE_CRATE'] = { hidden=true, description='Smerch (HE) crate', dcsCargoType='container_cargo', required=1, initialStock=12, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_SMERCH_HE'] = { menuCategory='Artillery', menu='Smerch_HE', description='Smerch (HE)', dcsCargoType='container_cargo', requires={ BLUE_SMERCH_HE_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Smerch_HE'), salvageValue=2, crewSize=3 }
|
||||
cat['BLUE_M109_CRATE'] = { hidden=true, description='M-109 crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M109'] = { menuCategory='Artillery', menu='M-109', description='M-109', dcsCargoType='container_cargo', requires={ BLUE_M109_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M-109'), salvageValue=2, crewSize=4 }
|
||||
|
||||
-- Artillery (RED)
|
||||
cat['RED_GVOZDIKA_CRATE'] = { hidden=true, description='SAU Gvozdika crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_GVOZDika'] = { menuCategory='Artillery', menu='SAU Gvozdika', description='SAU Gvozdika', dcsCargoType='container_cargo', requires={ RED_GVOZDIKA_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('SAU Gvozdika'), salvageValue=2, crewSize=3 }
|
||||
cat['RED_2S19_MSTA_CRATE'] = { hidden=true, description='SPH 2S19 Msta crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_2S19_MSTA'] = { menuCategory='Artillery', menu='SPH 2S19 Msta', description='SPH 2S19 Msta', dcsCargoType='container_cargo', requires={ RED_2S19_MSTA_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('SAU Msta'), salvageValue=2, crewSize=4 }
|
||||
cat['RED_URAGAN_BM27_CRATE'] = { hidden=true, description='Uragan BM-27 crate', dcsCargoType='container_cargo', required=1, initialStock=12, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_URAGAN_BM27'] = { menuCategory='Artillery', menu='Uragan_BM-27', description='Uragan BM-27', dcsCargoType='container_cargo', requires={ RED_URAGAN_BM27_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('Uragan_BM-27'), salvageValue=2, crewSize=3 }
|
||||
cat['RED_BM21_GRAD_CRATE'] = { hidden=true, description='BM-21 Grad crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_BM21_GRAD'] = { menuCategory='Artillery', menu='BM-21 Grad Ural', description='BM-21 Grad Ural', dcsCargoType='container_cargo', requires={ RED_BM21_GRAD_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('Grad-URAL'), salvageValue=2, crewSize=3 }
|
||||
cat['RED_PLZ05_CRATE'] = { hidden=true, description='PLZ-05 crate', dcsCargoType='container_cargo', required=1, initialStock=12, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_PLZ05'] = { menuCategory='Artillery', menu='PLZ-05 Mobile Artillery', description='PLZ-05', dcsCargoType='container_cargo', requires={ RED_PLZ05_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('PLZ05'), salvageValue=2, crewSize=4 }
|
||||
|
||||
-- AAA (BLUE)
|
||||
cat['BLUE_GEPARD'] = { menuCategory='AAA', menu='Gepard AAA', description='Gepard AAA', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Gepard'), salvageValue=1, crewSize=3 }
|
||||
cat['BLUE_CRAM'] = { menuCategory='AAA', menu='LPWS C-RAM', description='LPWS C-RAM', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('HEMTT_C-RAM_Phalanx'), salvageValue=1, crewSize=2 }
|
||||
cat['BLUE_VULCAN_M163'] = { menuCategory='AAA', menu='SPAAA Vulcan M163', description='Vulcan M163', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Vulcan'), salvageValue=1, crewSize=2 }
|
||||
cat['BLUE_BOFORS40'] = { menuCategory='AAA', menu='Bofors 40mm', description='Bofors 40mm', dcsCargoType='container_cargo', required=1, initialStock=12, side=BLUE, category=Group.Category.GROUND, build=singleUnit('bofors40'), salvageValue=1, crewSize=4 }
|
||||
|
||||
-- AAA (RED)
|
||||
cat['RED_URAL_ZU23'] = { menuCategory='AAA', menu='Ural-375 ZU-23', description='Ural-375 ZU-23', dcsCargoType='container_cargo', required=1, initialStock=12, side=RED, category=Group.Category.GROUND, build=singleUnit('Ural-375 ZU-23'), salvageValue=1, crewSize=3 }
|
||||
cat['RED_SHILKA'] = { menuCategory='AAA', menu='ZSU-23-4 Shilka', description='ZSU-23-4 Shilka', dcsCargoType='container_cargo', required=1, initialStock=10, side=RED, category=Group.Category.GROUND, build=singleUnit('ZSU-23-4 Shilka'), salvageValue=1, crewSize=3 }
|
||||
cat['RED_ZSU57_2'] = { menuCategory='AAA', menu='ZSU_57_2', description='ZSU_57_2', dcsCargoType='container_cargo', required=1, initialStock=10, side=RED, category=Group.Category.GROUND, build=singleUnit('ZSU_57_2'), salvageValue=1, crewSize=3 }
|
||||
|
||||
cat['BLUE_M1097_AVENGER_CRATE'] = { hidden=true, description='M1097 Avenger crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M1097_AVENGER'] = { menuCategory='SAM short range', menu='M1097 Avenger', description='M1097 Avenger', dcsCargoType='container_cargo', requires={ BLUE_M1097_AVENGER_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1097 Avenger') }
|
||||
cat['BLUE_M48_CHAPARRAL_CRATE'] = { hidden=true, description='M48 Chaparral crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_M48_CHAPARRAL'] = { menuCategory='SAM short range', menu='M48 Chaparral', description='M48 Chaparral', dcsCargoType='container_cargo', requires={ BLUE_M48_CHAPARRAL_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M48 Chaparral') }
|
||||
cat['BLUE_ROLAND_ADS_CRATE'] = { hidden=true, description='Roland ADS crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=BLUE, category=Group.Category.GROUND }
|
||||
cat['BLUE_ROLAND_ADS'] = { menuCategory='SAM short range', menu='Roland ADS', description='Roland ADS', dcsCargoType='container_cargo', requires={ BLUE_ROLAND_ADS_CRATE=2 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Roland ADS') }
|
||||
cat['BLUE_M6_LINEBACKER'] = { menuCategory='SAM short range', menu='M6 Linebacker', description='M6 Linebacker', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M6 Linebacker') }
|
||||
cat['BLUE_RAPIER_LN'] = { menuCategory='SAM short range', menu='Rapier Launcher', description='Rapier Launcher', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('rapier_fsa_launcher') }
|
||||
cat['BLUE_RAPIER_SR'] = { menuCategory='SAM short range', menu='Rapier SR', description='Rapier SR', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('rapier_fsa_blindfire_radar') }
|
||||
cat['BLUE_RAPIER_TR'] = { menuCategory='SAM short range', menu='Rapier Tracker', description='Rapier Tracker', dcsCargoType='container_cargo', required=1, initialStock=10, side=BLUE, category=Group.Category.GROUND, build=singleUnit('rapier_fsa_optical_tracker_unit') }
|
||||
cat['BLUE_RAPIER_SITE'] = { menuCategory='SAM short range', menu='Rapier - All crates', description='Rapier Site', dcsCargoType='container_cargo', requires={ BLUE_RAPIER_LN=1, BLUE_RAPIER_SR=1, BLUE_RAPIER_TR=1 }, initialStock=0, side=BLUE, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='rapier_fsa_launcher'}, {type='rapier_fsa_blindfire_radar', dx=12, dz=6}, {type='rapier_fsa_optical_tracker_unit', dx=-12, dz=6} }) }
|
||||
|
||||
-- SAM short range (RED)
|
||||
cat['RED_OSA_9K33_CRATE'] = { hidden=true, description='9K33 Osa crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_OSA_9K33'] = { menuCategory='SAM short range', menu='9K33 Osa', description='9K33 Osa', dcsCargoType='container_cargo', requires={ RED_OSA_9K33_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('Osa 9A33 ln') }
|
||||
cat['RED_STRELA1_9P31_CRATE'] = { hidden=true, description='9P31 Strela-1 crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_STRELA1_9P31'] = { menuCategory='SAM short range', menu='9P31 Strela-1', description='9P31 Strela-1', dcsCargoType='container_cargo', requires={ RED_STRELA1_9P31_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('Strela-1 9P31') }
|
||||
cat['RED_TUNGUSKA_2S6_CRATE'] = { hidden=true, description='2K22 Tunguska crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_TUNGUSKA_2S6'] = { menuCategory='SAM short range', menu='2K22 Tunguska', description='2K22 Tunguska', dcsCargoType='container_cargo', requires={ RED_TUNGUSKA_2S6_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('2S6 Tunguska') }
|
||||
cat['RED_STRELA10M3_CRATE'] = { hidden=true, description='SA-13 Strela-10M3 crate', dcsCargoType='container_cargo', required=1, initialStock=16, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_STRELA10M3'] = { menuCategory='SAM short range', menu='SA-13 Strela-10M3', description='SA-13 Strela-10M3', dcsCargoType='container_cargo', requires={ RED_STRELA10M3_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('Strela-10M3') }
|
||||
-- HQ-7 components and site
|
||||
cat['RED_HQ7_LN_CRATE'] = { hidden=true, description='HQ-7 Launcher crate', dcsCargoType='container_cargo', required=1, initialStock=20, side=RED, category=Group.Category.GROUND }
|
||||
cat['RED_HQ7_LN'] = { menuCategory='SAM short range', menu='HQ-7_Launcher', description='HQ-7 Launcher', dcsCargoType='container_cargo', requires={ RED_HQ7_LN_CRATE=2 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('HQ-7_LN_SP') }
|
||||
cat['RED_HQ7_STR'] = { menuCategory='SAM short range', menu='HQ-7_STR_SP', description='HQ-7 STR', dcsCargoType='container_cargo', required=1, initialStock=10, side=RED, category=Group.Category.GROUND, build=singleUnit('HQ-7_STR_SP') }
|
||||
cat['RED_HQ7_SITE'] = { menuCategory='SAM short range', menu='HQ-7 - All crates', description='HQ-7 Site', dcsCargoType='container_cargo', requires={ RED_HQ7_LN=1, RED_HQ7_STR=1 }, initialStock=0, side=RED, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='HQ-7_LN_SP'}, {type='HQ-7_STR_SP', dx=10, dz=8} }) }
|
||||
|
||||
-- SAM mid range (BLUE) HAWK + NASAMS
|
||||
cat['BLUE_HAWK_LN'] = { menuCategory='SAM mid range', menu='HAWK Launcher', description='HAWK Launcher', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk ln') }
|
||||
cat['BLUE_HAWK_SR'] = { menuCategory='SAM mid range', menu='HAWK Search Radar', description='HAWK SR', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk sr') }
|
||||
cat['BLUE_HAWK_TR'] = { menuCategory='SAM mid range', menu='HAWK Track Radar', description='HAWK TR', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk tr') }
|
||||
cat['BLUE_HAWK_PCP'] = { menuCategory='SAM mid range', menu='HAWK PCP', description='HAWK PCP', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk pcp') }
|
||||
cat['BLUE_HAWK_CWAR'] = { menuCategory='SAM mid range', menu='HAWK CWAR', description='HAWK CWAR', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk cwar') }
|
||||
cat['BLUE_HAWK_SITE'] = { menuCategory='SAM mid range', menu='HAWK - All crates', description='HAWK Site', dcsCargoType='container_cargo', requires={ BLUE_HAWK_LN=1, BLUE_HAWK_SR=1, BLUE_HAWK_TR=1, BLUE_HAWK_PCP=1, BLUE_HAWK_CWAR=1 }, initialStock=0, side=BLUE, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='Hawk ln'}, {type='Hawk sr', dx=12, dz=8}, {type='Hawk tr', dx=-12, dz=8}, {type='Hawk pcp', dx=18, dz=12}, {type='Hawk cwar', dx=-18, dz=12} }) }
|
||||
|
||||
-- HAWK site repair/augment (adds +1 launcher, repairs site by respawn)
|
||||
cat['BLUE_HAWK_REPAIR'] = { menuCategory='SAM mid range', menu='HAWK Repair/Launcher +1', description='HAWK Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg)
|
||||
-- Build is handled specially in CTLD:BuildSpecificAtGroup for isRepair entries
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
|
||||
cat['BLUE_NASAMS_LN'] = { menuCategory='SAM mid range', menu='NASAMS Launcher 120C', description='NASAMS LN 120C', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_LN_C') }
|
||||
cat['BLUE_NASAMS_RADAR'] = { menuCategory='SAM mid range', menu='NASAMS Search/Track Radar', description='NASAMS Radar', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_Radar_MPQ64F1') }
|
||||
cat['BLUE_NASAMS_CP'] = { menuCategory='SAM mid range', menu='NASAMS Command Post', description='NASAMS CP', dcsCargoType='container_cargo', required=1, initialStock=8, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_Command_Post') }
|
||||
cat['BLUE_NASAMS_SITE'] = { menuCategory='SAM mid range', menu='NASAMS - All crates', description='NASAMS Site', dcsCargoType='container_cargo', requires={ BLUE_NASAMS_LN=1, BLUE_NASAMS_RADAR=1, BLUE_NASAMS_CP=1 }, initialStock=0, side=BLUE, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='NASAMS_LN_C'}, {type='NASAMS_Radar_MPQ64F1', dx=12, dz=8}, {type='NASAMS_Command_Post', dx=-12, dz=8} }) }
|
||||
|
||||
-- SAM mid range (RED) KUB
|
||||
cat['RED_KUB_LN'] = { menuCategory='SAM mid range', menu='KUB Launcher', description='KUB Launcher', dcsCargoType='container_cargo', required=1, initialStock=8, side=RED, category=Group.Category.GROUND, build=singleUnit('Kub 2P25 ln') }
|
||||
cat['RED_KUB_RADAR'] = { menuCategory='SAM mid range', menu='KUB Radar', description='KUB Radar', dcsCargoType='container_cargo', required=1, initialStock=8, side=RED, category=Group.Category.GROUND, build=singleUnit('Kub 1S91 str') }
|
||||
cat['RED_KUB_SITE'] = { menuCategory='SAM mid range', menu='KUB - All crates', description='KUB Site', dcsCargoType='container_cargo', requires={ RED_KUB_LN=1, RED_KUB_RADAR=1 }, initialStock=0, side=RED, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='Kub 2P25 ln'}, {type='Kub 1S91 str', dx=12, dz=8} }) }
|
||||
|
||||
-- KUB site repair/augment (adds +1 launcher, repairs site by respawn)
|
||||
cat['RED_KUB_REPAIR'] = { menuCategory='SAM mid range', menu='KUB Repair/Launcher +1', description='KUB Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=8, side=RED, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg)
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
|
||||
-- SAM long range (BLUE) Patriot
|
||||
cat['BLUE_PATRIOT_LN'] = { menuCategory='SAM long range', menu='Patriot Launcher', description='Patriot Launcher', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Patriot ln') }
|
||||
cat['BLUE_PATRIOT_RADAR'] = { menuCategory='SAM long range', menu='Patriot Radar', description='Patriot Radar', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Patriot str') }
|
||||
cat['BLUE_PATRIOT_ECS'] = { menuCategory='SAM long range', menu='Patriot ECS', description='Patriot ECS', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Patriot ECS') }
|
||||
cat['BLUE_PATRIOT_SITE'] = { menuCategory='SAM long range', menu='Patriot - All crates', description='Patriot Site', dcsCargoType='container_cargo', requires={ BLUE_PATRIOT_LN=1, BLUE_PATRIOT_RADAR=1, BLUE_PATRIOT_ECS=1 }, initialStock=0, side=BLUE, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='Patriot ln'}, {type='Patriot str', dx=14, dz=10}, {type='Patriot ECS', dx=-14, dz=10} }) }
|
||||
|
||||
-- Patriot site repair/augment (adds +1 launcher, repairs site by respawn)
|
||||
cat['BLUE_PATRIOT_REPAIR'] = { menuCategory='SAM long range', menu='Patriot Repair/Launcher +1', description='Patriot Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=6, side=BLUE, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg)
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
|
||||
-- SAM long range (RED) BUK
|
||||
cat['RED_BUK_LN'] = { menuCategory='SAM long range', menu='BUK Launcher', description='BUK Launcher', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, build=singleUnit('SA-11 Buk LN 9A310M1') }
|
||||
cat['RED_BUK_SR'] = { menuCategory='SAM long range', menu='BUK Search Radar', description='BUK Search Radar', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, build=singleUnit('SA-11 Buk SR 9S18M1') }
|
||||
cat['RED_BUK_CC'] = { menuCategory='SAM long range', menu='BUK CC Radar', description='BUK CC Radar', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, build=singleUnit('SA-11 Buk CC 9S470M1') }
|
||||
cat['RED_BUK_SITE'] = { menuCategory='SAM long range', menu='BUK - All crates', description='BUK Site', dcsCargoType='container_cargo', requires={ RED_BUK_LN=1, RED_BUK_SR=1, RED_BUK_CC=1 }, initialStock=0, side=RED, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='SA-11 Buk LN 9A310M1'}, {type='SA-11 Buk SR 9S18M1', dx=12, dz=8}, {type='SA-11 Buk CC 9S470M1', dx=-12, dz=8} }) }
|
||||
|
||||
-- BUK site repair/augment (adds +1 launcher, repairs site by respawn)
|
||||
cat['RED_BUK_REPAIR'] = { menuCategory='SAM long range', menu='BUK Repair/Launcher +1', description='BUK Repair (adds launcher)', dcsCargoType='container_cargo', required=1, initialStock=6, side=RED, category=Group.Category.GROUND, isRepair=true, build=function(point, headingDeg)
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
|
||||
-- Drones (JTAC)
|
||||
cat['BLUE_MQ9'] = { menuCategory='Drones', menu='MQ-9 Reaper - JTAC', description='MQ-9 JTAC', dcsCargoType='container_cargo', required=1, initialStock=3, side=BLUE, category=Group.Category.AIRPLANE, build=singleAirUnit('MQ-9 Reaper'), roles={'JTAC'}, jtac={ platform='air' } }
|
||||
cat['RED_WINGLOONG'] = { menuCategory='Drones', menu='WingLoong-I - JTAC', description='WingLoong-I JTAC', dcsCargoType='container_cargo', required=1, initialStock=3, side=RED, category=Group.Category.AIRPLANE, build=singleAirUnit('WingLoong-I'), roles={'JTAC'}, jtac={ platform='air' } }
|
||||
|
||||
-- FOB crates (Support) — three small crates build a FOB site
|
||||
cat['FOB_SMALL'] = { hidden=true, description='FOB small crate', dcsCargoType='container_cargo', required=1, initialStock=12, side=nil, category=Group.Category.GROUND, build=function(point, headingDeg)
|
||||
-- spawns a harmless placeholder truck for visibility; consumed by FOB_SITE build
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
cat['FOB_SITE'] = { menuCategory='Support', menu='FOB Crates - All', description='FOB Site', isFOB=true, dcsCargoType='container_cargo', requires={ FOB_SMALL=3 }, initialStock=0, side=nil, category=Group.Category.GROUND,
|
||||
build=multiUnits({ {type='HEMTT TFFT'}, {type='Ural-375 PBU', dx=10, dz=8}, {type='Ural-375', dx=-10, dz=8} }) }
|
||||
|
||||
-- Mobile MASH (Support) — three crates build a Mobile MASH unit
|
||||
cat['MOBILE_MASH_SMALL'] = { hidden=true, description='Mobile MASH crate', dcsCargoType='container_cargo', required=1, initialStock=6, side=nil, category=Group.Category.GROUND, build=function(point, headingDeg)
|
||||
-- spawns placeholder truck for visibility; consumed by MOBILE_MASH build
|
||||
return singleUnit('Ural-375')(point, headingDeg)
|
||||
end }
|
||||
cat['BLUE_MOBILE_MASH'] = { menuCategory='Support', menu='Mobile MASH - All', description='Blue Mobile MASH Unit', isMobileMASH=true, dcsCargoType='container_cargo', requires={ MOBILE_MASH_SMALL=3 }, initialStock=0, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M-113') }
|
||||
cat['RED_MOBILE_MASH'] = { menuCategory='Support', menu='Mobile MASH - All', description='Red Mobile MASH Unit', isMobileMASH=true, dcsCargoType='container_cargo', requires={ MOBILE_MASH_SMALL=3 }, initialStock=0, side=RED, category=Group.Category.GROUND, build=singleUnit('BTR_D') }
|
||||
|
||||
-- =========================
|
||||
-- Troop Type Definitions
|
||||
-- =========================
|
||||
-- These define the composition of troop squads for Load/Unload Troops (NOT crates)
|
||||
-- Structure: { label, size, unitsBlue, unitsRed, units (fallback) }
|
||||
local troops = {}
|
||||
|
||||
-- Assault Squad: general-purpose rifles/MG
|
||||
troops['AS'] = {
|
||||
label = 'Assault Squad',
|
||||
size = 8,
|
||||
unitsBlue = { 'Soldier M4', 'Soldier M249' },
|
||||
unitsRed = { 'Infantry AK', 'Infantry AK ver3' },
|
||||
units = { 'Infantry AK' },
|
||||
}
|
||||
|
||||
-- MANPADS Team: Anti-air element
|
||||
troops['AA'] = {
|
||||
label = 'MANPADS Team',
|
||||
size = 4,
|
||||
unitsBlue = { 'Soldier stinger', 'Stinger comm' },
|
||||
unitsRed = { 'SA-18 Igla-S manpad', 'SA-18 Igla comm' },
|
||||
units = { 'Infantry AK' },
|
||||
}
|
||||
|
||||
-- AT Team: Anti-tank element
|
||||
troops['AT'] = {
|
||||
label = 'AT Team',
|
||||
size = 4,
|
||||
unitsBlue = { 'Soldier RPG', 'Soldier RPG' },
|
||||
unitsRed = { 'Soldier RPG', 'Soldier RPG' },
|
||||
units = { 'Infantry AK' },
|
||||
}
|
||||
|
||||
-- Mortar Team: Indirect fire element
|
||||
troops['AR'] = {
|
||||
label = 'Mortar Team',
|
||||
size = 4,
|
||||
unitsBlue = { '2B11 mortar' },
|
||||
unitsRed = { '2B11 mortar' },
|
||||
units = { '2B11 mortar' },
|
||||
}
|
||||
|
||||
-- Export troop types
|
||||
_CTLD_TROOP_TYPES = troops
|
||||
|
||||
-- Also export as a global for mission setups that load via DO SCRIPT FILE (no return capture)
|
||||
_CTLD_EXTRACTED_CATALOG = cat
|
||||
return cat
|
||||
Loading…
x
Reference in New Issue
Block a user