aether-shards/src/assets/data/missions/mission-schema.md

179 lines
6 KiB
Markdown
Raw Normal View History

# **Mission JSON Schema Reference**
This document defines the data structure for Game Missions. It covers configuration for World Generation, Narrative logic, Objectives, and Rewards.
## **1\. The Structure (Overview)**
A Mission file is a JSON object with the following top-level keys:
- **config**: Meta-data (ID, Title, Difficulty).
- **biome**: Instructions for the Procedural Generator.
- **deployment**: Constraints on who can go on the mission.
- **narrative**: Hooks for Intro/Outro and scripted events.
- **enemy_spawns**: Specific enemy types and counts to spawn at mission start.
- **objectives**: Win/Loss conditions.
- **modifiers**: Global rules (e.g., "Fog of War", "High Gravity").
- **rewards**: What the player gets for success.
## **2\. Complete Example (The "Kitchen Sink" Mission)**
This example utilizes every capability of the system.
```js
{
"id": "MISSION_ACT1_FINAL",
"type": "STORY",
"config": {
"title": "Operation: Broken Sky",
"description": "The Iron Legion demands we silence the Shardborn Artillery. Expect heavy resistance.",
"difficulty_tier": 3,
"recommended_level": 5
},
"biome": {
"type": "BIOME_RUSTING_WASTES",
"generator_config": {
"seed_type": "RANDOM",
"size": { "x": 30, "y": 10, "z": 30 },
"room_count": 8,
"density": "HIGH"
},
"hazards": ["HAZARD_ACID_POOLS", "HAZARD_ELECTRICITY"]
},
"deployment": {
"squad_size_limit": 4,
"forced_units": ["UNIT_HERO_VANGUARD"],
"banned_classes": ["CLASS_SCAVENGER"]
},
"narrative": {
"intro_sequence": "NARRATIVE_ACT1_FINAL_INTRO",
"outro_success": "NARRATIVE_ACT1_FINAL_WIN",
"outro_failure": "NARRATIVE_ACT1_FINAL_LOSE",
"scripted_events": [
{
"trigger": "ON_TURN_START",
"turn_index": 3,
"action": "PLAY_SEQUENCE",
"sequence_id": "NARRATIVE_MID_BATTLE_TAUNT"
},
{
"trigger": "ON_UNIT_DEATH",
"target_tag": "ENEMY_BOSS",
"action": "PLAY_SEQUENCE",
"sequence_id": "NARRATIVE_BOSS_PHASE_2"
}
]
},
"enemy_spawns": [
{
"enemy_def_id": "ENEMY_BOSS_ARTILLERY",
"count": 1
},
{
"enemy_def_id": "ENEMY_SHARDBORN_SENTINEL",
"count": 3
}
],
"objectives": {
"primary": [
{
"id": "OBJ_KILL_BOSS",
"type": "ELIMINATE_UNIT",
"target_def_id": "ENEMY_BOSS_ARTILLERY",
"description": "Destroy the Shardborn Artillery Construct."
}
],
"secondary": [
{
"id": "OBJ_TIME_LIMIT",
"type": "COMPLETE_BEFORE_TURN",
"turn_limit": 10,
"description": "Finish within 10 Turns."
},
{
"id": "OBJ_NO_DEATHS",
"type": "SQUAD_SURVIVAL",
"min_alive": 4,
"description": "Ensure entire squad survives."
}
],
"failure_conditions": [
{ "type": "SQUAD_WIPE" },
{ "type": "VIP_DEATH", "target_tag": "VIP_ESCORT" }
]
},
"modifiers": [
{
"type": "GLOBAL_EFFECT",
"effect_id": "EFFECT_ACID_RAIN",
"description": "All units take 5 damage at start of turn."
},
{
"type": "STAT_MODIFIER",
"target_team": "ENEMY",
"stat": "attack",
"value": 1.2
}
],
"rewards": {
"guaranteed": {
"xp": 500,
"currency": { "aether_shards": 200, "ancient_cores": 1 },
"items": ["ITEM_ELITE_BLAST_PLATE"],
"unlocks": ["CLASS_SAPPER"]
},
"conditional": [
{
"objective_id": "OBJ_TIME_LIMIT",
"reward": { "currency": { "aether_shards": 100 } }
}
],
"faction_reputation": {
"IRON_LEGION": 50,
"COGWORK_CONCORD": -10
}
}
}
```
## **3\. Field Definitions & Logic Requirements**
### **Deployment Constraints**
- **forced_units**: The TeamBuilder UI must check this array and auto-fill slots with these units (locking them so they can't be removed).
- **banned_classes**: The UI must disable these cards in the Roster.
- **suggested_units**: (Optional) Array of class/unit IDs recommended for this mission. Useful for tutorials to guide player selection. The UI should highlight or recommend these units.
- **tutorial_hint**: (Optional) Text to display as a tutorial overlay during the deployment phase. Should point to UI elements (e.g., "Drag units from the bench to the Green Zone.").
### **Enemy Spawns**
- **enemy_spawns**: Array of enemy spawn definitions. Each entry specifies an enemy definition ID and count.
- **enemy_def_id**: The enemy unit definition ID (e.g., 'ENEMY_SHARDBORN_SENTINEL'). Must match an enemy definition in the UnitRegistry.
- **count**: Number of this enemy type to spawn at mission start.
- The GameLoop's `finalizeDeployment()` method should read this array and spawn the specified enemies in the enemy spawn zone.
### **Objectives Types**
The MissionManager needs logic to handle these specific types:
| Type | Data Required | Logic |
| :----------------- | :--------------- | :------------------------------------------------------ |
| **ELIMINATE_ALL** | None | Monitor unitManager. If enemies.length \=== 0, Success. |
| **ELIMINATE_UNIT** | target_def_id | Monitor ON_DEATH events. If victim ID matches, Success. |
| **INTERACT** | target_object_id | Monitor ON_INTERACT. If object matches, Success. |
| **REACH_ZONE** | zone_coords | Monitor ON_MOVE. If unit ends turn in zone, Success. |
| **SURVIVE** | turn_count | Monitor ON_TURN_END. If count reached, Success. |
| **ESCORT** | vip_id | If VIP dies, Immediate Failure. |
### **Scripted Events (Triggers)**
The GameLoop needs an Event Bus listener that checks these triggers every time an action happens.
- **ON_TURN_START**: Checks turnSystem.currentTurn.
- **ON_UNIT_SPAWN**: Useful for ambush events.
- **ON_HEALTH_PERCENT**: "Boss enters Phase 2 at 50% HP".
### **Rewards**
- **unlocks**: Must call MetaProgression.unlockClass(id).
- **faction_reputation**: Must update the persistent UserProfile faction standing.