159 lines
5 KiB
Markdown
159 lines
5 KiB
Markdown
|
|
# **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.
|
||
|
|
- **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"
|
||
|
|
}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"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.
|
||
|
|
|
||
|
|
### **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.
|