Skip to content

Fight Configurations

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

  • Moves embedded
  • Phases embedded
  • State machines embedded
  • Hard to reuse

New Structure

Modular - Reference separate sets

  • moveSet: "raichu"
  • phaseSet: "raichu"
  • behaviour: "raichu"
  • Easy to share/reuse
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"
}

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 Charizard

Display name shown to players:

"name": "Storm Surge Titan Raichu"
// Shows as: "[TITAN] Storm Surge Titan Raichu"

Naming Convention:

  • [Signature Move/Theme] + “Titan” + [Species]
  • Examples:
    • “Storm Surge Titan Raichu”
    • “Armor Oblivion Titan Ceruledge”
    • “Inferno Titan Charizard”
    • “Psycho Break Titan Mewtwo”

ID of the move set configuration to load.

"moveSet": "raichu"
// → Loads config/titan/moves/raichu.json

Available Move Sets:

  • Species-specific: "charizard", "raichu", "ceruledge", etc.
  • Shared: "core" (contains generic moves used by multiple Titans)
  • Custom: Create your own in moves/ folder

See: Move Set Reference →

ID of the phase configuration to load.

"phaseSet": "raichu"
// → Loads config/titan/phases/raichu.json

Available Phase Sets:

  • Species-specific: Match moveSet name
  • Default: "default_titan" (3-phase generic progression)
  • Index: "index" (references other phase sets)

See: Phase Configurations →

ID of the behaviour configuration (movement pattern, aggression, state machine).

"behaviour": "raichu"
// → Loads config/titan/behaviour/raichu.json

If omitted: Defaults to "default" behaviour.

Available Behaviours:

  • "default" - Standard ground movement, 1.0 aggression
  • "raichu" - Teleport pattern, 1.35 aggression
  • Custom: Create your own in behaviour/ folder

See: Behaviour Reference →

graph 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]
  1. Fight Manifest loaded when Titan created
  2. Move Set loaded from moves/{moveSet}.json
  3. Phase Set loaded from phases/{phaseSet}.json
  4. Behaviour loaded from behaviour/{behaviour}.json (or default)
  5. TitanFightManager assembles complete fight configuration
  6. TitanComponent orchestrates runtime behavior

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"
}
PropertyRequiredTypeDescription
nameStringDisplay name shown to players
cooldownStringTicks before reuse (20 = 1 second)
rangeStringMax distance to target (blocks)
damageStringBase damage value
damageTypeStringType label (FIRE, ELECTRIC, etc.)
actionEffectStringActionEffect resource location
conditionStringMoLang condition (default: "true")
weightNumberSelection weight (default: 1.0)
minHealthPercentNumberMin HP for availability (0.0-1.0)
maxHealthPercentNumberMax HP for availability (0.0-1.0)
phaseNumberSpecific phase index (-1 = any)
onUseStringMoLang script on move execution

See: Creating Custom Moves →

Property: selectionStrategy in move set

StrategyBehavior
WEIGHTED_RANDOMPicks based on move weights (most common)
RANDOMEqual chance for all available moves
SEQUENCEUses moves in order, then repeats
CONDITIONALFirst 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')"
}
]
}

See: Phase Configurations →

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
}
PropertyRequiredTypeDescription
movementPatternStringDefault movement controller
aggressionLevelNumberAggression multiplier (0.5-2.0)
stateMachineObjectAdvanced AI state machine config

Movement Patterns:

  • STANDARD - Ground patrol
  • HIT_AND_RUN - Melee striker
  • TELEPORT - Blink teleportation
  • KITING - Ranged positioning
  • FLYING_BOMBER, FLYING_CIRCLER, FLYING_RUSH - Aerial
  • BERSERKER, DEFENSIVE, ENRAGED - Combat styles
  • ZIGZAG, PERCHED - Special patterns

See: Movement Controllers →

Multiple 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
}
  1. Species-Specific Sets - Create matched fights/, moves/, phases/ for fully custom Titans
  2. Shared Moves - Put generic attacks in moves/core.json
  3. Default Phases - Use phases/default_titan.json for simple 3-phase progression
  4. Behaviour Variants - Create named behaviours for common archetypes (melee, ranged, tank)

Fight:

config/titan/fights/raichu.json
{
"_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:

config/titan/fights/pidgey.json
{
"pokemonProperties": "pidgey",
"name": "Sky Titan Pidgey",
"moveSet": "core",
"phaseSet": "default_titan",
"behaviour": "default"
}

Uses all defaults - requires no custom configs!

  1. Mod Initialize - Registers keyframes and controllers
  2. Config Load - Loads all fight/move/phase/behaviour configs
  3. Titan Create - /titan create command applies configuration to entity
  4. Fight Start - Component loads fight config based on pokemonProperties
  5. Runtime - Component manages phases, moves, movement based on loaded config

Master the modular config system to create reusable, composable boss fights!