2026-01-02 00:08:54 +00:00
|
|
|
# **Procedural Mission Specification: Side Ops**
|
|
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
This document defines the logic for generating "Side Ops" that match the fidelity of Story Missions.
|
2026-01-02 00:08:54 +00:00
|
|
|
|
|
|
|
|
## **1. System Architecture**
|
|
|
|
|
|
|
|
|
|
Class: MissionGenerator
|
2026-01-02 23:25:26 +00:00
|
|
|
Responsibility: Factory that produces temporary Mission objects.
|
|
|
|
|
Triggers: Daily Reset, Mission Complete.
|
2026-01-02 00:08:54 +00:00
|
|
|
|
|
|
|
|
## **2. Generation Logic**
|
|
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
### **A. Naming & Flavor (The Hook)**
|
2026-01-02 00:08:54 +00:00
|
|
|
|
|
|
|
|
Missions use a context-aware "Operation: [Adjective] [Noun] [Numeral]" format.
|
|
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
- **Skirmish Nouns:** _Thunder, Storm, Iron, Fury, Shield, Hammer._
|
|
|
|
|
- **Salvage Nouns:** _Cache, Vault, Echo, Spark, Harvest, Trove._
|
2026-01-03 06:02:27 +00:00
|
|
|
- **Eliminate Unit Nouns:** _Viper, Dagger, Fang, Night, Razor, Sting._
|
2026-01-02 23:25:26 +00:00
|
|
|
- **Recon Nouns:** _Eye, Watch, Path, Horizon, Whisper, Scope._
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
### **B. Narrative Synthesis (Dynamic Context)**
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
Unlike Story missions which link to static files, Side Ops generate a **Narrative Sequence** on the fly to give context.
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
- **Intro Template:**
|
|
|
|
|
- _Speaker:_ Faction Representative (e.g., General Kael for Iron Legion requests).
|
|
|
|
|
- _Text:_ "Commander, [Faction] scouts report [EnemyType] activity in the [Biome]. We need you to [ObjectiveVerb] them immediately."
|
|
|
|
|
- **Outro Template:**
|
|
|
|
|
- _Speaker:_ Faction Representative.
|
|
|
|
|
- _Text:_ "Target neutralized. Funds transferred. Good hunting, Explorer."
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
_The Generator creates these JSON blobs and registers them with the NarrativeManager using a generated ID (e.g., NARRATIVE_SIDE_123_INTRO)._
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
### **C. Biome & Hazards**
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
- Select Unlocked Region.
|
|
|
|
|
- **Roll Density:** Low (Scouting), Medium (Standard), High (Warzone).
|
|
|
|
|
- **Roll Hazards:** 30% chance to add a Biome-specific hazard (e.g., HAZARD_POISON_SPORES for Fungal Caves) to make the tactical layer interesting.
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
### **D. Mission Archetypes (Objectives)**
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
#### **1. Skirmish (Combat Focus)**
|
2026-01-02 00:08:54 +00:00
|
|
|
|
|
|
|
|
- **Objective:** ELIMINATE_ALL.
|
2026-01-02 23:25:26 +00:00
|
|
|
- **Icon:** assets/icons/mission_sword.png.
|
|
|
|
|
- **Config:** Medium Density, Standard Rewards.
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
#### **2. Salvage (Resource Focus)**
|
2026-01-02 00:08:54 +00:00
|
|
|
|
|
|
|
|
- **Objective:** INTERACT with 3-5 "Supply Crates".
|
2026-01-02 23:25:26 +00:00
|
|
|
- **Icon:** assets/icons/mission_coin.png.
|
|
|
|
|
- **Config:** High Cover Density.
|
|
|
|
|
- **Reward Bonus:** Items/Materials.
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-03 06:02:27 +00:00
|
|
|
#### **3. Eliminate Unit (Boss Focus)**
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
- **Objective:** ELIMINATE_UNIT (Named Elite).
|
|
|
|
|
- **Icon:** assets/icons/mission_skull.png.
|
|
|
|
|
- **Config:** Spawns a Unit with stats: { hp: 200%, attack: 150% } and a unique name (e.g., "Gorgon the Rot").
|
|
|
|
|
- **Reward Bonus:** High Currency.
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
#### **4. Recon (Speed Focus)**
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
- **Objective:** REACH_ZONE (3 Zones).
|
|
|
|
|
- **Icon:** assets/icons/mission_search.png.
|
|
|
|
|
- **Config:** Large Map, Low Density.
|
|
|
|
|
- **Turn Limit:** 8 Turns.
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
## **3. Rewards Scaling**
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
- **Currency:** Base (50) _ TierMultiplier _ Random(0.8, 1.2).
|
|
|
|
|
- **Reputation:** +10 to Patron Faction.
|
|
|
|
|
- **Loot:** 20% chance for a Chest Key or Consumable Bundle.
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
## **4. Implementation Prompt**
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
"Create src/systems/MissionGenerator.js.
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
1. **Templates:** Define text templates for Intros/Outros for each Faction Leader.
|
|
|
|
|
2. **Generate:** Implement generateSideOp(tier, regionId).
|
|
|
|
|
- Construct the Mission object.
|
|
|
|
|
- Construct the Narrative objects (Intro/Outro) dynamically.
|
|
|
|
|
- Register Narratives to NarrativeManager (or return them to be registered).
|
|
|
|
|
3. **Hazards:** Map Biomes to valid Hazards and roll for inclusion."
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
## **5. Detailed Example (Generated Output)**
|
2026-01-02 00:08:54 +00:00
|
|
|
|
2026-01-02 23:25:26 +00:00
|
|
|
This is what the output JSON looks like—indistinguishable from a Story Mission to the Game Engine.
|
2026-01-02 00:08:54 +00:00
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"id": "SIDE_OP_170932",
|
|
|
|
|
"type": "SIDE_QUEST",
|
|
|
|
|
"config": {
|
|
|
|
|
"title": "Operation: Crimson Viper II",
|
2026-01-02 23:25:26 +00:00
|
|
|
"description": "General Kael requests the elimination of a high-value target in the Crystal Spires.",
|
2026-01-02 00:08:54 +00:00
|
|
|
"difficulty_tier": 2,
|
2026-01-02 23:25:26 +00:00
|
|
|
"recommended_level": 3,
|
|
|
|
|
"icon": "assets/icons/mission_skull.png"
|
2026-01-02 00:08:54 +00:00
|
|
|
},
|
|
|
|
|
"biome": {
|
|
|
|
|
"type": "BIOME_CRYSTAL_SPIRES",
|
|
|
|
|
"generator_config": {
|
|
|
|
|
"seed_type": "RANDOM",
|
2026-01-02 23:25:26 +00:00
|
|
|
"seed": 982374,
|
|
|
|
|
"size": { "x": 22, "y": 12, "z": 22 },
|
|
|
|
|
"room_count": 0,
|
|
|
|
|
"density": "MEDIUM"
|
|
|
|
|
},
|
|
|
|
|
"hazards": ["HAZARD_GRAVITY_FLUX"]
|
|
|
|
|
},
|
|
|
|
|
"deployment": {
|
|
|
|
|
"squad_size_limit": 4
|
|
|
|
|
},
|
|
|
|
|
"narrative": {
|
|
|
|
|
"intro_sequence": "NARRATIVE_SIDE_170932_INTRO",
|
|
|
|
|
"outro_success": "NARRATIVE_SIDE_170932_OUTRO",
|
|
|
|
|
|
|
|
|
|
"_dynamic_data": {
|
|
|
|
|
"intro": {
|
|
|
|
|
"id": "NARRATIVE_SIDE_170932_INTRO",
|
|
|
|
|
"nodes": [
|
|
|
|
|
{
|
|
|
|
|
"id": "1",
|
|
|
|
|
"type": "DIALOGUE",
|
|
|
|
|
"speaker": "General Kael",
|
|
|
|
|
"portrait": "assets/images/portraits/vanguard.png",
|
|
|
|
|
"text": "Scouts have spotted 'Krag the Breaker' in this sector. He's dangerous. Put him down.",
|
|
|
|
|
"next": "END"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"outro": {
|
|
|
|
|
"id": "NARRATIVE_SIDE_170932_OUTRO",
|
|
|
|
|
"nodes": [
|
|
|
|
|
{
|
|
|
|
|
"id": "1",
|
|
|
|
|
"type": "DIALOGUE",
|
|
|
|
|
"speaker": "General Kael",
|
|
|
|
|
"portrait": "assets/images/portraits/vanguard.png",
|
|
|
|
|
"text": "Target confirmed KIA. Good work, soldier. Funds transferred.",
|
|
|
|
|
"next": "END"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
2026-01-02 00:08:54 +00:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"objectives": {
|
|
|
|
|
"primary": [
|
|
|
|
|
{
|
|
|
|
|
"id": "OBJ_HUNT",
|
|
|
|
|
"type": "ELIMINATE_UNIT",
|
2026-01-02 23:25:26 +00:00
|
|
|
"target_def_id": "ENEMY_ELITE_ECHO_KRAG",
|
|
|
|
|
"description": "Eliminate Krag the Breaker."
|
2026-01-02 00:08:54 +00:00
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"rewards": {
|
|
|
|
|
"guaranteed": {
|
2026-01-02 23:25:26 +00:00
|
|
|
"xp": 350,
|
|
|
|
|
"currency": { "aether_shards": 150 }
|
2026-01-02 00:08:54 +00:00
|
|
|
},
|
2026-01-02 23:25:26 +00:00
|
|
|
"faction_reputation": { "IRON_LEGION": 15 }
|
2026-01-02 00:08:54 +00:00
|
|
|
},
|
|
|
|
|
"expiresIn": 3
|
|
|
|
|
}
|
|
|
|
|
```
|