Files
gen1recomp/docs/modding/reference/registries.md
T
thibautbus 29bbdfce43 Harden statusBlockedId, document the failed flag, cover the volatile clear
Three follow-ups on the commit below.

statusBlockedId read the status record's optional `id` field. A mod that overrides a status rather than patching it replaces the record outright, and `id` is optional in the registry (src/mods/Schemas.lua), so the field can be nil there and full paralysis would quietly stop clearing bide, thrash, charge and trapping. It now falls back on the key the record was looked up under.

`msgs.failed` is the only thing that suppresses a primary effect's success animation now, so it is no longer an internal detail: the move_effects registry documents it, and docs/modding/reference/registries.md is regenerated. That regeneration also picks up rows that had drifted from the schema before this branch (missText, trueColor, the sprite cell fields).

The parity suite gains the case the commit below changes the rules in -- PAR's own roll clearing the volatiles, and a flinch on a paralysed battler leaving them alone -- and its translated-label block now restores the shared Data.text entries through pcall, so a failing check there cannot leak "pioupiou zzz" into every later parity suite.
2026-09-20 12:03:54 +02:00

1345 lines
35 KiB
Markdown

<!-- Generated by tools/gen_registry_docs.lua from src/mods/Schemas.lua.
Do not edit by hand; regenerate after any schema change. -->
# Registry reference
One section per registry: merge semantics, the `Data` table the merge
writes, and the value schema. Where Gold differs -- a different table, a
different record, or no home at all -- the registry carries a Gen 2
subsection built from the same catalog entry. Concepts and verbs:
[Concepts: Registries](Concepts-Registries).
## Reading this reference
Use the wiki's `Choose-A-Registry` guide when you know what you want
to make but not the registry name. This page is the precise schema
catalog once you have chosen one.
### Type notation
- `string`, `number`, `boolean`, and `function` name the Lua value to
supply. A function is code the engine calls later; see the linked
concept/reference page for its arguments and return value.
- `{ field, otherField? }` is a record (a Lua table with named fields).
A `?` means that field is optional. `list of T` is an ordered Lua
table of values shaped like `T`; `map of K -> V` maps each key to a
value shaped like `V`.
- `A | B` means either shape is accepted. `moves id`, `items id`, and
similar phrases mean the internal id of a record in that registry,
not its displayed name.
### Example status
Every example below is **shape only**. Put an adapted call in your mod
entry file. Replace `...` and names such as `fn` with real values, and
supply every field marked required when registering a new record.
## ai_classes
- semantics: `record`
- target: `Data.ai_classes`
| field | type | required |
|---|---|---|
| `brain` | function | no |
| `chance` | integer 0..256 | no |
| `choose` | function | no |
| `hpBelow` | integer >= 1 | no |
| `item` | items id | no |
| `kind` | one of "class" \| "layer" \| "brain" | no |
| `onStatus` | boolean | no |
| `score` | function | no |
| `switch` | boolean | no |
| `switchBelow` | integer >= 1 | no |
| `switchChance` | integer 0..256 | no |
| `uses` | integer >= 0 | no |
<!-- snippet: illustrative -->
```lua
mod.content.ai_classes:patch("OPP_BROCK", { uses = 9 })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2AiClasses`
## apricorns
- semantics: `record`
- target: none
Gen 2 only: Red, Blue and Yellow have no such system, so there is no
Gen 1 table to merge into and a write here on a Gen 1 boot is dropped
and reported. See the Gold subsection below for where it does land.
| field | type | required |
|---|---|---|
| `apricorn` | items id | yes |
| `ball` | items id | yes |
| `event` | integer >= 0 | yes |
| `index` | integer >= 1 | yes |
<!-- snippet: illustrative -->
```lua
mod.content.apricorns:override("RED_APRICORN", { apricorn = "RED_APRICORN", ball = "ULTRA_BALL", event = 600, index = 1 })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Apricorns`
## audio
- semantics: `record`
- target: `Data.audio`
- **deprecated** -- use sfx / cries / map_songs / music
- value: any value
<!-- snippet: illustrative -->
```lua
mod.content.audio:override("mapSongs", { ... })
```
## balls
- semantics: `record`
- target: `Data.balls`
| field | type | required |
|---|---|---|
| `attempt` | function | no |
| `autoCatch` | boolean | no |
| `flicker` | boolean | no |
| `hpFactor` | integer >= 1 | no |
| `randMax` | integer 0..255 | yes |
| `tossAnim` | string | no |
| `wobbleFactor` | integer >= 1 | no |
<!-- snippet: illustrative -->
```lua
mod.content.balls:override("GREAT_BALL", { randMax = 180, hpFactor = 12 })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Balls`
## battle_anims
- semantics: `record`
- target: `Data.battle_anims`
- value: {seq, source?} | {blocks, type?} | {height, path, source?, tiles, width}
<!-- snippet: illustrative -->
```lua
mod.content.battle_anims:register("SHADOW_BALL", { seq = { ... } })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2BattleAnims`
The record differs; the registry name, the verbs and the id space
do not.
Id = a top-level key of the target table. Keys not listed here are
accepted and merged as-is.
| key | type |
|---|---|
| `bank` | integer >= 0 |
| `framesets` | map of string -> list of list of any value |
| `generation` | integer >= 1 |
| `gfx` | map of string -> {image, tiles, wide} |
| `ids` | map of string -> string |
| `moves` | map of string -> string |
| `oamsets` | map of string -> {sprites, vtile} |
| `objects` | map of string -> {fixY?, flags?, frameset, func, gfx, palette} |
| `scriptOrder` | list of string |
| `scripts` | map of string -> list of list of any value |
| `source` | string |
<!-- snippet: illustrative -->
```lua
mod.content.battle_anims:patch("moves", { SHADOW_BALL = "5e86" })
```
## battle_sprite_scales
- semantics: `record`
- target: `Data.battle_sprite_scales`
| field | type | required |
|---|---|---|
| `path` | file path | yes |
| `scale` | number 0.25..4 | yes |
<!-- snippet: illustrative -->
```lua
mod.content.battle_sprite_scales:register("abra_back", {
path = "assets/generated/battle/back/abrab.png",
scale = 1.5,
})
```
Scales one battle pic by its asset path, overriding the species-level
`battleScaleFront`/`battleScaleBack` (see [pokemon](#pokemon)) for that
image. The only way to scale a pic that is not species-keyed, like the
player's trainer back sprite. Resolution order at draw time:
image-level, then species-level, then the defaults (1x front, 2x back).
The pic stays grounded at any scale: player feet stay flush on the
text-box top, the enemy pic stays bottom-pinned in its slot, and the
scale composes with the send-out grow animation.
## commands
- semantics: `record`
- target: `Data.commands`
- value: function | {blocking?, fn, foreground?}
<!-- snippet: illustrative -->
```lua
mod.content.commands:register("shake_screen", function(ctx, frames) ... end)
```
## constants
- semantics: `deep`
- target: `Data.constants`
Id = a top-level key of the target table. Keys not listed here are
accepted and merged as-is.
| key | type |
|---|---|
| `badges` | list of {icon?, id, item?, name?} |
| `bagSize` | integer >= 1 |
| `boxCount` | integer >= 1 |
| `boxSize` | integer >= 1 |
| `coinCap` | integer >= 0 |
| `dexDigits` | integer >= 1 |
| `dexSize` | integer >= 1 |
| `encounterBuckets` | list of integer 1..256 |
| `hmMoves` | list of moves id |
| `levelCap` | integer >= 1 |
| `moneyCap` | integer >= 0 |
| `moveMax` | integer >= 1 |
| `partyMax` | integer >= 1 |
<!-- snippet: illustrative -->
```lua
mod.content.constants:patch("levelCap", 80)
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Constants`
The record differs; the registry name, the verbs and the id space
do not.
Id = a top-level key of the target table. Keys not listed here are
accepted and merged as-is.
| key | type |
|---|---|
| `battleAnimBgPaletteOrder` | list of string |
| `battleAnimFramesetOrder` | list of string |
| `battleAnimFuncOrder` | list of string |
| `battleAnimGfxOrder` | list of string |
| `battleAnimOamsetOrder` | list of string |
| `battleAnimObPaletteOrder` | list of string |
| `battleAnimObjectOrder` | list of string |
| `battleBgEffectOrder` | list of string |
| `cmdQueueOrder` | list of string |
| `decoDescOrder` | list of string |
| `eggGroupOrder` | list of string |
| `environmentOrder` | list of string |
| `evolveMethodOrder` | list of string |
| `fishGroupOrder` | list of string |
| `floorOrder` | list of string |
| `generation` | integer >= 1 |
| `growthRateOrder` | list of string |
| `heldEffectOrder` | list of string |
| `iconOrder` | list of string |
| `itemMenuOrder` | list of string |
| `itemNameCount` | integer >= 0 |
| `itemOrder` | list of string |
| `landmarkOrder` | list of string |
| `mapCallbackOrder` | list of string |
| `mapGroups` | list of {group, height, map, name, width} |
| `mapOrder` | list of string |
| `moveEffectOrder` | list of string |
| `moveOrder` | list of string |
| `musicOrder` | list of string |
| `numOverworldSprites` | integer >= 0 |
| `paletteOrder` | list of string |
| `phoneContactOrder` | list of string |
| `pocketOrder` | list of string |
| `sfxOrder` | list of string |
| `source` | string |
| `spawnOrder` | list of string |
| `specialCallOrder` | list of string |
| `specialOrder` | list of string |
| `speciesOrder` | list of string |
| `spriteOrder` | list of string |
| `spritePokemon` | integer >= 0 |
| `stdScriptOrder` | list of string |
| `tilesetOrder` | list of string |
| `tradeDialogOrder` | list of string |
| `tradeGenderOrder` | list of string |
| `trainerClassMembers` | map of string -> list of string |
| `trainerClassOrder` | list of string |
| `trainerTypeOrder` | list of string |
| `treeMonSetOrder` | list of string |
| `types` | map of string -> integer >= 0 |
<!-- snippet: illustrative -->
```lua
mod.content.constants:patch("speciesOrder", { [252] = "MODMON" })
```
## cries
- semantics: `record`
- target: `Data.audio.cries`
- value: {header, length, pitch} | {file} | {base, length?, pitch?} | {chip, length?, pitch?}
<!-- snippet: illustrative -->
```lua
mod.content.cries:patch("PIKACHU", { pitch = 200 })
```
## decorations
- semantics: `record`
- target: none
Gen 2 only: Red, Blue and Yellow have no such system, so there is no
Gen 1 table to merge into and a write here on a Gen 1 boot is dropped
and reported. See the Gold subsection below for where it does land.
| field | type | required |
|---|---|---|
| `action` | string | no |
| `flag` | integer >= 0 | yes |
| `name` | string | yes |
| `sprite` | integer 0..255 | yes |
| `type` | integer 1..6 | yes |
<!-- snippet: illustrative -->
```lua
mod.content.decorations:patch("deco:2", { name = "COZY" })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Decorations`
## encounters
- semantics: `record`
- target: `Data.encounters`
| field | type | required |
|---|---|---|
| `grass` | {rate, slots} | no |
| `id` | string | no |
| `water` | {rate, slots} | no |
<!-- snippet: illustrative -->
```lua
mod.content.encounters:patch("ROUTE_1", { grass = { rate = 30 } })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Encounters`
The record differs; the registry name, the verbs and the id space
do not.
Id = a top-level key of the target table. Keys not listed here are
accepted and merged as-is.
| key | type |
|---|---|
| `bugContest` | list of {chance, max, min, species} |
| `fishGroups` | map of string -> {chance, good, id?, index?, old, super} |
| `generation` | integer >= 1 |
| `grass` | map of string -> {map?, rates, slots} |
| `roamMaps` | list of {map, to} |
| `rocks` | map of string -> string |
| `source` | string |
| `swarmGrass` | map of string -> {map?, rates, slots} |
| `swarmWater` | map of string -> {map?, rate, slots} |
| `timeFishGroups` | map of string \| integer 0..255 -> {day, nite} |
| `treeMonsAsleep` | {DAY, MORN, NITE} |
| `treeSets` | map of string -> {common, rare?} |
| `trees` | map of string -> string |
| `water` | map of string -> {map?, rate, slots} |
<!-- snippet: illustrative -->
```lua
mod.content.encounters:patch("grass", { ROUTE_29 = { rates = { NITE = 40 } } })
```
## evolution_methods
- semantics: `record`
- target: `Data.evolution_methods`
| field | type | required |
|---|---|---|
| `check` | function | yes |
| `describe` | function | no |
<!-- snippet: illustrative -->
```lua
mod.content.evolution_methods:register("FRIENDSHIP", { check = fn })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2EvolutionMethods`
## field
- semantics: `deep`
- target: `Data.field`
Id = a top-level key of the target table. Keys not listed here are
accepted and merged as-is.
| key | type |
|---|---|
| `badgeGates` | map of string -> {badge?, coords?, failText?, guards?, passText?, passedFlag?, text?} |
| `boot` | {lastHeal?, namePresets?, playerName?, rivalName?, screens?, startFacing?, startMap?, startMoney?, startX?, startY?, starterScript?, title?} |
| `flyOrder` | list of string |
| `hiddenItems` | map of string -> list of {item, x, y} |
| `ledges` | list of {facing, input, ledgeTile, standingTile, tileset?} |
| `playerPics` | {back?, demoBack?, front?, oakBack?} |
| `townMap` | {background?, cursorOrder?, gridPixelSize?, locations?, nest?, upArrow?} |
<!-- snippet: illustrative -->
```lua
mod.content.field:patch("boot", { startMap = "SABLE_COVE" })
```
### On Gold (Gen 2)
No Gen 2 home: Gold reimplements this system without reading the
registry, so a write here is dropped and reported on a Gold boot.
`docs/mod-api-gen2-compat.md` in the engine repo lists what is left
to do for each one.
## font
- semantics: `record`
- target: `Data.font`
- value: {advance?, base, charmap?, glyphsPerRow?, image} | {code, seq} | {bold?, file?, size?, spacing?, tiles?, yOffset?}
<!-- snippet: illustrative -->
```lua
mod.content.font:register("charmap:hiragana_a", { seq = "あ", code = 256 })
```
## growth_rates
- semantics: `record`
- target: `Data.growth_rates`
| field | type | required |
|---|---|---|
| `expForLevel` | function | yes |
<!-- snippet: illustrative -->
```lua
mod.content.growth_rates:register("ERRATIC", { expForLevel = fn })
```
## held_items
- semantics: `record`
- target: none
Gen 2 only: Red, Blue and Yellow have no such system, so there is no
Gen 1 table to merge into and a write here on a Gen 1 boot is dropped
and reported. See the Gold subsection below for where it does land.
| field | type | required |
|---|---|---|
| `heldEffect` | string | yes |
| `heldParameter` | integer 0..255 | no |
<!-- snippet: illustrative -->
```lua
mod.content.held_items:override("LEFTOVERS", { heldEffect = "HELD_LEFTOVERS", heldParameter = 0 })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2HeldItems`
## icons
- semantics: `record`
- target: `Data.icons.bySpecies`
- value: string | {frames?, image, trueColor?}
<!-- snippet: illustrative -->
```lua
mod.content.icons:register("MODMON", "QUADRUPED") -- a built-in name, or { image = mod.assets:path("icon.png"), frames = 2 }
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Icons`
The record differs; the registry name, the verbs and the id space
do not.
- value: string | {frames, height, id?, image, index?, trueColor?, width}
<!-- snippet: illustrative -->
```lua
mod.content.icons:override("TOTODILE", "ICON_MONSTER")
```
## item_effects
- semantics: `record`
- target: `Data.item_effects`
| field | type | required |
|---|---|---|
| `battle` | boolean | no |
| `field` | boolean | no |
| `needsTarget` | boolean | no |
| `use` | function | yes |
<!-- snippet: illustrative -->
```lua
mod.content.item_effects:register("MOON_FLUTE", { use = fn, field = true })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2ItemEffects`
## items
- semantics: `record`
- target: `Data.items`
| field | type | required |
|---|---|---|
| `ball` | balls id | no |
| `effect` | item_effects id | no |
| `id` | string | yes |
| `index` | integer 0..255 | no |
| `machine` | {kind, move, number} | no |
| `name` | string | yes |
| `needsTarget` | boolean | no |
| `price` | integer >= 0 | yes |
| `tossable` | boolean | no |
<!-- snippet: illustrative -->
```lua
mod.content.items:patch("POTION", { price = 100 })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.items`
The record differs; the registry name, the verbs and the id space
do not.
| field | type | required |
|---|---|---|
| `ball` | balls id | no |
| `effect` | item_effects id | no |
| `id` | string | yes |
| `index` | integer 0..255 | no |
| `machine` | {kind, move, number} | no |
| `name` | string | yes |
| `needsTarget` | boolean | no |
| `price` | integer >= 0 | yes |
| `tossable` | boolean | no |
## landmarks
- semantics: `record`
- target: none
Gen 2 only: Red, Blue and Yellow have no such system, so there is no
Gen 1 table to merge into and a write here on a Gen 1 boot is dropped
and reported. See the Gold subsection below for where it does land.
| field | type | required |
|---|---|---|
| `id` | string | no |
| `index` | integer >= 0 | yes |
| `name` | string | yes |
| `x` | integer >= 0 | yes |
| `y` | integer >= 0 | yes |
<!-- snippet: illustrative -->
```lua
mod.content.landmarks:patch("LANDMARK_ROUTE_29", { x = 12 })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Landmarks.landmarks`
## link_fields
- semantics: `record`
- target: `Data.link_fields`
**Cart protocol only:** this registry does not make a freely enabled
loose mod eligible for player link play. Player links are set up in the
launcher with a vanilla cart or a sealed custom cart.
| field | type | required |
|---|---|---|
| `pack` | function | no |
| `rev` | integer >= 0 \| string | yes |
| `unpack` | function | no |
<!-- snippet: illustrative -->
```lua
mod.content.link_fields:register("held_item", { rev = 1, pack = fn, unpack = fn })
```
### On Gold (Gen 2)
No Gen 2 home: Gold reimplements this system without reading the
registry, so a write here is dropped and reported on a Gold boot.
`docs/mod-api-gen2-compat.md` in the engine repo lists what is left
to do for each one.
## map_scripts
- semantics: `compose`
- target: `Data.map_scripts`
- value: {onBoulderMoved?, onEnter?, onInteract?, onStep?, onVictory?, priority?, scripts?, snorlaxWake?, talk?}
<!-- snippet: illustrative -->
```lua
mod.content.map_scripts:register("PALLET_TOWN", { talk = { ... } })
```
### On Gold (Gen 2)
No Gen 2 home: Gold reimplements this system without reading the
registry, so a write here is dropped and reported on a Gold boot.
`docs/mod-api-gen2-compat.md` in the engine repo lists what is left
to do for each one.
## map_songs
- semantics: `record`
- target: `Data.audio.mapSongs`
- value: music id
<!-- snippet: illustrative -->
```lua
mod.content.map_songs:override("PALLET_TOWN", "Music_Routes1")
```
## maps
- semantics: `record`
- target: `Data.maps`
| field | type | required |
|---|---|---|
| `blocks` | list of integer 0..255 | yes |
| `borderBlock` | integer 0..255 | no |
| `connections` | map of one of "north" \| "south" \| "east" \| "west" -> any value | no |
| `height` | integer >= 1 | yes |
| `id` | string | yes |
| `index` | integer >= 0 | no |
| `label` | string | no |
| `objects` | list of {pokemon?, ...} | no |
| `palette` | string | no |
| `signs` | list of any value | no |
| `tileset` | tilesets id | yes |
| `warps` | list of {destGroup?, destMap, destMapNum?, destWarp, x, y} | no |
| `width` | integer >= 1 | yes |
<!-- snippet: illustrative -->
```lua
mod.content.maps:register("MY_CAVE", { tileset = "CAVERN", ... })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Maps`
## migrations
- semantics: `compose`
- target: none
- value: {run, since}
<!-- snippet: illustrative -->
```lua
mod.content.migrations:register("my_mod", { since = "1.0.0", run = fn })
```
## move_effects
- semantics: `record`
- target: `Data.move_effects`
| field | type | required |
|---|---|---|
| `accuracyChecked` | boolean | no |
| `kind` | one of "primary" \| "secondary" \| "full" | yes |
| `missText` | one of "didntAffect" \| "butItFailed" \| "evadedAttack" | no |
| `run` | function | no |
<!-- snippet: illustrative -->
```lua
mod.content.move_effects:register("DRAIN_PP_EFFECT", { kind = "primary", run = fn })
```
A "primary" handler returns its messages as an array. Set `failed = true` on that table when the effect did not land ("But, it failed!", "Nothing happened!", a target already asleep): the battle suppresses the move's success animation on that flag, the way the cart prints those refusals with no animation.
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2MoveEffects`
## moves
- semantics: `record`
- target: `Data.moves`
| field | type | required |
|---|---|---|
| `accuracy` | integer 0..100 | yes |
| `anim` | any value | no |
| `category` | one of "physical" \| "special" \| "status" | no |
| `chargeText` | string | no |
| `counterable` | boolean | no |
| `effect` | move_effects id | yes |
| `fixedDamage` | integer >= 1 \| function | no |
| `highCrit` | boolean | no |
| `id` | string | yes |
| `index` | integer 0..255 | no |
| `multiHit` | integer >= 1 \| list of integer >= 1 | no |
| `name` | string | yes |
| `power` | integer 0..255 | yes |
| `pp` | integer 0..64 | yes |
| `priority` | integer -7..7 | no |
| `semiInvulnerable` | boolean | no |
| `type` | type_chart id | yes |
<!-- snippet: illustrative -->
```lua
mod.content.moves:patch("BLIZZARD", { accuracy = 70 })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.moves`
The record differs; the registry name, the verbs and the id space
do not.
| field | type | required |
|---|---|---|
| `accuracy` | integer 0..100 | yes |
| `anim` | any value | no |
| `category` | one of "physical" \| "special" \| "status" | no |
| `chargeText` | string | no |
| `counterable` | boolean | no |
| `effect` | move_effects id | yes |
| `fixedDamage` | integer >= 1 \| function | no |
| `highCrit` | boolean | no |
| `id` | string | yes |
| `index` | integer 0..255 | no |
| `multiHit` | integer >= 1 \| list of integer >= 1 | no |
| `name` | string | yes |
| `power` | integer 0..255 | yes |
| `pp` | integer 0..64 | yes |
| `priority` | integer -7..7 | no |
| `semiInvulnerable` | boolean | no |
| `type` | type_chart id | yes |
## music
- semantics: `record`
- target: `Data.audio.songs`
- value: {address, bank, engine?} | {file, intro?, loopFile?, loopSeconds?, seconds?} | {channels, drums?, program, waves?} | {chip}
<!-- snippet: illustrative -->
```lua
mod.content.music:register("MOD_SONG", { file = "song.ogg" })
```
## palettes
- semantics: `record`
- target: `Data.palettes.palettes`
- value: list of list of integer 0..255 | {colors}
<!-- snippet: illustrative -->
```lua
mod.content.palettes:override("MEWMON", { {255,255,255}, ... })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Palettes`
The record differs; the registry name, the verbs and the id space
do not.
Id = a top-level key of the target table. Keys not listed here are
accepted and merged as-is.
| key | type |
|---|---|
| `battleObjects` | map of string -> list of list of integer 0..255 |
| `bg` | list of list of list of integer 0..255 |
| `daytimes` | list of string |
| `environments` | map of string -> map of one of "MORN" \| "DAY" \| "NITE" \| "DARK" -> list of integer >= 0 |
| `expBar` | list of list of integer 0..255 |
| `generation` | integer >= 1 |
| `hpBar` | map of one of "green" \| "yellow" \| "red" \| "blue" -> list of list of integer 0..255 |
| `objects` | map of one of "MORN" \| "DAY" \| "NITE" \| "DARK" -> list of list of list of integer 0..255 |
| `partyMenu` | list of list of list of integer 0..255 |
| `pokemon` | map of string -> {normal, shiny} |
| `roofSlot` | integer 0..7 |
| `roofs` | map of integer >= 0 -> {mornDay, nite} |
| `slotNames` | list of string |
| `source` | string |
| `trainers` | map of string -> list of list of integer 0..255 |
<!-- snippet: illustrative -->
```lua
mod.content.palettes:patch("pokemon", { TOTODILE = { shiny = { {255,255,255}, {255,0,0} } } })
```
## phone_contacts
- semantics: `record`
- target: none
Gen 2 only: Red, Blue and Yellow have no such system, so there is no
Gen 1 table to merge into and a write here on a Gen 1 boot is dropped
and reported. See the Gold subsection below for where it does land.
| field | type | required |
|---|---|---|
| `callee` | string | no |
| `calleeKey` | string | no |
| `calleeTime` | integer 0..7 | no |
| `caller` | string | no |
| `callerKey` | string | no |
| `callerTime` | integer 0..7 | no |
| `class` | string | no |
| `index` | integer >= 0 | yes |
| `map` | maps id | no |
| `member` | string | no |
| `name` | string | no |
| `number` | integer 0..255 | no |
<!-- snippet: illustrative -->
```lua
mod.content.phone_contacts:patch("PHONE_YOUNGSTER_JOEY", { map = "ROUTE_31" })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2PhoneContacts`
## pokemon
- semantics: `record`
- target: `Data.pokemon`
| field | type | required |
|---|---|---|
| `baseExp` | integer 0..255 | yes |
| `baseStats` | {attack, defense, hp, special, speed} | yes |
| `battleScaleBack` | number 0.25..4 | no |
| `battleScaleFront` | number 0.25..4 | no |
| `battleTheme` | music id | no |
| `catchRate` | integer 0..255 | yes |
| `cry` | cries id | no |
| `dex` | integer >= 1 | yes |
| `dexEntry` | {heightFt, heightIn, heightM?, kind, text, text2?, weight, weightKg?} | no |
| `evolutions` | list of {item?, level?, method, species} | yes |
| `frontSize` | integer 1..7 | yes |
| `growthRate` | growth_rates id | yes |
| `icon` | string \| {frames?, image} | no |
| `id` | string | yes |
| `index` | integer 0..255 | no |
| `learnset` | list of {level, move} | yes |
| `level1Moves` | list of moves id | yes |
| `name` | string | yes |
| `palette` | palettes id | no |
| `spriteBack` | file path | yes |
| `spriteFront` | file path | yes |
| `tmhm` | list of moves id | no |
| `trueColor` | boolean | no |
| `types` | list of type_chart id | yes |
<!-- snippet: illustrative -->
```lua
mod.content.pokemon:patch("MEW", { baseStats = { attack = 120 } })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.pokemon`
The record differs; the registry name, the verbs and the id space
do not.
| field | type | required |
|---|---|---|
| `baseExp` | integer 0..255 | yes |
| `baseStats` | {attack, defense, hp, specialAttack, specialDefense, speed} | yes |
| `battleScaleBack` | number 0.25..4 | no |
| `battleScaleFront` | number 0.25..4 | no |
| `battleTheme` | music id | no |
| `catchRate` | integer 0..255 | yes |
| `cry` | cries id | no |
| `dex` | integer >= 1 | yes |
| `eggGroups` | list of string | no |
| `eggGroupsRaw` | integer 0..255 | no |
| `eggMoves` | list of moves id | no |
| `eggSteps` | integer >= 0 | no |
| `evolutions` | list of {comparison?, into, item?, level?, method, time?} | yes |
| `genderRatio` | integer 0..255 | no |
| `growthRate` | growth_rates id | yes |
| `growthRateId` | integer 0..255 | no |
| `id` | string | yes |
| `index` | integer 0..255 | no |
| `items` | list of items id | no |
| `levelMoves` | list of {level, move} | yes |
| `name` | string | yes |
| `picSize` | integer 1..7 | yes |
| `source` | string | no |
| `spriteBack` | file path | yes |
| `spriteFront` | file path | yes |
| `tmhm` | list of moves id | no |
| `tmhmRaw` | list of integer 0..255 | no |
| `trueColor` | boolean | no |
| `types` | list of type_chart id | yes |
<!-- snippet: illustrative -->
```lua
mod.content.pokemon:patch("TOTODILE", { baseStats = { specialAttack = 80 } })
```
## radio_channels
- semantics: `record`
- target: none
Gen 2 only: Red, Blue and Yellow have no such system, so there is no
Gen 1 table to merge into and a write here on a Gen 1 boot is dropped
and reported. See the Gold subsection below for where it does land.
| field | type | required |
|---|---|---|
| `channel` | integer 0..255 | no |
| `name` | string | no |
<!-- snippet: illustrative -->
```lua
mod.content.radio_channels:register("PIRATE_RADIO", { channel = 9, name = "PIRATE RADIO" })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2RadioChannels`
## render_pipelines
- semantics: `record`
- target: `Data.render_pipelines`
| field | type | required |
|---|---|---|
| `available` | function | no |
| `drawWorld` | function | no |
| `gate` | function | no |
| `hotkey` | string | no |
| `invalidate` | function | no |
| `label` | string | yes |
| `levels` | list of string | no |
| `present` | function | no |
| `priority` | number | no |
| `update` | function | no |
| `worldPresent` | function | no |
<!-- snippet: illustrative -->
```lua
mod.content.render_pipelines:register("voxel", { label = "VOXEL", levels = { "OFF", "15", "35", "50" }, drawWorld = fn })
```
## rom_text
- semantics: `record`
- target: none
Gen 2 only: Red, Blue and Yellow have no such system, so there is no
Gen 1 table to merge into and a write here on a Gen 1 boot is dropped
and reported. See the Gold subsection below for where it does land.
- value: string
<!-- snippet: illustrative -->
```lua
mod.content.rom_text:override("_WokeUpText", "%s se réveille !")
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.text`
## rulesets
- semantics: `record`
- target: `Data.rulesets`
| field | type | required |
|---|---|---|
| `name` | string | yes |
<!-- snippet: illustrative -->
```lua
mod.content.rulesets:register("no_crits", { name = "no crits", critRate = 0 })
```
### On Gold (Gen 2)
No Gen 2 home: Gold reimplements this system without reading the
registry, so a write here is dropped and reported on a Gold boot.
`docs/mod-api-gen2-compat.md` in the engine repo lists what is left
to do for each one.
## screens
- semantics: `record`
- target: `Data.screens`
- value: function | {new}
<!-- snippet: illustrative -->
```lua
mod.content.screens:register("QuestLog", { new = function(game) ... end })
```
## sfx
- semantics: `record`
- target: `Data.audio.sfx`
- value: string | {address, bank, engine?} | {file} | {chip}
<!-- snippet: illustrative -->
```lua
mod.content.sfx:register("SFX_MOD_CHIME", { file = "chime.ogg" })
```
## sprites
- semantics: `record`
- target: `Data.sprites`
| field | type | required |
|---|---|---|
| `anchorX` | number | no |
| `anchorY` | number | no |
| `cellColumns` | integer >= 1 | no |
| `cellHeight` | integer >= 1 | no |
| `cellWidth` | integer >= 1 | no |
| `cells` | list of list of {dx?, dy?, flipX?, flipY?, tile} | no |
| `frameColumns` | integer >= 1 | no |
| `frameHeight` | integer >= 1 | no |
| `frameOffset` | integer >= 0 | no |
| `frameWidth` | integer >= 1 | no |
| `frames` | integer >= 1 | yes |
| `id` | string | no |
| `image` | file path | yes |
| `paletteSource` | string | no |
| `trueColor` | boolean | no |
| `walker` | boolean | no |
<!-- snippet: illustrative -->
```lua
mod.content.sprites:register("SPRITE_HERO", { image = "...", frames = 6 })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Sprites`
The record differs; the registry name, the verbs and the id space
do not.
| field | type | required |
|---|---|---|
| `frames` | integer >= 1 | yes |
| `icon` | string | no |
| `id` | string | no |
| `image` | file path | yes |
| `palette` | string | no |
| `paletteId` | integer 0..7 | no |
| `paletteSource` | string | no |
| `source` | string | no |
| `species` | pokemon id | no |
| `spriteType` | one of "WALKING_SPRITE" \| "STANDING_SPRITE" \| "STILL_SPRITE" \| "POKEMON_SPRITE" | no |
| `trueColor` | boolean | no |
| `walker` | boolean | no |
<!-- snippet: illustrative -->
```lua
mod.content.sprites:patch("SPRITE_BEAUTY", { palette = "PAL_OW_RED", paletteId = 0 })
```
## statuses
- semantics: `record`
- target: `Data.statuses`
| field | type | required |
|---|---|---|
| `beforeMove` | function | no |
| `beforeMovePriority` | integer >= 0 | no |
| `canInflict` | function | no |
| `catchBonus` | integer 0..255 | no |
| `cureOnSwitch` | boolean | no |
| `hudLabel` | string | no |
| `id` | string | no |
| `label` | string | yes |
| `onInflict` | function | no |
| `residual` | function | no |
| `shakeBonus` | integer 0..255 | no |
| `statPenalty` | {div, stat} | no |
<!-- snippet: illustrative -->
```lua
mod.content.statuses:patch("BRN", { catchBonus = 12 })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Statuses`
## strings
- semantics: `record`
- target: `Data.strings`
- value: string
<!-- snippet: illustrative -->
```lua
mod.content.strings:override("But, it failed!", "Echec !")
```
## text
- semantics: `record`
- target: `Data.text`
- value: string
<!-- snippet: illustrative -->
```lua
mod.content.text:override("_PalletTownText1", "HELLO!")
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Text`
## text_pointers
- semantics: `deep`
- target: `Data.text_pointers`
Id = a top-level key of the target table; every key carries the same
shape.
- value: map of string -> {asm?, cableClub?, label?, mart?, nurse?, pc?, text?}
<!-- snippet: illustrative -->
```lua
mod.content.text_pointers:patch("PalletTown", { TEXT_PALLETTOWN_SIGN = { text = "_MySign" } })
```
### On Gold (Gen 2)
No Gen 2 home: Gold reimplements this system without reading the
registry, so a write here is dropped and reported on a Gold boot.
`docs/mod-api-gen2-compat.md` in the engine repo lists what is left
to do for each one.
## tilesets
- semantics: `record`
- target: `Data.tilesets`
| field | type | required |
|---|---|---|
| `animation` | string | no |
| `blocks` | list of any value | yes |
| `counterTiles` | any value | no |
| `doorTiles` | any value | no |
| `id` | string | no |
| `image` | file path | yes |
| `imageHeight` | integer >= 1 | no |
| `imageWidth` | integer >= 1 | no |
| `tilesPerRow` | integer >= 1 | no |
| `trueColor` | boolean | no |
| `walkable` | any value | no |
| `warpTiles` | any value | no |
<!-- snippet: illustrative -->
```lua
mod.content.tilesets:register("MY_TILES", { image = "...", blocks = { ... } })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Tilesets`
## tokens
- semantics: `record`
- target: `Data.tokens`
- value: function
<!-- snippet: illustrative -->
```lua
mod.content.tokens:register("CLOCK", function(game) return "12" end)
```
## trainers
- semantics: `record`
- target: `Data.trainers`
| field | type | required |
|---|---|---|
| `aiClass` | ai_classes id | no |
| `aiMods` | any value | no |
| `baseMoney` | integer >= 0 | no |
| `basePic` | trainers id | no |
| `battleTheme` | music id | no |
| `brain` | function | no |
| `id` | string | yes |
| `index` | integer 0..255 | no |
| `name` | string | yes |
| `palette` | palettes id | no |
| `paletteSource` | string | no |
| `parties` | list of list of {level, moves?, species} | yes |
| `partyNames` | map of integer >= 1 -> string | no |
| `pic` | file path | no |
| `trueColor` | boolean | no |
<!-- snippet: illustrative -->
```lua
mod.content.trainers:patch("OPP_BROCK", { baseMoney = 99 })
```
### On Gold (Gen 2)
- semantics: `record`
- target: `Data.gen2Trainers`
The record differs; the registry name, the verbs and the id space
do not.
| field | type | required |
|---|---|---|
| `attributes` | list of integer 0..255 | no |
| `baseMoney` | integer >= 0 | no |
| `battleTheme` | music id | no |
| `encounterMusic` | music id | no |
| `id` | string | no |
| `index` | integer 0..255 | no |
| `items` | list of items id | no |
| `name` | string | yes |
| `pic` | file path | no |
| `trainers` | list of {id?, index?, name, party, trainerType?} | yes |
| `trueColor` | boolean | no |
<!-- snippet: illustrative -->
```lua
mod.content.trainers:patch("BEAUTY", { baseMoney = 99 })
```
## transitions
- semantics: `record`
- target: `Data.transitions`
| field | type | required |
|---|---|---|
| `draw` | function | no |
| `flash` | boolean | no |
| `frames` | integer >= 1 | yes |
| `sound` | string | no |
<!-- snippet: illustrative -->
```lua
mod.content.transitions:register("dissolve", { frames = 30, draw = fn })
```
### On Gold (Gen 2)
No Gen 2 home: Gold reimplements this system without reading the
registry, so a write here is dropped and reported on a Gold boot.
`docs/mod-api-gen2-compat.md` in the engine repo lists what is left
to do for each one.
## type_chart
- semantics: `record`
- target: `Data.type_chart`
- value: {multiplier} | {category, index?, name?}
<!-- snippet: illustrative -->
```lua
mod.content.type_chart:register("BUG>PSYCHIC_TYPE", { multiplier = 20 })
```
## v1 aliases
| alias | canonical |
|---|---|
| `scripts` | `map_scripts` |
| `ui` | `screens` |