// Effect modules 0x1853C8..0x1895E8, one per file: src/battle/eft_v.c (0x1853C8..0x1871A8, particle emitter tail),
// eft_v_b.c (0x1871A8..0x187C50, impact effect), eft_v_c.c (0x187C50..0x1895E8, sprite chain, first half);
// include/battle/eft_v.h (layouts), eft_v_ext.h (local declarations of other modules).
//
// 1. Particle emitter, effect pack part kind 5 (tail of the module that starts at 0x182CE8). "Ptcl": a task that
// emits up to 500 pooled particles and draws them as quads. Emit: the emission step (count + random range every
// `interval` frames, limited by the free pool). The four draw routines are chosen by the definition's shape byte
// and flag 2: squares (shape 1, EftPrim_DrawQuadDepth / EftGfx_DrawSprite with width = height), sprites (shape 2),
// quads along the particle axis facing the camera (shape 0; packets or the clipped polygon path).
EftPtcl_Emit = 0x001853C8; // type:func
EftPtcl_DrawSquares = 0x001854F8; // type:func
EftPtcl_DrawSprites = 0x00185610; // type:func
EftPtcl_DrawAxisQuads = 0x00185728; // type:func
EftPtcl_DrawAxisPolys = 0x00185E58; // type:func
// Callbacks of the emitter task class 0x2C3EF0 (table order: update, init, term, post-update, reset, draw).
EftPtcl_Init = 0x00186250; // type:func
EftPtcl_Term = 0x001866A0; // type:func
EftPtcl_Update = 0x001866C0; // type:func
EftPtcl_PostUpdate = 0x00186930; // type:func
EftPtcl_Reset = 0x00186938; // type:func
EftPtcl_Draw = 0x00186950; // type:func
// Callbacks of the manager class 0x2C3ED8 (update, init, term, 0, reset, 0): allocates the 0x50-byte manager, the
// pool of 500 particles and the list of 60 emitter tasks.
EftPtclMgr_Init = 0x00186A60; // type:func
EftPtclMgr_Term = 0x00186AF8; // type:func
EftPtclMgr_Update = 0x00186B40; // type:func
EftPtclMgr_Reset = 0x00186B48; // type:func
// Entries the effect pack library calls (EftEmit_SpawnType5 in eft_h.c and the kill / is-alive passes in eft_i.c).
// Every one checks that the handle is a live emitter task (class update == EftPtcl_Update, flag 1) and returns 1
// when it acted. Stop: no more emission (after the stop delay / linger); Kill: the task ends on its next update.
// Warp: SetPos that also moves the particles already emitted.
EftPtcl_Create = 0x00186B50; // type:func
EftPtcl_Stop = 0x00186BC0; // type:func
EftPtcl_Kill = 0x00186C20; // type:func
EftPtcl_IsAlive = 0x00186C70; // type:func
EftPtcl_SetPos = 0x00186CB0; // type:func
EftPtcl_Warp = 0x00186D08; // type:func
EftPtcl_SetDir = 0x00186DF0; // type:func
EftPtcl_SetSize = 0x00186EB8; // type:func
EftPtcl_SetStartDelay = 0x00186F00; // type:func
EftPtcl_SetStopDelay = 0x00186F48; // type:func
EftPtcl_SetLinger = 0x00186F90; // type:func // guess
EftPtcl_SetTexture = 0x00186FE0; // type:func // guess
EftPtcl_SetFront = 0x00187038; // type:func // guess
EftPtcl_SetFlag40 = 0x00187088; // type:func
EftPtcl_SetFlag80 = 0x001870F0; // type:func
EftPtcl_SetType = 0x00187158; // type:func
gEftPtcl = 0x002FEA74; // size:0x4
gEftPtclList = 0x002FEA78; // size:0x4
gEftPtclMgrClass = 0x002C3ED8; // size:0x18
gEftPtclClass = 0x002C3EF0; // size:0x18
//
// 2. Impact effect: a task that plays one emitter set of the common effect pack at a point. Group 0 = hit sparks
// (six sets, ids 0..16, started by the fighter effect layer through SpawnHit / SpawnHitScaled), group 1 = blast
// impacts (eight sets, ids 0..12, started by EftHit_SpawnBlastImpact / EftHit_SpawnTechImpact / the sweeping beam
// through SpawnBlast). SpawnParts: the per-frame pass over the set's 19 part kinds. GetSet / GetNodeMask: the
// id -> set and id -> node slot tables.
EftImpact_SpawnParts = 0x001871A8; // type:func
EftImpact_GetSet = 0x001872E0; // type:func
EftImpact_GetNodeMask = 0x00187418; // type:func
// Callbacks of the task class 0x2C3F20 (update, init, term, post-update, reset, draw).
EftImpact_Init = 0x001874A0; // type:func
EftImpact_Term = 0x00187658; // type:func
EftImpact_Update = 0x001876A0; // type:func
EftImpact_PostUpdate = 0x001877B8; // type:func
EftImpact_Reset = 0x00187828; // type:func
EftImpact_Draw = 0x00187870; // type:func
// Callbacks of the manager class 0x2C3F08 (update, init, term, 0, reset, 0): loads the fourteen sets, list of 30.
EftImpactMgr_Init = 0x00187878; // type:func
EftImpactMgr_Term = 0x001879F0; // type:func
EftImpactMgr_Update = 0x00187A80; // type:func
EftImpactMgr_Reset = 0x00187AF8; // type:func
EftImpact_SpawnHit = 0x00187B00; // type:func
EftImpact_SpawnHitScaled = 0x00187B70; // type:func
EftImpact_SpawnBlast = 0x00187BE0; // type:func
gEftImpact = 0x002FEA7C; // size:0x4
gEftImpactList = 0x002FEA80; // size:0x4
gEftImpactMgrClass = 0x002C3F08; // size:0x18
gEftImpactClass = 0x002C3F20; // size:0x18
//
// 3. Sprite chain, effect pack part kind 15 (first half; creation entry 0x18BB08 and the node pool are in the next
// file). "Link" because it lays sprites out from one point to a second one. // guess
// Manager class 0x2C3F38 (update, init, term, 0, reset, 0); task class 0x2C3F50 (update, init, term, post-update,
// reset, draw). Place: one sprite every `spacing` along the segment, jittered along it (VU0 random).
// InitGrow / UpdateGrow: scale and spacing ramps of definition flag 0x200. InitKeys / UpdateKeys: differences
// between two keys of the definition, and the interpolated current values (definition flag 0x400).
EftLinkMgr_Init = 0x00187C50; // type:func
EftLinkMgr_Update = 0x00187CC8; // type:func
EftLinkMgr_Reset = 0x00187CD0; // type:func
EftLinkMgr_Term = 0x00187CD8; // type:func
EftLink_Init = 0x00187D08; // type:func
EftLink_Update = 0x00187F90; // type:func
EftLink_PostUpdate = 0x00188250; // type:func
EftLink_Draw = 0x00188258; // type:func
EftLink_Reset = 0x00188558; // type:func
EftLink_Term = 0x00188570; // type:func
EftLink_Place = 0x001885E0; // type:func
EftLink_InitGrow = 0x00188838; // type:func
EftLink_UpdateGrow = 0x00188960; // type:func
EftLink_InitKeys = 0x001889E8; // type:func
EftLink_UpdateKeys = 0x00189060; // type:func
gEftLink = 0x002FEA84; // size:0x4
gEftLinkMgrClass = 0x002C3F38; // size:0x18
gEftLinkClass = 0x002C3F50; // size:0x18
