Skip to content

Full Field Reference

Every field ShowdownActions supports, in one place. The bundled 00_bible.conf is the in-tree version of this reference — it has every field with the same descriptions, ready to copy from. This page is the same content arranged for browsing on the docs site.

For narrative explanations of how the fields combine, read Action Files, Match Clause, and Apply Clause.


FieldTypeDefaultRe-evaluated?Notes
idStringfilename without .confStable identifier. Used by /showdownactions info <id> and command tab-completion.
displayNameString""Free-form label shown in admin GUIs/logs and as the condition’s name in Showdown. No behavioral effect.
enabledBooleantrueWhen false, the file is loaded but skipped at every match attempt. Treat as “comment out without deleting”.
priorityInt0Higher priority is evaluated first when several actions match the same (actor, pokemon). Mostly relevant inside a mutexGroup.
targetenumSELFWhich side+slot the resulting Showdown effect is registered against. See Targeting.
chanceDouble1.0per battleProbability gate in [0, 1]. Rolled once per battle, before the effect is registered.
oncePerBattleBooleanfalseFire at most once per battle. Implemented via a battle-scoped flag map keyed by action id.
permissionString?nullper battleOptional permission node. When set, the matching player must satisfy it via fabric-permissions-api.
mutexGroupString?nullper battleMutual-exclusion key. Within one battle and trainer, only the highest-priority matching action whose mutexGroup equals this string fires.

target accepts SELF, ALLIES, FOES, EVERYONE, FIELD. See Targeting for the semantics of each.


Direct checks against the Pokémon’s stats and identity. Evaluated server-side as plain comparisons.

FieldTypeRe-checked on switch-in?Compares against
speciesString?YesCobblemon species id ("lycanroc").
formString?YesForm name ("midday", "midnight").
typeString?YesOne of the Pokémon’s elemental types (lowercase, "water").
abilityString?YesCobblemon ability id (Showdown lowercase, "swiftswim").
heldItemString?YesFull namespaced item id ("cobblemon:choice_band").
aspectString?NoRequired aspect tag ("shiny", "dusk").
natureString?NoNature id (lowercase, "modest").
teraTypeString?YesTera type (lowercase, "fire"). Re-checked because Terastallization can change it.
genderString?No"male", "female", or "genderless".
minLevelInt?YesInclusive lower bound (1..100).
maxLevelInt?YesInclusive upper bound (1..100).
minFriendshipInt?NoInclusive lower bound (0..255).
isLegendaryBoolean?NoTri-state. true requires the species to be labeled legendary; false requires it not to be; null ignores.

The “re-checked on switch-in” column is enforced by an auto-applied guard inside the switch-in hook for target = SELF | ALLIES | EVERYONE actions. Static fields aren’t re-checked because their values can’t change mid-battle.

Tier-3 showdown {} blocks don’t get an auto-guard — you control the entire effect, including any identity check.


Compile to Molang at load time, ANDed with whenMolang.

FieldTypeValuesCompiles to
timeString?morning, day, noon, evening, dusk, night, midnightq.world.is_time('<bucket>')
weatherString?clear, rain, thunder, snowq.world.is_raining, q.world.is_thundering, q.world.is_snowing, or the negation.
biomeString?Biome id or biome tagq.world.biome == '...' or q.world.biome_in_tag('...') (with # prefix for tags).
dimensionString?Dimension id ("minecraft:overworld")q.world.dimension == '...'

Sugar predicates are evaluated once at battle start, against the player’s current world position. Not re-checked on switch-in.

BucketTick range (mod 24000)
morning0..2999
day0..11999
noon5000..7000
evening9000..11999
dusk12000..13000
night13000..23999
midnight17500..18500

day and morning overlap; night and midnight overlap. Pick the bucket that matches the intent of your gate.


Optional raw Molang expression. ANDed with the rest of the match clause. Truthy (non-zero) means match.

match {
whenMolang = "q.pokemon.hp_ratio < 0.25 && q.world.is_thundering"
}

Available bindings: q.pokemon, q.player, q.world, q.battle. ShowdownActions extras: q.world.is_time(...), q.world.dimension_string. Full surface and dump command at Molang Predicates.

Evaluated once at battle start. Not re-checked on switch-in.


Run synchronously at battle start when the action matches. Don’t go through Showdown.

FieldTypeEffect
aspectString?Adds an aspect to the matched Pokémon’s aspect set. Persists until something else removes it.
commandString?Server console command, run as the server. {player} is replaced with the trainer’s username.

apply { } — Showdown-Side Effects (Sugar)

Section titled “apply { } — Showdown-Side Effects (Sugar)”

These compose into an auto-applied onStart hook on a generated condition, applied as a volatile when the matched Pokémon switches in.

FieldTypeEffect
boostsBlockStat-stage boosts. See sub-table below. Plays the standard Cobblemon stat-up/down animation.
statusString?Apply a major status. Showdown ids: brn, psn, tox, par, slp, frz.
removeStatusBooleanCure any active major status on switch-in. Default false.
healString?Heal HP. Accepts "25%" (of max HP) or "50" (flat amount). Anything else is dropped with a log.
volatileString?Add an arbitrary Showdown volatile by id (anything in Dex.data.Conditions).
weatherString?Set field weather. Showdown ids: sunnyday, raindance, snow, sandstorm.
terrainString?Set field terrain. Showdown ids: electricterrain, grassyterrain, psychicterrain, mistyterrain.
messageString?Yellow battle-chat broadcast. {name} is replaced with the host’s species name at fire time. MiniMessage tags are stripped.
FieldTypeRangeStat
atkInt-6..6Atk stage delta
defInt-6..6Def stage delta
spaInt-6..6Special Atk stage delta
spdInt-6..6Special Def stage delta
speInt-6..6Speed stage delta
accuracyInt-6..6Accuracy stage delta
evasionInt-6..6Evasion stage delta

All seven default to 0. Zeroes are skipped when compiling the this.boost(...) call. If every value is 0 and no other Showdown-side effect is set, ShowdownActions doesn’t synthesize a Showdown condition at all.

When apply { } produces a Showdown condition, the generated hook runs effects in this fixed order:

  1. Auto-generated match guard (for SELF/ALLIES/EVERYONE only).
  2. oncePerBattle flag check.
  3. removeStatuspokemon.cureStatus().
  4. booststhis.boost({...}, pokemon).
  5. statuspokemon.trySetStatus('<id>', pokemon).
  6. healpokemon.heal(amount).
  7. weatherthis.field.setWeather('<id>', pokemon).
  8. terrainthis.field.setTerrain('<id>', pokemon).
  9. volatilepokemon.addVolatile('<id>').
  10. messagethis.add('-message', '<text>').

Optional. When present, registered verbatim into Dex.data.Conditions and applied as a volatile when the action fires.

FieldTypeDefaultNotes
conditionIdStringrequiredShowdown condition id. Lowercase alphanumeric (Showdown’s toID() rules). The registry normalizes anything else.
conditionNameStringconditionIdDisplay name shown in debug tooling.
scopeString"volatile""volatile", "side", "field". Currently informational.
turnDurationInt?nullAuto-remove after N turns. null = permanent.
hooksMap<String, String>{}Showdown event handlers, keyed by handler name. Values are raw JS function strings.
extrasMap<String, String>{}Extra raw JS properties merged into the condition object literal.

When a showdown {} block is present, no auto-generated species/form guard is added. You control the entire effect.

These are the slots that map to typed fields on ShowdownCondition. Anything outside this set is forwarded by name.

HookWhen it fires
onStartThe volatile attaches (and on every switch-in).
onEndThe volatile is removed.
onResidualEvery turn during the residual phase.
onRestartThe volatile is reapplied to a host that already has it.
onModifyAtkSomething asks for the host’s Atk. Returning a number replaces it.
onModifyDefSame, for Def.
onModifySpASpecial Atk.
onModifySpDSpecial Def.
onModifySpeSpeed.

For non-named hooks (onAnyDamage, onTryHit, onAfterMoveSecondary, onSwitchOut, onBeforeMove, etc.), use the same hook map — the key is forwarded verbatim to Showdown. See Raw Showdown Hooks for the broader catalogue and Showdown Research for guidance on writing them.

Every hook is auto-wrapped so fires and errors land in the Showdown log as [ShowdownActions][<conditionId>] <hookName> fired/ERROR: … with debug = true.


Mod-level settings. Lives at config/showdown_actions/config.conf, separate from the per-action files.

FieldTypeDefaultEffect
enabledBooleantrueMaster switch. When false, the battle-start hook is a no-op.
applyInPvpBooleantrueWhether actions evaluate in player-vs-player battles.
applyInPveBooleantrueWhether actions evaluate in player-vs-wild and player-vs-NPC battles.
applyInNpcOnlyBooleanfalseWhether actions evaluate in NPC-vs-NPC battles.
debugBooleanfalseEnables verbose [ShowdownActions] log output.

See Configuration for the narrative version.


The single most-common author confusion is “when is X re-checked?”. The summary, by category:

Evaluated…Fields
Once per battle, at startAll sugar predicates, whenMolang, aspect, nature, gender, minFriendship, isLegendary, chance, permission, mutexGroup.
On every switch-in (via auto-guard)species, form, type, ability, heldItem, teraType, minLevel, maxLevel.

The auto-guard exists because the patched runSwitch in this environment re-fires onStart on every switch-in, not just the first. Without the guard, an effect targeted at Pikachu would re-fire on Bulbasaur after a swap.

oncePerBattle = true adds another gate: even if the host swaps out and back in and the guard passes, the switch-in hook bails after the first fire of that battle.

Tier-3 showdown {} blocks don’t get an auto-guard — if your hook needs a per-switch identity check, write it inline.


  • The bundled 00_bible.conf in config/showdown_actions/actions/. Same content, in-tree, ready to copy from.
  • Action Files — the narrative companion to this reference.
  • Match Clause and Apply Clause — the long-form discussion of each block.
  • Recipes — worked examples that combine the fields.