Skip to content

Configuration

Witness configuration is managed through JSON files in config/witness/.

Location: config/witness/config.json

{
"cinematicCamera": {
"enabled": true,
"defaultDistance": 8.0,
"transitionSpeed": 0.05,
"minDistance": 4.0,
"maxDistance": 16.0
},
"mlCamera": {
"enabled": false,
"learningRate": 0.01,
"saveInterval": 300,
"minDataPoints": 100
},
"playerProtection": {
"preventDamage": true,
"preventHunger": true,
"freezePosition": true,
"hideInventory": true
},
"battleFormats": {
"singles": {
"enabled": true,
"defaultCameraProfile": "singles_standard"
},
"doubles": {
"enabled": true,
"defaultCameraProfile": "doubles_wide"
}
},
"sequences": {
"moveReactions": true,
"damageReactions": true,
"faintReactions": true
}
}
  • enabled: Enable/disable the cinematic camera system
  • defaultDistance: Default camera distance from Pokemon (blocks)
  • transitionSpeed: Speed of camera transitions (0.0-1.0)
  • minDistance: Minimum camera distance
  • maxDistance: Maximum camera distance
  • enabled: Enable machine learning camera adaptation
  • learningRate: How quickly the system learns (0.001-0.1)
  • saveInterval: Seconds between saving ML data
  • minDataPoints: Minimum data points before ML activates
  • preventDamage: Prevent player damage during cinematics
  • preventHunger: Prevent hunger depletion
  • freezePosition: Lock player position during camera
  • hideInventory: Hide inventory GUI during sequences

Configure camera profiles per battle format:

{
"singles": {
"enabled": true,
"defaultCameraProfile": "singles_standard"
}
}

Enable/disable camera reactions:

  • moveReactions: React to move usage
  • damageReactions: React to damage taken
  • faintReactions: React to Pokemon fainting

Location: config/witness/camera_profiles.json

{
"singles_standard": {
"name": "Singles Standard",
"baseDistance": 8.0,
"heightOffset": 2.0,
"angleOffset": 15.0,
"orbitSpeed": 0.02,
"focusMode": "active_pokemon"
},
"doubles_wide": {
"name": "Doubles Wide",
"baseDistance": 12.0,
"heightOffset": 3.0,
"angleOffset": 20.0,
"orbitSpeed": 0.03,
"focusMode": "battlefield_center"
}
}
  • baseDistance: Default camera distance
  • heightOffset: Camera height above ground
  • angleOffset: Downward angle in degrees
  • orbitSpeed: Speed of orbit movement
  • focusMode: What the camera focuses on
    • active_pokemon: Focus on active Pokemon
    • attacking_pokemon: Focus on attacker
    • battlefield_center: Focus on center
    • dynamic: ML-driven focus

Location: config/witness/events.json

Configure camera reactions to specific battle events:

{
"events": [
{
"trigger": "move_used",
"conditions": {
"moveNames": ["Thunder", "Thunderbolt", "Thunder Punch"],
"moveType": "electric"
},
"camera": {
"sequence": "electric_impact",
"duration": 60,
"priority": 5
}
},
{
"trigger": "critical_hit",
"camera": {
"sequence": "zoom_impact",
"duration": 40,
"priority": 8
}
},
{
"trigger": "pokemon_faint",
"camera": {
"sequence": "dramatic_pan",
"duration": 80,
"priority": 10
}
}
]
}

Available triggers:

  • move_used: When a move is used
  • move_hit: When a move connects
  • move_miss: When a move misses
  • critical_hit: When a critical hit occurs
  • super_effective: Super effective move
  • not_very_effective: Resisted move
  • pokemon_faint: When a Pokemon faints
  • pokemon_sent_out: When Pokemon enters battle
  • battle_start: Battle begins
  • battle_end: Battle ends

Filter when events trigger:

{
"conditions": {
"moveNames": ["Hyper Beam", "Giga Impact"],
"moveType": "normal",
"minDamage": 50,
"damagePercent": 0.5,
"userSpecies": ["charizard", "blaziken"],
"targetSpecies": [],
"hpThreshold": 0.25
}
}

Location: config/witness/ml_config.json

Advanced ML camera settings:

{
"features": {
"trackPlayerPreference": true,
"trackCameraQuality": true,
"trackObstructions": true,
"adaptToFormat": true
},
"weights": {
"distance": 0.3,
"angle": 0.25,
"height": 0.2,
"orbit": 0.15,
"focus": 0.1
},
"training": {
"batchSize": 10,
"epochs": 5,
"validationSplit": 0.2
},
"quality": {
"obstructionPenalty": 0.5,
"boundaryPenalty": 0.3,
"distancePenalty": 0.2
}
}
  • Disable ML if not needed
  • Use longer saveInterval on busy servers
  • Limit maxDistance on large battles
  • Lower transitionSpeed for smoother cameras
  • Enable all sequence reactions
  • Use battle format-specific profiles
  • Enable player protection features
  • Test sequences before events
  • Provide opt-out command for players

Reload config without restart:

/witness reload