Old Structure
Monolithic - All data in one file
- Moves embedded
- Phases embedded
- State machines embedded
- Hard to reuse
Fight configs are now modular manifests that reference separate move sets, phase sets, and behaviour configs. This allows sharing configurations across multiple Titans.
Fight configs are located in config/titan/fights/*.json.
Instead of embedding all data in one file, fight configs now reference other configuration sets:
{ "_comment": "Titan Raichu Boss Fight - Evolved electric powerhouse", "pokemonProperties": "raichu", "name": "Storm Surge Titan Raichu", "moveSet": "raichu", "phaseSet": "raichu", "behaviour": "raichu"}Old Structure
Monolithic - All data in one file
New Structure
Modular - Reference separate sets
moveSet: "raichu"phaseSet: "raichu"behaviour: "raichu"config/titan/├── fights/ # Fight manifests (THIS FILE)│ ├── charizard.json│ ├── raichu.json│ ├── ceruledge.json│ └── ... (33 total)│├── moves/ # Move set definitions│ ├── charizard.json│ ├── raichu.json│ ├── core.json # Shared moves│ └── ...│├── phases/ # Phase configurations│ ├── charizard.json│ ├── raichu.json│ ├── default_titan.json│ └── ...│└── behaviour/ # Optional behaviour configs ├── default.json ├── raichu.json └── ...{ "pokemonProperties": "charizard", "name": "Inferno Titan Charizard", "moveSet": "charizard", "phaseSet": "charizard", "behaviour": "charizard"}{ "_comment": "Titan Ceruledge - Ghost/Fire samurai with blade attacks", "pokemonProperties": "ceruledge", "name": "Armor Oblivion Titan Ceruledge", "moveSet": "ceruledge", "phaseSet": "ceruledge", "behaviour": "default"}pokemonProperties (Required)Defines which Pokemon this config applies to. Uses Cobblemon’s property syntax:
// Simple species match"pokemonProperties": "raichu"
// With form"pokemonProperties": "vulpix alolan=true"
// With level range"pokemonProperties": "charizard level=50-100"
// Multiple criteria"pokemonProperties": "mewtwo shiny level=80+"Examples from actual configs:
"raichu" - Any Raichu"vulpix alolan=true" - Alolan Vulpix only"charizard" - Any Charizardname (Required)Display name shown to players:
"name": "Storm Surge Titan Raichu"// Shows as: "[TITAN] Storm Surge Titan Raichu"Naming Convention:
moveSet (Required)ID of the move set configuration to load.
"moveSet": "raichu"// → Loads config/titan/moves/raichu.jsonAvailable Move Sets:
"charizard", "raichu", "ceruledge", etc."core" (contains generic moves used by multiple Titans)moves/ folderSee: Move Set Reference →
phaseSet (Required)ID of the phase configuration to load.
"phaseSet": "raichu"// → Loads config/titan/phases/raichu.jsonAvailable Phase Sets:
moveSet name"default_titan" (3-phase generic progression)"index" (references other phase sets)behaviour (Optional)ID of the behaviour configuration (movement pattern, aggression, state machine).
"behaviour": "raichu"// → Loads config/titan/behaviour/raichu.jsonIf omitted: Defaults to "default" behaviour.
Available Behaviours:
"default" - Standard ground movement, 1.0 aggression"raichu" - Teleport pattern, 1.35 aggressionbehaviour/ foldergraph TD
A[Fight Manifest] --> B[Load moveSet]
A --> C[Load phaseSet]
A --> D[Load behaviour]
B --> E[Move Registry]
C --> F[Phase Stack]
D --> G[Behaviour Config]
E --> H[TitanFightManager]
F --> H
G --> H
H --> I[Runtime: TitanComponent]
moves/{moveSet}.jsonphases/{phaseSet}.jsonbehaviour/{behaviour}.json (or default)File: config/titan/moves/{moveSet}.json
Defines all moves available to this Titan, plus selection strategy.
{ "moves": { "storm_call": { "name": "Storm Call", "cooldown": "160", "range": "0.0", "damage": "0.0", "damageType": "STATUS", "actionEffect": "titan:raichu_storm_call", "condition": "true", "weight": 0.8, "minHealthPercent": 0.66, "maxHealthPercent": 1.0, "phase": -1, "onUse": "q.invoke_move('spark_clone')" }, "thunderstrike": { "name": "Thunderstrike", "cooldown": "120", "range": "10.0", "damage": "42.0", "damageType": "ELECTRIC", "actionEffect": "titan:raichu_thunderstrike", "condition": "true", "weight": 1.4, "minHealthPercent": 0.5, "maxHealthPercent": 1.0, "phase": -1 } // ... 12 more moves }, "selectionStrategy": "WEIGHTED_RANDOM"}| Property | Required | Type | Description |
|---|---|---|---|
name | ✅ | String | Display name shown to players |
cooldown | ✅ | String | Ticks before reuse (20 = 1 second) |
range | ✅ | String | Max distance to target (blocks) |
damage | ✅ | String | Base damage value |
damageType | ✅ | String | Type label (FIRE, ELECTRIC, etc.) |
actionEffect | ✅ | String | ActionEffect resource location |
condition | ❌ | String | MoLang condition (default: "true") |
weight | ❌ | Number | Selection weight (default: 1.0) |
minHealthPercent | ❌ | Number | Min HP for availability (0.0-1.0) |
maxHealthPercent | ❌ | Number | Max HP for availability (0.0-1.0) |
phase | ❌ | Number | Specific phase index (-1 = any) |
onUse | ❌ | String | MoLang script on move execution |
Property: selectionStrategy in move set
| Strategy | Behavior |
|---|---|
WEIGHTED_RANDOM | Picks based on move weights (most common) |
RANDOM | Equal chance for all available moves |
SEQUENCE | Uses moves in order, then repeats |
CONDITIONAL | First move with matching condition |
Example:
{ "moves": { ... }, "selectionStrategy": "WEIGHTED_RANDOM"}File: config/titan/phases/{phaseSet}.json
Defines health thresholds, stat modifiers, move pools per phase, and movement overrides.
{ "phases": [ { "healthThreshold": 1.0, "moves": ["storm_call", "thunderstrike", "chain_lightning", "discharge_nova", "lightning_dash"], "speedModifier": 1.15, "damageModifier": 1.0, "scaleModifier": 1.1, "movementPattern": "KITING", "aggressionLevel": 1.2, "onEnterScript": "q.apply_potion('minecraft:speed', 999999, 0); q.particle_effect('minecraft:electric_spark', q.position(0), 180, 3.5)", "onExitScript": "q.remove_potion('minecraft:speed')" }, { "healthThreshold": 0.6, "moves": ["storm_surge", "electroweb", "thunder_cage", "spark_clone", "magnetic_flux", "lightning_dash", "lightning_rod"], "speedModifier": 1.28, "damageModifier": 1.2, "scaleModifier": 1.15, "movementPattern": "TELEPORT", "aggressionLevel": 1.5, "onEnterScript": "q.apply_potion('minecraft:speed', 999999, 1); q.invoke_move('spark_clone')", "movementOverrides": { "teleport": { "minRange": 4.0, "maxRange": 8.0, "radialCandidates": 10, "heightVariance": 2.5, "cooldownMs": 12000 } } }, { "healthThreshold": 0.35, "moves": ["thunderbolt_barrage", "volt_tackle", "gigavolt_havoc", "overcharge", "storm_surge", "lightning_rod"], "speedModifier": 1.4, "damageModifier": 1.35, "scaleModifier": 1.2, "movementPattern": "RUSH", "aggressionLevel": 1.8, "onEnterScript": "q.apply_potion('minecraft:speed', 999999, 2); q.invoke_move('overcharge')" } ]}File: config/titan/behaviour/{behaviour}.json
Optional config for movement pattern, aggression level, and state machines.
{ "movementPattern": "STANDARD", "aggressionLevel": 1.0, "stateMachine": null}{ "movementPattern": "TELEPORT", "aggressionLevel": 1.35}| Property | Required | Type | Description |
|---|---|---|---|
movementPattern | ✅ | String | Default movement controller |
aggressionLevel | ✅ | Number | Aggression multiplier (0.5-2.0) |
stateMachine | ❌ | Object | Advanced AI state machine config |
Movement Patterns:
STANDARD - Ground patrolHIT_AND_RUN - Melee strikerTELEPORT - Blink teleportationKITING - Ranged positioningFLYING_BOMBER, FLYING_CIRCLER, FLYING_RUSH - AerialBERSERKER, DEFENSIVE, ENRAGED - Combat stylesZIGZAG, PERCHED - Special patternsMultiple Titans can share moves from core.json:
titan/moves/core.json:
{ "moves": { "generic_slash": { "name": "Titan Slash", "cooldown": "100", "range": "5.0", "damage": "10.0", "damageType": "PHYSICAL", "actionEffect": "titan:generic_slash", "condition": "true", "weight": 1.0 } }, "selectionStrategy": "WEIGHTED_RANDOM"}Usage:
{ "pokemonProperties": "scyther", "name": "Blade Titan Scyther", "moveSet": "core", // ← Uses shared moves "phaseSet": "default_titan", "behaviour": "default"}Multiple Titans can share the same phase progression:
{ "pokemonProperties": "machamp", "name": "Brawler Titan Machamp", "moveSet": "machamp", "phaseSet": "default_titan", // ← Generic 3-phase progression "behaviour": "berserker"}{ "pokemonProperties": "gengar", "name": "Shadow Titan Gengar", "moveSet": "gengar", // ← Custom moves "phaseSet": "default_titan", // ← Generic phases "behaviour": "default" // ← Standard behavior}fights/, moves/, phases/ for fully custom Titansmoves/core.jsonphases/default_titan.json for simple 3-phase progressionFight:
{ "_comment": "Titan Raichu - Electric powerhouse", "pokemonProperties": "raichu", "name": "Storm Surge Titan Raichu", "moveSet": "raichu", "phaseSet": "raichu", "behaviour": "raichu"}Moves: 15 custom electric attacks (moves/raichu.json)
Phases: 3 phases with teleport progression (phases/raichu.json)
Behaviour: Teleport movement, 1.35 aggression (behaviour/raichu.json)
Fight:
{ "pokemonProperties": "pidgey", "name": "Sky Titan Pidgey", "moveSet": "core", "phaseSet": "default_titan", "behaviour": "default"}Uses all defaults - requires no custom configs!
/titan create command applies configuration to entitypokemonPropertiesMove Sets
Deep dive into move definitions
Phase Sets
Configure multi-phase progression
Behaviours
Advanced AI and state machines
Movement
Explore AI movement patterns
Master the modular config system to create reusable, composable boss fights!