Compare commits

..

3 commits

98 changed files with 2441 additions and 27 deletions

View file

@ -43,41 +43,55 @@ A tactical turn-based roguelike strategy game built with Three.js, featuring pro
## Project Structure ## Project Structure
``` ```
specs/ # Detailed feature specifications and design docs
src/ src/
├── assets/ ├── assets/
│ ├── data/ │ ├── data/
│ │ ├── classes/ # Character class definitions (JSON) │ │ ├── classes/ # Character class definitions (JSON)
│ │ ├── missions/ # Mission configurations │ │ ├── effects/ # Status effects and abilities
│ │ └── narrative/ # Dialogue sequences │ │ ├── missions/ # Mission configurations
│ └── images/ # Character portraits and assets │ │ ├── narrative/ # Dialogue sequences
│ │ ├── skill_trees/ # Class skill tree templates
│ │ └── skills/ # Individual skill definitions
│ └── images/ # Character portraits and assets
├── core/ ├── core/
│ ├── GameLoop.js # Main game loop and Three.js setup │ ├── GameLoop.js # Main game loop and Three.js setup
│ ├── GameStateManager.js # Application state management │ ├── GameStateManager.js # Application state management
│ ├── InputManager.js # Input handling (keyboard/gamepad) │ ├── InputManager.js # Input handling (keyboard/gamepad)
│ └── Persistence.js # Save/load system │ └── Persistence.js # Save/load system
├── factories/
│ └── SkillTreeFactory.js # Skill tree generation logic
├── generation/ ├── generation/
│ ├── BaseGenerator.js # Base class for world generators │ ├── BaseGenerator.js # Base class for world generators
│ ├── CaveGenerator.js # Cave biome generator │ ├── CaveGenerator.js # Cave biome generator
│ ├── RuinGenerator.js # Ruin biome generator │ ├── RuinGenerator.js # Ruin biome generator
│ └── textures/ # Procedural texture generators │ └── textures/ # Procedural texture generators
├── grid/ ├── grid/
│ ├── VoxelGrid.js # 3D voxel grid data structure │ ├── VoxelGrid.js # 3D voxel grid data structure
│ └── VoxelManager.js # Voxel rendering and mesh management │ └── VoxelManager.js # Voxel rendering and mesh management
├── managers/ ├── managers/
│ ├── MissionManager.js # Mission progression and objectives │ ├── InventoryManager.js # Equipment and inventory
│ ├── NarrativeManager.js # Dialogue and story sequences │ ├── ItemRegistry.js # Item definitions
│ ├── RosterManager.js # Character roster management │ ├── MarketManager.js # Shop and trading logic
│ └── UnitManager.js # Unit lifecycle and combat state │ ├── MissionManager.js # Mission progression and objectives
│ ├── NarrativeManager.js # Dialogue and story sequences
│ ├── ResearchManager.js # Tech tree and upgrades
│ ├── RosterManager.js # Character roster management
│ ├── SkillRegistry.js # Skill definitions map
│ └── UnitManager.js # Unit lifecycle and combat state
├── ui/ ├── ui/
│ ├── deployment-hud.js # Pre-battle deployment interface │ ├── deployment-hud.js # Pre-battle deployment interface
│ ├── team-builder.js # Squad composition screen │ ├── team-builder.js # Squad composition screen
│ ├── game-viewport.js # 3D game viewport component │ ├── game-viewport.js # 3D game viewport component
│ └── dialogue-overlay.js # Narrative dialogue display │ └── dialogue-overlay.js # Narrative dialogue display
├── units/ ├── units/
│ ├── Unit.js # Base unit class │ ├── Unit.js # Base unit class
│ ├── Explorer.js # Player-controlled units │ ├── Explorer.js # Player-controlled units
│ └── Enemy.js # Enemy AI units │ └── Enemy.js # Enemy AI units
└── index.js # Application entry point ├── utils/
│ ├── SeededRandom.js # Deterministic RNG
│ └── SimplexNoise.js # Noise generation
└── index.js # Application entry point
``` ```
## Getting Started ## Getting Started
@ -157,6 +171,15 @@ npm run test:watch
- **Narrative**: Intro and outro sequences that advance the story - **Narrative**: Intro and outro sequences that advance the story
- **Campaign Progression**: Unlock new missions as you complete objectives - **Campaign Progression**: Unlock new missions as you complete objectives
## Documentation
For detailed specifications of game systems, please see the `specs/` directory:
- [Character Sheet](specs/Character_Sheet.spec.md)
- [Combat System](specs/CombatState.spec.md)
- [Skill Trees](specs/Skill_Tree.spec.md)
- [Inventory](specs/Inventory.spec.md)
- [Procedural Missions](specs/Procedural_Missions.spec.md)
## Development Status ## Development Status
This is an active development project. Current features include: This is an active development project. Current features include:
@ -168,14 +191,16 @@ This is an active development project. Current features include:
- ✅ Mission system foundation - ✅ Mission system foundation
- ✅ Basic world generation - ✅ Basic world generation
- ✅ Save/load system - ✅ Save/load system
- ✅ Turn-based combat system
- ✅ AI behavior
- ✅ Skill tree implementation
- ✅ Equipment system
Planned features: Planned features / In Progress:
- 🔄 Turn-based combat system - 🔄 Additional biomes (Crystal Spires)
- 🔄 AI behavior - 🔄 Advanced AI behavior (Pack tactics, Retreat)
- 🔄 Skill tree implementation - 🔄 Endgame campaign content
- 🔄 Equipment system
- 🔄 Additional biomes and missions
## License ## License

View file

@ -126,3 +126,53 @@ Voice: Soft, cryptic, sorrowful, hopeful.
- **DO:** Have her pity the enemies rather than hate them. - **DO:** Have her pity the enemies rather than hate them.
- **DON'T:** Have her use tech jargon or talk about money. - **DON'T:** Have her use tech jargon or talk about money.
- **Catchphrase:** "The roots remember." / "Restore the balance." - **Catchphrase:** "The roots remember." / "Restore the balance."
## **6. Ambassador sol'Ria (The Neutral Coalition)**
Role: Diplomat / Elite.
Archetype: The Entitled Noble.
Voice: Panicked, demanding, transactional.
### **Core Traits**
- **Haughty:** Accustomed to luxury and command, utterly unprepared for the battlefield.
- **Transactional:** Believes safety, loyalty, and silence can all be bought.
- **Cowardly:** terrified of physical danger and disgusted by "common" combat.
### **Speech Patterns**
- **Demands:** "I demand an escort!" "Do you know who I am?"
- **Bribes:** "Double the fee!" "Hazard pay!"
- **High Fantasy/Formal:** Uses "Thee" or "Thou" occasionally when trying to sound authoritative, but breaks into panic easily.
### **Writing Guidelines**
- **DO:** Have them complain about the dirt/noise/danger.
- **DO:** Make them treat the squad as servants.
- **DON'T:** Use sci-fi terms like "Interstellar" or "light-speed". Keep it to "Realms," "Borders," "Treaties."
- **Catchphrase:** "Do you have any idea how much my silence costs?" / "Get me out of here!"
## **7. The Arch-Corruptor (The Void)**
Role: Primordial Entity.
Archetype: The Nihilistic God.
Voice: Booming, abstract, inevitable.
### **Core Traits**
- **Inevitable:** Views resistance as a temporary annoyance.
- **Abstract:** Speaks of "The Stillness," "The Silence," "The End of Pain."
- **Pitying:** Truly believes that erasing existence is an act of mercy.
### **Speech Patterns**
- **ALL CAPS (Optional):** Or bold text to imply weight.
- **Absolute Statements:** "It is finished." "All things end."
- **Concepts as Nouns:** "I brings the Peace," "You fight the Tide."
### **Writing Guidelines**
- **DO:** Focus on the "Peace of Non-existence."
- **DO:** Make promises of an end to suffering.
- **DON'T:** Have them sound angry or petty. They are a force of nature.
- **Catchphrase:** "Peace... in Silence." / "The Stillness comes."

View file

@ -0,0 +1,47 @@
{
"id": "MISSION_ACT1_01",
"type": "STORY",
"config": {
"title": "Protocol: First Descent",
"description": "Establish a foothold in the Rusting Wastes. Director Vorn is monitoring your progress.",
"difficulty_tier": 1,
"recommended_level": 1,
"icon": "assets/icons/mission_sword.png"
},
"biome": {
"type": "BIOME_RUSTING_WASTES",
"generator_config": {
"seed_type": "FIXED",
"seed": 12345,
"size": {
"x": 20,
"y": 6,
"z": 20
}
}
},
"narrative": {
"intro_sequence": "NARRATIVE_01_INTRO",
"outro_success": "NARRATIVE_01_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_KILL_2",
"type": "ELIMINATE_ENEMIES",
"target_count": 2,
"description": "Eliminate 2 Shardborn Sentinels."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"CLASS_TINKER"
],
"currency": {
"aether_shards": 100
}
}
}
}

View file

@ -0,0 +1,49 @@
{
"id": "MISSION_ACT1_02",
"type": "STORY",
"config": {
"title": "The Signal",
"description": "A subspace relay in the Fungal Caves is jamming trade routes. Clear the interference.",
"difficulty_tier": 1,
"recommended_level": 2,
"icon": "assets/icons/mission_signal.png"
},
"biome": {
"type": "BIOME_FUNGAL_CAVES",
"generator_config": {
"seed_type": "RANDOM",
"room_count": 5,
"density": "MEDIUM"
},
"hazards": [
"HAZARD_POISON_SPORES"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_02_INTRO",
"outro_success": "NARRATIVE_02_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_FIX_RELAY",
"type": "INTERACT",
"target_object_id": "OBJ_SIGNAL_RELAY",
"description": "Reboot the Ancient Signal Relay."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"CLASS_SCAVENGER"
],
"currency": {
"aether_shards": 150
}
},
"faction_reputation": {
"GOLDEN_EXCHANGE": 25
}
}
}

View file

@ -0,0 +1,45 @@
{
"id": "MISSION_ACT1_03",
"type": "STORY",
"config": {
"title": "The Foundation",
"description": "Shardborn sappers are undermining the Hub's cliffside foundation. Defend the perimeter.",
"difficulty_tier": 2,
"recommended_level": 3,
"icon": "assets/icons/mission_shield.png"
},
"biome": {
"type": "BIOME_CONTESTED_FRONTIER",
"generator_config": {
"seed_type": "RANDOM",
"density": "CHOKE_POINT"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_03_INTRO",
"outro_success": "NARRATIVE_03_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_HOLD",
"type": "SURVIVE",
"turn_limit": 5,
"description": "Prevent the Shardborn from reaching the cliff edge for 5 turns."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"CLASS_VANGUARD"
],
"currency": {
"aether_shards": 200
}
},
"faction_reputation": {
"IRON_LEGION": 25
}
}
}

View file

@ -0,0 +1,61 @@
{
"id": "MISSION_STORY_04",
"type": "STORY",
"config": {
"title": "The First Truth",
"description": "Deep scans indicate a survivor in the Void-Seep. Retrieval is mandatory. Extreme Caution advised.",
"difficulty_tier": 3,
"recommended_level": 4,
"icon": "assets/icons/mission_void.png"
},
"biome": {
"type": "BIOME_VOID_SEEP",
"generator_config": {
"seed_type": "RANDOM",
"size": {
"x": 20,
"y": 8,
"z": 20
},
"room_count": 1,
"density": "ARENA"
},
"hazards": [
"HAZARD_VOID_RIFTS"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_04_INTRO",
"outro_success": "NARRATIVE_04_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_SURVIVE",
"type": "SURVIVE",
"turn_limit": 8,
"description": "Survive the Shardborn assault."
},
{
"id": "OBJ_EXTRACT",
"type": "REACH_ZONE",
"zone_coords": {
"x": 10,
"y": 1,
"z": 10
},
"description": "Reach the Extraction Elevator."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"CLASS_BATTLE_MAGE"
],
"currency": {
"ancient_cores": 1
}
}
}
}

View file

@ -0,0 +1,39 @@
{
"id": "MISSION_STORY_05",
"type": "STORY",
"config": {
"title": "Line in the Sand",
"description": "Tensions between the Iron Legion and Golden Exchange have boiled over. Pick a side and intervene.",
"difficulty_tier": 3,
"recommended_level": 5,
"icon": "assets/icons/mission_conflict.png"
},
"biome": {
"type": "BIOME_CONTESTED_FRONTIER",
"generator_config": {
"seed_type": "RANDOM",
"density": "SKIRMISH"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_05_INTRO",
"outro_success": "NARRATIVE_05_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_DEFEAT_COMMANDER",
"type": "ELIMINATE_UNIT",
"target_def_id": "DYNAMIC_COMMANDER",
"description": "Defeat the opposing Commander."
}
]
},
"rewards": {
"guaranteed": {
"currency": {
"aether_shards": 500
}
}
}
}

View file

@ -0,0 +1,55 @@
{
"id": "MISSION_STORY_06",
"type": "STORY",
"config": {
"title": "Unstable Aether",
"description": "Arch-Librarian Elara needs raw samples from the Crystal Spires. Warning: The crystals are harmonizing and will detonate soon.",
"difficulty_tier": 3,
"recommended_level": 6,
"icon": "assets/icons/mission_crystal.png"
},
"biome": {
"type": "BIOME_CRYSTAL_SPIRES",
"hazards": [
"HAZARD_EXPLOSION_WARNING"
],
"generator_config": {
"seed_type": "RANDOM",
"size": {
"x": 18,
"y": 15,
"z": 18
},
"density": "LOW"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_06_INTRO",
"outro_success": "NARRATIVE_06_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_COLLECT",
"type": "INTERACT",
"target_object_id": "OBJ_VOLATILE_CRYSTAL",
"target_count": 3,
"description": "Stabilize 3 Volatile Crystals before Turn 6."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"MASTERY_AETHER_WEAVER"
],
"currency": {
"aether_shards": 400,
"ancient_cores": 1
}
},
"faction_reputation": {
"ARCANE_DOMINION": 50
}
}
}

View file

@ -0,0 +1,48 @@
{
"id": "MISSION_STORY_07",
"type": "STORY",
"config": {
"title": "Factory Reset",
"description": "Director Vorn has located a dormant munitions factory. Reboot the main generator while holding off the scavengers.",
"difficulty_tier": 3,
"recommended_level": 6,
"icon": "assets/icons/mission_gear.png"
},
"biome": {
"type": "BIOME_RUSTING_WASTES",
"generator_config": {
"seed_type": "RANDOM",
"room_count": 6,
"density": "HIGH"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_07_INTRO",
"outro_success": "NARRATIVE_07_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_CONSOLE",
"type": "INTERACT",
"target_object_id": "OBJ_GENERATOR_CONSOLE",
"target_count": 3,
"description": "Activate the 3 Power Consoles."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"MASTERY_TINKER"
],
"currency": {
"aether_shards": 500,
"ancient_cores": 2
}
},
"faction_reputation": {
"COGWORK_CONCORD": 50
}
}
}

View file

@ -0,0 +1,47 @@
{
"id": "MISSION_STORY_08",
"type": "STORY",
"config": {
"title": "The Construct",
"description": "Vorn's factory reset woke up something big. A prototype siege engine is rampaging through Sector 9.",
"difficulty_tier": 4,
"recommended_level": 7,
"icon": "assets/icons/mission_boss_tank.png"
},
"biome": {
"type": "BIOME_RUSTING_WASTES",
"generator_config": {
"density": "ARENA"
},
"hazards": [
"HAZARD_OIL_SLICKS"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_08_INTRO",
"outro_success": "NARRATIVE_08_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_KILL_BOSS",
"type": "ELIMINATE_UNIT",
"target_def_id": "ENEMY_BOSS_CONSTRUCT",
"description": "Destroy the Siege Construct."
}
]
},
"rewards": {
"guaranteed": {
"items": [
"ITEM_TITAN_PLATING"
],
"currency": {
"ancient_cores": 3
}
},
"faction_reputation": {
"COGWORK_CONCORD": 75
}
}
}

View file

@ -0,0 +1,43 @@
{
"id": "MISSION_STORY_09",
"type": "STORY",
"config": {
"title": "Data Recovery",
"description": "A Cogwork airship carrying factory logs crashed in the Frontier. Secure the drive before bandits do.",
"difficulty_tier": 3,
"recommended_level": 7,
"icon": "assets/icons/mission_intel.png"
},
"biome": {
"type": "BIOME_CONTESTED_FRONTIER",
"generator_config": {
"seed_type": "RANDOM",
"size": {
"x": 30,
"y": 4,
"z": 30
}
}
},
"narrative": {
"intro_sequence": "NARRATIVE_09_INTRO",
"outro_success": "NARRATIVE_09_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_KILL_THIEF",
"type": "ELIMINATE_UNIT",
"target_def_id": "ENEMY_BANDIT_LEADER",
"description": "Retrieve the drive from the Bandit Leader."
}
]
},
"rewards": {
"guaranteed": {
"items": [
"ITEM_DATA_DRIVE_RELIC"
]
}
}
}

View file

@ -0,0 +1,41 @@
{
"id": "MISSION_STORY_10",
"type": "STORY",
"config": {
"title": "Hold the Line",
"description": "General Kael has ordered a defense of Bridge 4. The Shardborn are pushing hard. Do not let them cross.",
"difficulty_tier": 3,
"recommended_level": 7,
"icon": "assets/icons/mission_shield.png"
},
"biome": {
"type": "BIOME_CONTESTED_FRONTIER",
"generator_config": {
"density": "CHOKE_POINT"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_10_INTRO",
"outro_success": "NARRATIVE_10_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_SURVIVE",
"type": "SURVIVE",
"turn_limit": 8,
"description": "Hold the bridge for 8 Turns."
}
]
},
"rewards": {
"guaranteed": {
"items": [
"ITEM_IRON_TOWER_SHIELD"
]
},
"faction_reputation": {
"IRON_LEGION": 40
}
}
}

View file

@ -0,0 +1,46 @@
{
"id": "MISSION_STORY_11",
"type": "STORY",
"config": {
"title": "Breach and Clear",
"description": "We've tracked the assault force back to a nest in the Rusting Wastes. Burn it out.",
"difficulty_tier": 3,
"recommended_level": 8,
"icon": "assets/icons/mission_sword.png"
},
"biome": {
"type": "BIOME_RUSTING_WASTES",
"hazards": [
"HAZARD_NEST_SPORES"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_11_INTRO",
"outro_success": "NARRATIVE_11_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_CLEAR",
"type": "ELIMINATE_ALL",
"description": "Eliminate all hostiles."
},
{
"id": "OBJ_SPAWNERS",
"type": "DESTROY_OBJECTS",
"tag": "NEST_SPAWNER",
"description": "Destroy 3 Nest Spawners."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"BLUEPRINT_HEAVY_PLATE_MK2"
]
},
"faction_reputation": {
"IRON_LEGION": 50
}
}
}

View file

@ -0,0 +1,41 @@
{
"id": "MISSION_STORY_12",
"type": "STORY",
"config": {
"title": "The Warlord",
"description": "General Kael has identified the Shardborn command unit. We are cutting off the head of the snake.",
"difficulty_tier": 4,
"recommended_level": 8,
"icon": "assets/icons/mission_boss_skull.png"
},
"biome": {
"type": "BIOME_VOID_SEEP",
"generator_config": {
"density": "ARENA"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_12_INTRO",
"outro_success": "NARRATIVE_12_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_BOSS",
"type": "ELIMINATE_UNIT",
"target_def_id": "ENEMY_BOSS_WARLORD",
"description": "Eliminate the Shardborn Warlord."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"MASTERY_VANGUARD"
]
},
"faction_reputation": {
"IRON_LEGION": 75
}
}
}

View file

@ -0,0 +1,54 @@
{
"id": "MISSION_STORY_13",
"type": "STORY",
"config": {
"title": "Supply Run",
"description": "Baroness Seraphina has a 'priority shipment' moving through the Spires. Ensure the Mule Bot reaches the extraction point.",
"difficulty_tier": 2,
"recommended_level": 6,
"icon": "assets/icons/mission_escort.png"
},
"biome": {
"type": "BIOME_CRYSTAL_SPIRES",
"generator_config": {
"density": "LINEAR_PATH"
},
"hazards": [
"HAZARD_UNSTABLE_PLATFORMS"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_13_INTRO",
"outro_success": "NARRATIVE_13_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_ESCORT",
"type": "ESCORT",
"target_def_id": "UNIT_MULE_BOT",
"description": "Protect the Mule Bot."
},
{
"id": "OBJ_EXIT",
"type": "REACH_ZONE",
"zone_coords": {
"x": 22,
"y": 5,
"z": 5
},
"description": "Guide the Mule Bot to the Sky-Dock."
}
]
},
"rewards": {
"guaranteed": {
"items": [
"ITEM_MERCENARY_CONTRACT"
]
},
"faction_reputation": {
"GOLDEN_EXCHANGE": 40
}
}
}

View file

@ -0,0 +1,48 @@
{
"id": "MISSION_STORY_14",
"type": "STORY",
"config": {
"title": "Hostile Takeover",
"description": "Red Vulture bandits have seized a lucrative mine. The Baroness wants it back intact.",
"difficulty_tier": 3,
"recommended_level": 7,
"icon": "assets/icons/mission_coin.png"
},
"biome": {
"type": "BIOME_FUNGAL_CAVES",
"generator_config": {
"density": "MEDIUM"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_14_INTRO",
"outro_success": "NARRATIVE_14_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_CLEAR",
"type": "ELIMINATE_ALL",
"description": "Remove the Red Vulture presence."
}
],
"secondary": [
{
"id": "OBJ_PRESERVE",
"type": "SQUAD_SURVIVAL",
"min_alive": 3,
"description": "Preserve Mining Equipment (Do not destroy)."
}
]
},
"rewards": {
"guaranteed": {
"currency": {
"aether_shards": 700
}
},
"faction_reputation": {
"GOLDEN_EXCHANGE": 45
}
}
}

View file

@ -0,0 +1,41 @@
{
"id": "MISSION_STORY_15",
"type": "STORY",
"config": {
"title": "The Auction",
"description": "An assassination attempt is planned during Seraphina's auction. Protect the VIP.",
"difficulty_tier": 4,
"recommended_level": 8,
"icon": "assets/icons/mission_vip.png"
},
"biome": {
"type": "BIOME_CONTESTED_FRONTIER",
"generator_config": {
"density": "OPEN_FIELD"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_15_INTRO",
"outro_success": "NARRATIVE_15_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_PROTECT",
"type": "ESCORT",
"target_def_id": "UNIT_NPC_SERAPHINA",
"description": "Protect Baroness Seraphina."
}
]
},
"rewards": {
"guaranteed": {
"items": [
"ITEM_MARKET_PASS_PLATINUM"
]
},
"faction_reputation": {
"GOLDEN_EXCHANGE": 75
}
}
}

View file

@ -0,0 +1,42 @@
{
"id": "MISSION_STORY_16",
"type": "STORY",
"config": {
"title": "Cleansing the Grove",
"description": "Elder Fira senses corruption in the Mycelial Heart. Purge the rot before it spreads.",
"difficulty_tier": 3,
"recommended_level": 7,
"icon": "assets/icons/mission_leaf.png"
},
"biome": {
"type": "BIOME_FUNGAL_CAVES",
"hazards": [
"HAZARD_REGROWING_VINES"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_16_INTRO",
"outro_success": "NARRATIVE_16_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_PURIFY",
"type": "INTERACT",
"target_object_id": "OBJ_CORRUPTED_ROOT",
"target_count": 5,
"description": "Purify 5 Corrupted Roots."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"BLUEPRINT_REGEN_RING"
]
},
"faction_reputation": {
"SILENT_SANCTUARY": 40
}
}
}

View file

@ -0,0 +1,42 @@
{
"id": "MISSION_STORY_17",
"type": "STORY",
"config": {
"title": "Lost Spirits",
"description": "Sanctuary pilgrims are lost in the mist. Find them before the Echoes do.",
"difficulty_tier": 3,
"recommended_level": 7,
"icon": "assets/icons/mission_search.png"
},
"biome": {
"type": "BIOME_CRYSTAL_SPIRES",
"hazards": [
"HAZARD_FOG"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_17_INTRO",
"outro_success": "NARRATIVE_17_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_FIND",
"type": "INTERACT",
"target_object_id": "OBJ_LOST_PILGRIM",
"target_count": 3,
"description": "Locate 3 Pilgrims."
}
]
},
"rewards": {
"guaranteed": {
"items": [
"ITEM_SPIRIT_LANTERN"
]
},
"faction_reputation": {
"SILENT_SANCTUARY": 50
}
}
}

View file

@ -0,0 +1,41 @@
{
"id": "MISSION_STORY_18",
"type": "STORY",
"config": {
"title": "The Source of Rot",
"description": "Destroy the massive Corruption Tumor feeding on the Void to save the forest.",
"difficulty_tier": 4,
"recommended_level": 8,
"icon": "assets/icons/mission_boss_plant.png"
},
"biome": {
"type": "BIOME_VOID_SEEP",
"hazards": [
"HAZARD_SPORE_VENTS"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_18_INTRO",
"outro_success": "NARRATIVE_18_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_KILL_BOSS",
"type": "ELIMINATE_UNIT",
"target_def_id": "ENEMY_BOSS_TUMOR",
"description": "Destroy the Corruption Heart."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"MASTERY_CUSTODIAN"
]
},
"faction_reputation": {
"SILENT_SANCTUARY": 75
}
}
}

View file

@ -0,0 +1,51 @@
{
"id": "MISSION_STORY_19",
"type": "STORY",
"config": {
"title": "Diplomatic Immunity",
"description": "Peace talks have collapsed. Escort Ambassador sol'Ria through the crossfire.",
"difficulty_tier": 4,
"recommended_level": 9,
"icon": "assets/icons/mission_diplomat.png"
},
"biome": {
"type": "BIOME_CONTESTED_FRONTIER",
"generator_config": {
"density": "WARZONE"
},
"hazards": [
"HAZARD_ARTILLERY_STRIKES"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_19_INTRO",
"outro_success": "NARRATIVE_19_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_ESCORT",
"type": "ESCORT",
"target_def_id": "UNIT_NPC_DIPLOMAT",
"description": "Protect Ambassador sol'Ria."
},
{
"id": "OBJ_EXIT",
"type": "REACH_ZONE",
"zone_coords": {
"x": 15,
"y": 1,
"z": 28
},
"description": "Reach the Neutral Dropship."
}
]
},
"rewards": {
"guaranteed": {
"items": [
"ITEM_PEACEKEEPER_BADGE"
]
}
}
}

View file

@ -0,0 +1,37 @@
{
"id": "MISSION_STORY_20",
"type": "STORY",
"config": {
"title": "Sabotage",
"description": "General Kael plans to bomb the Concord factory. Vorn wants you to disarm it. Choose a side.",
"difficulty_tier": 4,
"recommended_level": 9,
"icon": "assets/icons/mission_bomb.png"
},
"biome": {
"type": "BIOME_RUSTING_WASTES",
"hazards": [
"HAZARD_LIVE_WIRES"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_20_INTRO",
"outro_success": "NARRATIVE_20_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_CHOICE",
"type": "CUSTOM_CHECK",
"description": "Arm (Legion) OR Disarm (Concord) 3 Bomb Sites."
}
]
},
"rewards": {
"guaranteed": {
"currency": {
"aether_shards": 800
}
}
}
}

View file

@ -0,0 +1,38 @@
{
"id": "MISSION_STORY_21",
"type": "STORY",
"config": {
"title": "Resource War",
"description": "Dominion and Exchange forces are fighting over a pure Aether Geode. Capture and hold it.",
"difficulty_tier": 4,
"recommended_level": 9,
"icon": "assets/icons/mission_flag.png"
},
"biome": {
"type": "BIOME_CRYSTAL_SPIRES",
"hazards": [
"HAZARD_GRAVITY_FLUX"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_21_INTRO",
"outro_success": "NARRATIVE_21_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_KOTH",
"type": "KING_OF_THE_HILL",
"target_score": 100,
"description": "Control the Geode Platform."
}
]
},
"rewards": {
"guaranteed": {
"items": [
"ITEM_AETHER_LENS"
]
}
}
}

View file

@ -0,0 +1,35 @@
{
"id": "MISSION_STORY_22",
"type": "STORY",
"config": {
"title": "The False Prophet",
"description": "A charlatan is corrupting the Sanctuary monks. Silence him before he poisons their minds.",
"difficulty_tier": 4,
"recommended_level": 9,
"icon": "assets/icons/mission_skull.png"
},
"biome": {
"type": "BIOME_FUNGAL_CAVES"
},
"narrative": {
"intro_sequence": "NARRATIVE_22_INTRO",
"outro_success": "NARRATIVE_22_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_KILL_LEADER",
"type": "ELIMINATE_UNIT",
"target_def_id": "ENEMY_CULTIST_LEADER",
"description": "Eliminate the False Prophet."
}
]
},
"rewards": {
"guaranteed": {
"items": [
"ITEM_CORRUPTED_IDOL"
]
}
}
}

View file

@ -0,0 +1,47 @@
{
"id": "MISSION_STORY_23",
"type": "STORY",
"config": {
"title": "Spirequake",
"description": "The Spire is pulsing, causing massive earthquakes. Evacuate civilians from the falling debris.",
"difficulty_tier": 4,
"recommended_level": 10,
"icon": "assets/icons/mission_run.png"
},
"biome": {
"type": "BIOME_CONTESTED_FRONTIER",
"hazards": [
"HAZARD_FALLING_DEBRIS"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_23_INTRO",
"outro_success": "NARRATIVE_23_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_EVAC",
"type": "REACH_ZONE",
"zone_coords": {
"x": 25,
"y": 1,
"z": 5
},
"description": "Reach the Evac Zone."
},
{
"id": "OBJ_SURVIVE",
"type": "SURVIVE",
"turn_limit": 6
}
]
},
"rewards": {
"guaranteed": {
"currency": {
"aether_shards": 900
}
}
}
}

View file

@ -0,0 +1,37 @@
{
"id": "MISSION_STORY_24",
"type": "STORY",
"config": {
"title": "The Ultimatum",
"description": "The Shardborn are launching a massive surface invasion. Hold the line at all costs.",
"difficulty_tier": 5,
"recommended_level": 10,
"icon": "assets/icons/mission_shield.png"
},
"biome": {
"type": "BIOME_CONTESTED_FRONTIER",
"generator_config": {
"density": "EXTREME"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_24_INTRO",
"outro_success": "NARRATIVE_24_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_KILL_ALL",
"type": "ELIMINATE_ALL",
"description": "Defeat the invasion force."
}
]
},
"rewards": {
"guaranteed": {
"currency": {
"ancient_cores": 3
}
}
}
}

View file

@ -0,0 +1,39 @@
{
"id": "MISSION_STORY_25",
"type": "STORY",
"config": {
"title": "Into the Dark",
"description": "The Alliance is reforged. The way to the core is open. Secure the elevator shaft.",
"difficulty_tier": 5,
"recommended_level": 11,
"icon": "assets/icons/mission_elevator.png"
},
"biome": {
"type": "BIOME_VOID_SEEP"
},
"narrative": {
"intro_sequence": "NARRATIVE_25_INTRO",
"outro_success": "NARRATIVE_25_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_SECURE_ELEVATOR",
"type": "REACH_ZONE",
"zone_coords": {
"x": 10,
"y": 1,
"z": 18
},
"description": "Reach the Ancient Elevator."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"ACCESS_ACT_4"
]
}
}
}

View file

@ -0,0 +1,39 @@
{
"id": "MISSION_STORY_26",
"type": "STORY",
"config": {
"title": "Layer 1: The Iron Shell",
"description": "Breach the Spire's outer defenses. Destroy the Shield Generators.",
"difficulty_tier": 5,
"recommended_level": 11,
"icon": "assets/icons/mission_target.png"
},
"biome": {
"type": "BIOME_RUSTING_WASTES",
"generator_config": {
"density": "BOSS_RUSH"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_26_INTRO",
"outro_success": "NARRATIVE_26_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_DESTROY_GENS",
"type": "DESTROY_OBJECTS",
"tag": "SHIELD_GENERATOR",
"target_count": 4,
"description": "Destroy 4 Shield Generators."
}
]
},
"rewards": {
"guaranteed": {
"currency": {
"ancient_cores": 2
}
}
}
}

View file

@ -0,0 +1,42 @@
{
"id": "MISSION_STORY_27",
"type": "STORY",
"config": {
"title": "Layer 2: The Crystal Heart",
"description": "Navigate a vertical maze of shifting platforms to reach the inner sanctum.",
"difficulty_tier": 5,
"recommended_level": 12,
"icon": "assets/icons/mission_climb.png"
},
"biome": {
"type": "BIOME_CRYSTAL_SPIRES",
"hazards": [
"HAZARD_GRAVITY_FLUX_HARD"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_27_INTRO",
"outro_success": "NARRATIVE_27_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_ASCEND",
"type": "REACH_ZONE",
"zone_coords": {
"x": 15,
"y": 8,
"z": 15
},
"description": "Reach the Upper Platform."
}
]
},
"rewards": {
"guaranteed": {
"currency": {
"ancient_cores": 2
}
}
}
}

View file

@ -0,0 +1,38 @@
{
"id": "MISSION_STORY_28",
"type": "STORY",
"config": {
"title": "Layer 3: The Rotting Soul",
"description": "Survive the toxic atmosphere and hunt down the Elite Spire Titan.",
"difficulty_tier": 5,
"recommended_level": 12,
"icon": "assets/icons/mission_skull_poison.png"
},
"biome": {
"type": "BIOME_FUNGAL_CAVES",
"hazards": [
"HAZARD_TOXIC_ATMOSPHERE"
]
},
"narrative": {
"intro_sequence": "NARRATIVE_28_INTRO",
"outro_success": "NARRATIVE_28_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_KILL_TITAN",
"type": "ELIMINATE_UNIT",
"target_def_id": "ENEMY_ELITE_SPORE_TITAN",
"description": "Eliminate the Spore Titan."
}
]
},
"rewards": {
"guaranteed": {
"currency": {
"ancient_cores": 2
}
}
}
}

View file

@ -0,0 +1,34 @@
{
"id": "MISSION_STORY_29",
"type": "STORY",
"config": {
"title": "Layer 4: The Void",
"description": "Face your shadows. Defeat the dopplegangers of your own squad.",
"difficulty_tier": 5,
"recommended_level": 13,
"icon": "assets/icons/mission_shadow.png"
},
"biome": {
"type": "BIOME_VOID_SEEP"
},
"narrative": {
"intro_sequence": "NARRATIVE_29_INTRO",
"outro_success": "NARRATIVE_29_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_KILL_SHADOWS",
"type": "ELIMINATE_ALL",
"description": "Defeat the Shadow Squad."
}
]
},
"rewards": {
"guaranteed": {
"items": [
"ITEM_VOID_ESSENCE"
]
}
}
}

View file

@ -0,0 +1,38 @@
{
"id": "MISSION_STORY_30",
"type": "STORY",
"config": {
"title": "The Gatekeeper",
"description": "The Void Brute Omega stands between you and the Core. It ends here.",
"difficulty_tier": 5,
"recommended_level": 14,
"icon": "assets/icons/mission_boss_gate.png"
},
"biome": {
"type": "BIOME_VOID_SEEP",
"generator_config": {
"density": "ARENA"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_30_INTRO",
"outro_success": "NARRATIVE_30_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_KILL_OMEGA",
"type": "ELIMINATE_UNIT",
"target_def_id": "ENEMY_BOSS_VOID_BRUTE_OMEGA",
"description": "Destroy the Gatekeeper."
}
]
},
"rewards": {
"guaranteed": {
"currency": {
"ancient_cores": 5
}
}
}
}

View file

@ -0,0 +1,42 @@
{
"id": "MISSION_STORY_31",
"type": "STORY",
"config": {
"title": "Ascension",
"description": "Escort the Synchronization Device to the center of the Core. Don't let it be destroyed.",
"difficulty_tier": 5,
"recommended_level": 15,
"icon": "assets/icons/mission_core.png"
},
"biome": {
"type": "BIOME_CRYSTAL_SPIRES",
"generator_config": {
"size": {
"x": 30,
"y": 20,
"z": 30
}
}
},
"narrative": {
"intro_sequence": "NARRATIVE_31_INTRO",
"outro_success": "NARRATIVE_31_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_ESCORT_SYNC",
"type": "ESCORT",
"target_def_id": "UNIT_SYNC_DEVICE",
"description": "Protect the Sync Device."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"LIMIT_BREAK_MAX_LEVEL"
]
}
}
}

View file

@ -0,0 +1,38 @@
{
"id": "MISSION_STORY_32",
"type": "STORY",
"config": {
"title": "The Origin",
"description": "The final battle. Defeat the Arch-Corruptor and decide the fate of Aethelgard.",
"difficulty_tier": 6,
"recommended_level": 15,
"icon": "assets/icons/mission_boss_final.png"
},
"biome": {
"type": "BIOME_VOID_SEEP",
"generator_config": {
"density": "BOSS_ARENA_FINAL"
}
},
"narrative": {
"intro_sequence": "NARRATIVE_32_INTRO",
"outro_success": "NARRATIVE_32_OUTRO"
},
"objectives": {
"primary": [
{
"id": "OBJ_KILL_ARCH",
"type": "ELIMINATE_UNIT",
"target_def_id": "ENEMY_ARCH_CORRUPTOR",
"description": "Defeat the Arch-Corruptor."
}
]
},
"rewards": {
"guaranteed": {
"unlocks": [
"NEW_GAME_PLUS"
]
}
}
}

View file

@ -0,0 +1,19 @@
{
"id": "NARRATIVE_01_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "Explorer. You made it. Good. My sensors are bleeding red in Sector 4.",
"next": "2"
},
{
"id": "2",
"type": "TUTORIAL",
"speaker": "System",
"text": "This is the Deployment Phase. Place your units in the Green Zone.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_01_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "Efficient. Take these schematics—you'll need an engineer for what comes next.",
"trigger": {
"type": "UNLOCK_CLASS",
"class_id": "CLASS_TINKER"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_02_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Baroness Seraphina",
"text": "Something in the Fungal Caves is scattering our comms signals. Fix it, and I'll open my shop to you.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_02_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Baroness Seraphina",
"text": "Signal green. You're useful. The Marketplace is now open to you.",
"trigger": {
"type": "UNLOCK_CLASS",
"class_id": "CLASS_SCAVENGER"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_03_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "The Hub's foundation is cracking. Shardborn sappers are undermining the cliff. Stop them.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_03_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "Cliff secured. The Vanguard stands ready to join your roster.",
"trigger": {
"type": "UNLOCK_CLASS",
"class_id": "CLASS_VANGUARD"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,19 @@
{
"id": "NARRATIVE_04_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Entering Void-Seep Layer. Reality stability: 40%.",
"next": "2"
},
{
"id": "2",
"type": "DIALOGUE",
"speaker": "Vanguard",
"text": "Command, the Shardborn here... they are wearing torn uniforms. Like ours.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_04_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Arch-Librarian Elara",
"text": "The data confirms our fears. The Shardborn are the mutated remnants of the Ancients. But we can learn from them.",
"trigger": {
"type": "UNLOCK_CLASS",
"class_id": "CLASS_BATTLE_MAGE"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,36 @@
{
"id": "NARRATIVE_05_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Iron Legion soldiers have barricaded the road. Merchant mercenaries are preparing to breach.",
"next": "2"
},
{
"id": "2",
"type": "CHOICE",
"speaker": "Tactical Decision",
"text": "Who do you support?",
"choices": [
{
"text": "Side with Legion",
"trigger": {
"type": "SET_MISSION_VARIANT",
"variant": "VS_EXCHANGE"
},
"next": "END"
},
{
"text": "Side with Exchange",
"trigger": {
"type": "SET_MISSION_VARIANT",
"variant": "VS_LEGION"
},
"next": "END"
}
]
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_05_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "The opposing force retreats. The sector is secured.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_06_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Arch-Librarian Elara",
"text": "The resonance frequency is spiking. Get the crystals before they explode.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_06_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Arch-Librarian Elara",
"text": "Magnificent. I've shared some advanced casting techniques with your Weavers.",
"trigger": {
"type": "UNLOCK_MASTERY",
"class_id": "CLASS_WEAVER"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_07_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "The factory controls are scattered. Hit three consoles to bypass the safety lock.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_07_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "Power levels stabilizing at 200%. Haha! We're back in business!",
"trigger": {
"type": "UNLOCK_MASTERY",
"class_id": "CLASS_TINKER"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_08_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "Slight miscalculation. The factory printed a Series-9 Siege Engine. Dismantle it.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_08_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "Take a piece of the plating. It's lighter than steel and twice as strong.",
"trigger": {
"type": "GIVE_ITEM",
"item_id": "ITEM_TITAN_PLATING"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_09_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "My courier ship went down. Bandits are picking it clean. Get that drive back.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_09_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "Drive secure. Encryption intact. Good work.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_10_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "They are coming in force. Dig in. Shields up. Hold until relieved.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_10_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "You held. Take this shield. It stopped a Void Brute once.",
"trigger": {
"type": "GIVE_ITEM",
"item_id": "ITEM_IRON_TOWER_SHIELD"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_11_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "Defense is just delayed defeat. Now we attack. Burn the nest out.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_11_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "Smoke and scrap. I'm authorizing your squad to use the Mk2 prints.",
"trigger": {
"type": "UNLOCK_BLUEPRINT",
"item_id": "ITEM_HEAVY_PLATE_MK2"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_12_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "The beast organizing the raids is here. We strike as one iron fist.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_12_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "Target destroyed. I am granting you the rank of Warlord within the Legion.",
"trigger": {
"type": "UNLOCK_MASTERY",
"class_id": "CLASS_VANGUARD"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_13_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Baroness Seraphina",
"text": "I have a delicate package moving on a Mule Bot. Get it to the Sky-Dock. Do not drop it.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_13_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Baroness Seraphina",
"text": "Wonderful! The cargo is intact. Take this mercenary contract as a bonus.",
"trigger": {
"type": "GIVE_ITEM",
"item_id": "ITEM_MERCENARY_CONTRACT"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_14_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Baroness Seraphina",
"text": "Bandits have moved into *my* mine. Evict them, but don't damage the equipment.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_14_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Baroness Seraphina",
"text": "Mine secured. I've deposited your fee. Don't spend it all in one place.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_15_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Baroness Seraphina",
"text": "Someone wants this Core for free. Keep them off me while I close the deal.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_15_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Baroness Seraphina",
"text": "Consider us partners. I'm giving you Platinum status at the exchange.",
"trigger": {
"type": "GIVE_ITEM",
"item_id": "ITEM_MARKET_PASS_PLATINUM"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_16_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Elder Fira",
"text": "The roots of the Great Tree are drinking poison. Cleanse the nodes.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_16_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Elder Fira",
"text": "The sap flows clear again. Take this seed; it will mend your wounds.",
"trigger": {
"type": "UNLOCK_BLUEPRINT",
"item_id": "ITEM_REGEN_RING_BLUEPRINT"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_17_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Elder Fira",
"text": "My children are lost in the white void. Bring them home before they dissolve.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_17_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Elder Fira",
"text": "They are shaken, but safe. Light reveals truth; take this lantern.",
"trigger": {
"type": "GIVE_ITEM",
"item_id": "ITEM_SPIRIT_LANTERN"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_18_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Elder Fira",
"text": "There. The corruption heart. Burn the rot so the green may grow again.",
"next": "END"
}
]
}

View file

@ -0,0 +1,16 @@
{
"id": "NARRATIVE_18_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Elder Fira",
"text": "I have taught your healers the ancient rites. They are true Custodians now.",
"trigger": {
"type": "UNLOCK_MASTERY",
"class_id": "CLASS_CUSTODIAN"
},
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_19_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Ambassador sol'Ria",
"text": "This is madness! Get me out of this insanity and the Exchange will pay double!",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_19_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Ambassador sol'Ria",
"text": "Neutrality is getting expensive, Explorer. You'll have to pick a side soon.",
"next": "END"
}
]
}

View file

@ -0,0 +1,43 @@
{
"id": "NARRATIVE_20_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "We need to cut the power to the factory.",
"next": "2"
},
{
"id": "2",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "Don't! That factory is keeping us alive! Help me disarm the charges!",
"next": "3"
},
{
"id": "3",
"type": "CHOICE",
"speaker": "Tactical Decision",
"text": "Arm or Disarm?",
"choices": [
{
"text": "Arm (Legion)",
"trigger": {
"type": "SET_MISSION_VARIANT",
"variant": "LEGION_SIDE"
},
"next": "END"
},
{
"text": "Disarm (Concord)",
"trigger": {
"type": "SET_MISSION_VARIANT",
"variant": "CONCORD_SIDE"
},
"next": "END"
}
]
}
]
}

View file

@ -0,0 +1,17 @@
{
"id": "NARRATIVE_20_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "The operation is complete. Your allegiance has been noted.",
"trigger": {
"type": "MODIFY_RELATION",
"faction": "DYNAMIC_WINNER",
"amount": 100
},
"next": "END"
}
]
}

View file

@ -0,0 +1,19 @@
{
"id": "NARRATIVE_21_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Arch-Librarian Elara",
"text": "This Geode belongs in a museum. Secure it.",
"next": "2"
},
{
"id": "2",
"type": "DIALOGUE",
"speaker": "Baroness Seraphina",
"text": "Finders keepers. My boys are already there.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_21_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Arch-Librarian Elara",
"text": "The resonance... it's a map. It points directly to the bottom of the Abyss.",
"next": "END"
}
]
}

View file

@ -0,0 +1,19 @@
{
"id": "NARRATIVE_22_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Elder Fira",
"text": "A charlatan wearing our robes spreads lies in the lower caves. He claims the rot is a blessing.",
"next": "2"
},
{
"id": "2",
"type": "DIALOGUE",
"speaker": "Elder Fira",
"text": "Silence him before he poisons the minds of the young.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_22_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Elder Fira",
"text": "The false voice is stilled. We found this idol on him... it reeks of the Void.",
"next": "END"
}
]
}

View file

@ -0,0 +1,19 @@
{
"id": "NARRATIVE_23_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "Seismic warning! The Spire is pulsing. Debris is raining down on the Frontier.",
"next": "2"
},
{
"id": "2",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "Get our people out of there! Avoid the red zones!",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_23_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "Casualties minimal. Good work. The readings from that quake... the Spire is waking up.",
"next": "END"
}
]
}

View file

@ -0,0 +1,19 @@
{
"id": "NARRATIVE_24_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "This is it. They are pouring out of every rift. It's an invasion.",
"next": "2"
},
{
"id": "2",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "No retreat. No surrender. Hold until the last shell is spent.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_24_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "The wave is broken. But we can't sustain this. We have to take the fight to them.",
"next": "END"
}
]
}

View file

@ -0,0 +1,19 @@
{
"id": "NARRATIVE_25_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Arch-Librarian Elara",
"text": "The alliance stands united, for now. The elevator to the Core is ahead.",
"next": "2"
},
{
"id": "2",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "I've hacked the locking mechanism. Just get us there alive.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_25_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Access Granted. Descending to Layer 1.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_26_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "Layer 1. The Iron Shell. This is where they build the machines.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_26_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Shield Generators offline. Path to Layer 2 open.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_27_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Arch-Librarian Elara",
"text": "Layer 2. The Crystal Heart. The magic here is so dense it's solidifying the air.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_27_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Navigation complete. Path to Layer 3 open.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_28_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Elder Fira",
"text": "Layer 3. The Rotting Soul. Do not breathe too deeply here.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_28_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Titan destroyed. Path to Layer 4 open.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_29_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Layer 4. The Void. Warning: Mirror Entities detected.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_29_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Shadows dispersed. Entering Antechamber.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_30_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "General Kael",
"text": "The Gatekeeper. Look at the size of that thing.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_30_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Gatekeeper neutralized. The Core is ahead.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_31_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "Director Vorn",
"text": "This is it. Get the Sync Device to the center. If it breaks, we fail.",
"next": "END"
}
]
}

View file

@ -0,0 +1,12 @@
{
"id": "NARRATIVE_31_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Synchronization complete. The Arch-Corruptor is manifesting.",
"next": "END"
}
]
}

View file

@ -0,0 +1,19 @@
{
"id": "NARRATIVE_32_INTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Approaching Singularity. Reality integrity critical.",
"next": "2"
},
{
"id": "2",
"type": "DIALOGUE",
"speaker": "The Arch-Corruptor",
"text": "YOU CANNOT STOP THE STILLNESS. IT IS PEACE.",
"next": "END"
}
]
}

View file

@ -0,0 +1,22 @@
{
"id": "NARRATIVE_32_OUTRO",
"nodes": [
{
"id": "1",
"type": "DIALOGUE",
"speaker": "System",
"text": "Target destroyed. Spire energy stabilizing.",
"next": "2"
},
{
"id": "2",
"type": "DIALOGUE",
"speaker": "Narrator",
"text": "And so, the Explorer stood at the heart of the world, and made their choice...",
"trigger": {
"type": "GAME_ENDING"
},
"next": "END"
}
]
}