// Our names for the functions and globals of 1.0 (NA 1.0, ROM SHA-1 47ae795a...), one per line: name = address; // where the name comes from.
// See docs/reference-rig.md#the-symbol-map-roadmap-08 for the naming rules.
rspbootTextStart = 0x80000470; // library: the RSP boot microcode, 0xD0 bytes (ucode_boot of the gfx task Gfx.BuildTask builds, and of the audio task Audio.BuildTask)
gspF3DEX2_fifoTextStart = 0x80001360; // library: the F3DEX2 fifo 2.08 microcode's text (the gfx task's ucode, size 0x1000): the boot DMAs its first 0xF80 bytes to IMEM 0x1080, and the overlays follow at +0xF80 (the end-of-task one), +0x1018 and +0x1188 (the lighting one)
Rsp.F3dex2DoneOverlay = 0x800022e0; // coined; docs/systems/rendering.md: F3DEX2's overlay at ucode +0xF80, 0x98 bytes loaded to IMEM 0x1000 when the display list ends (it halts with break)
Rsp.F3dex2LightingOverlay = 0x800024e8; // coined; docs/systems/rendering.md: F3DEX2's lighting overlay at ucode +0x1188, 0x208 bytes loaded to IMEM 0x12D8 by G_VTX when G_LIGHTING is on: it turns each light's direction by the modelview 3x3 and normalises it (vrsq) to bytes of 128 a unit, then per vertex adds the ambient and each light's colour times its dot with the vertex's raw s8 normal, clamped to 255, and jumps back to IMEM 0x1454 from its end at 0x14D8
SaveBits.Init = 0x800026f0; // coined; docs/systems/saves.md: the bit stream the save file's party block is packed in: (stream, buffer), position 0; bits go lowest first, bit n at byte n >> 3, bit n & 7
SaveBits.Write = 0x80002700; // coined; docs/systems/saves.md: (stream, value, count): the value's low count bits, lowest first, at the position
SaveBits.Read = 0x8000277c; // coined; docs/systems/saves.md: (stream, count): count bits as an unsigned value
SaveBits.Skip = 0x800027f4; // coined; docs/systems/saves.md: (stream, count): moves the position on, leaving the bits as they were (zero in a fresh buffer)
PartyMenu.MakeArmorMenu = 0x80002890; // coined; docs/systems/pause-menu.md: the Mechanic's popup, or the message that there are no hides
MakeHealerMenu = 0x800034a0; // the debug build's string 0x800d74f8 (debug 0x800041c0); 1.0 has no string
Healer.OnLayOnHands = 0x800034ec; // coined; docs/systems/pause-menu.md: the tasks' first row
Healer.OnHerbs = 0x80003514; // coined; docs/systems/pause-menu.md: the tasks' second row
Healer.OnRestore = 0x8000353c; // coined; docs/systems/pause-menu.md: the tasks' third row
Healer.Build = 0x8000360c; // coined; docs/systems/pause-menu.md: the Healer's popup, MenuPopup.Menu with its own vtable (0x800cd060)
Healer.OnA = 0x80003864; // coined; docs/systems/pause-menu.md: vtable +0x7c, the selected row's A
Healer.OnB = 0x800038c4; // coined; docs/systems/pause-menu.md: vtable +0x84, then MenuPopup.OnB
Healer.ShowLayOnHandsList = 0x800038e4; // coined; docs/systems/pause-menu.md: the members but the Healer, rebuilt in the same popup
Healer.ShowHerbList = 0x80003ab8; // coined; docs/systems/pause-menu.md: the living members, rebuilt in the same popup
Healer.ShowRestoreMembers = 0x80003c84; // coined; docs/systems/pause-menu.md: the living members, rebuilt in the same popup
Healer.ShowRestoreStats = 0x800040fc; // coined; docs/systems/pause-menu.md: the six attributes, rebuilt in the same popup
Healer.ClearList = 0x80004304; // coined; docs/systems/pause-menu.md: frees the popup's title and list, leaving its parchment, shadow, alpha and state
Wanderers.Reaches = 0x80004480; // Wanderers.cs
MapObjectUse.Reach = 0x80004654; // docs/systems/wanderers.md
TrekLoop.CampStart = 0x80004ac0; // coined; docs/systems/camping.md: trek state 0x11, TrekLoop.Camp then the camp scene, or an ambush (state 2)
TrekLoop.CampScene = 0x80004b0c; // coined; docs/systems/camping.md
Widget.SetClipRect = 0x80004c38; // coined; docs/systems/ui.md: (widget, x0, y0, x1, y1) into +0x64, +0x68, +0x66 and +0x6a, inclusive: Widget.SetClip in the other order
TrekLoop.CampsiteScene = 0x80004cd4; // coined; docs/systems/camping.md
StartGfxList = 0x80005a34; // string 0x800cde44
Gfx.BuildTask = 0x80006728; // coined; docs/systems/rendering.md: fills a frame's graphics OSTask: boot 0x80000470 (0xD0), ucode 0x80001360 (0x1000), data 0x800d7520 (0x800), the display list and output buffers; from AppProc
RandomExtensions.Range = 0x800085b0; // RandomExtensions.Range on the game's stream: Rng.Range(0x800d8088, lo, hi); equal bounds draw nothing
RandomExtensions.RollD = 0x800085e0; // Random.cs: the sum of rolls of 1 to n, each through 0x800085b0
Party.SkillCheckStep = 0x80008654; // Party.cs: a margin to the gSkillCheck step 1..21 (DegreeThresholds)
BattleSetup.ChooseArena = 0x80008698; // coined; docs/systems/combat.md: arena (0-27) for the chunk's terrain, written to 0x800d947f; some terrains pick between two arenas at random
BattleSetup.TrimByLevel = 0x800088e4; // coined; docs/systems/combat.md
BattleSetup.SureKinds = 0x80008ec8; // coined; docs/systems/combat.md
BattleSetup.ChooseKinds = 0x800090a4; // coined; FillEnemies' pass 2 (the extras) -- pass 1 is 0x80008ec8 (BattleSetup.SureKinds), pass 3 0x800088e4 (BattleSetup.TrimByLevel)
BattleSetup.FillEnemies = 0x80009374; // coined; docs/systems/combat.md: clears the 12-entry enemy list at 0x800d9458 and fills it from a monster party's table (min..max of each kind); an empty result is one entity 0x200+D0e28fb
BattleSetup.FromMonsterParty = 0x800094b4; // coined; docs/systems/combat.md: fills the setup block from a monster party map object (the debug build's asserts cite globals.cpp lines 0x2fe-0x315): remember data, bonus loot, flag, arena, enemies; from Wanderer.Tick, IMapObjectHost.Talk and a script's battle op
CampEncounters.Load = 0x800096dc; // coined; docs/formats/db.md
String.AppendLine = 0x8000983c; // coined; docs/systems/combat.md: (text, piece, length): appends the piece and a newline, returns the longest line so far
Zones.FindBreadcrumb = 0x80009a48; // coined; docs/systems/combat.md: (pos, row, column, map set, nearest) the nearest or farthest of the 15 crumbs in the map set, distance with 100 a chunk
Memory.CanLoad = 0x80009d60; // coined; docs/systems/audio.md
Zones.QueueTeleport = 0x8000a23c; // coined; docs/systems/audio.md: the pending teleport (a door, a script) with a fade out
Zones.QueueChunkShift = 0x8000a2a8; // coined; docs/systems/audio.md: a chunk crossing, a pending teleport with an offset and no fade
Zones.QueueTeleportToPoint = 0x8000a344; // coined; docs/systems/audio.md: a pending teleport to a point in a chunk, for scripts
MapObjectUse.Tread = 0x8000a3ec; // MapObjectUse.cs; docs/systems/map-objects.md: a trigger triangle touched (PerformCallback type 8): a camera, a teleporter, or a dialogue whose flag A holds, with no distance test
Zones.FreeCell = 0x8000a65c; // coined; docs/systems/wanderers.md: (cell, freeScenes, keep): frees a 3x3 cell's scenes, its wanderers (Wanderers.Unload by its load id) and zone, and zeroes its Borg ids
Zones.KeepCell = 0x8000a94c; // coined; docs/systems/wanderers.md: moves an old cell matching a new one of the 3x3 (the same scene and map) into its place, keeping its load id
CheckToggleZoneScene = 0x8000aa14; // string debug 0x800d83c0 (debug 0x8000dba4), matched by tools/builds.py: a lighthouse chunk's zone scene swapped to the lit one while 5017 holds
Zones.BuildCell = 0x8000afb4; // coined; docs/systems/wanderers.md: builds a cell's zone from its map once, with a new load id (+0x18): LoadedMap.Activate, Wanderers.Load, its sounds
LoadGameBorgScenes = 0x8000b05c; // the debug build's string 0x800d85ac (debug 0x8000e284): loads the 3x3; the centre chunk chooses its sky (docs/systems/weather.md)
CutSceneStage.Point = 0x8000b6f0; // CutScene.cs
Zones.SetSceneColors = 0x8000c298; // coined; docs/systems/rendering.md
SceneObjectFade.Between = 0x8000c430; // SceneObjectFade.cs: (position, camera, aim, &across, &aimToPoint): how far a scene object is off the camera-to-aim line, and the way on from there to the aim; false if the aim is nearer than the object. RenderVoxelScenes calls (0x8000c974) before the 0.35-wide alpha band
RenderVoxelScenes = 0x8000c67c; // string 0x800cd634
Zones.DrawChunkScene = 0x8000d02c; // coined; docs/systems/rendering.md
Zones.DrawChunkTransScene = 0x8000d088; // coined; docs/systems/rendering.md
ChunkView.Crosses = 0x8000d0ec; // ChunkView.cs: whether a line crosses one edge of a chunk grown by 20
ChunkView.Drawn = 0x8000d270; // ChunkView.cs; the original returns 0 for a chunk in view, 1 for one out of it
Zones.DrawDeferredScenes = 0x8000dc98; // coined; docs/systems/rendering.md
RenderTransZones = 0x8000dd44; // string 0x800cd914, the label HandleZoneEngineFrame sets before calling it
Zones.ResetBreadcrumbs = 0x8000df00; // coined; all 15 crumbs := the record, next 0, fled 0, timer 0
InitZoneEngine = 0x8000df84; // the debug build's string 0x800d88fc (debug 0x800112bc)
SaveZoneEngine = 0x8000e3d4; // the debug build's string 0x800d895c (debug 0x80011724): the 0x2c record of where the player stands (Zones.SavedPosition, a breadcrumb): position, the body's +0x20 heading, the camera's eye, row, column, map set; docs/systems/combat.md
Bgm.Stop = 0x8000e4c4; // coined; docs/systems/audio.md
Bgm.StopIfNoPak = 0x8000e528; // coined; docs/systems/audio.md
Bgm.Update = 0x8000e570; // coined; docs/systems/audio.md
FreeZoneEngine = 0x8000e6c8; // the debug build's string 0x800d8984 (debug 0x80011a1c): leaves sky type 2, SetBackgroundType(2, 0, 0)
HandleZoneEngineFrame = 0x8000e784; // the debug build's string 0x800d8b9c (debug 0x80011e54): trek's and cut-scenes' frame, RenderSky to ProcessWeather
Wanderers.Init = 0x8000edd4; // coined; docs/systems/wanderers.md: (head, capacity): capacity slots of 0x54 bytes and the free stack 0..capacity-1, from InitGameTrek with 39
Wanderers.Load = 0x8000eee0; // Wanderers.cs; docs/systems/wanderers.md: a built chunk's monster parties in index order, active and not remembered; none in game mode 12 or Zones.Mode 2
Wanderers.Alloc = 0x8000f008; // coined; docs/systems/wanderers.md: a body for a monster party from the free stack's top, with no bound in 1.0 (the debug build raises "Too Many wanderers already allocated")
Wanderers.Free = 0x8000f230; // coined; docs/systems/wanderers.md: frees the body, clears the slot's in use (+0x20) and pushes its id back
Wanderers.Unload = 0x8000f294; // coined; docs/systems/wanderers.md: frees every slot of one chunk load id (+0x4c), in slot order
Wanderer.Take = 0x8000f3e0; // Wanderer.cs
Wanderer.Choose = 0x8000f4c8; // Wanderer.cs
Wanderer.Resume = 0x8000f5b4; // Wanderer.cs
Wanderer.Tick = 0x8000f6a4; // docs/systems/wanderers.md
Containers.Explode = 0x8000ffe4; // coined; Explosion.Start (Particles/Explosion.cs), docs/systems/map-objects.md: a trapped container going off, its fires, burst, model, exploded flag and sound
MapObjects.Use = 0x800101a4; // coined; docs/systems/map-objects.md: (object, index, arg): the type's use function from MapObjects.UseTable
MapObjects.Gate = 0x800101e0; // coined; docs/systems/flags.md: (object): whether it is there, by the type's gate from VoxelObjects.GateTable; LoadedMap.Activate and Audio.UpdateSound call it
MapObjects.Enabled = 0x80010214; // coined; docs/systems/map-objects.md: (object, body): the type's flag A gate from MapObjects.EnabledTable
MapObjectUse.Harvest = 0x800103d0; // MapObjectUse.cs; docs/systems/map-objects.md: a herb, spice or gem source's reagent, its Used flag through MapObjects.WriteUsed
MapObjectUse.Loot = 0x800105ec; // MapObjectUse.cs; docs/systems/map-objects.md: using a container: a harvest, a custom container's Used flag, its trap, its lock, then its opened flag (followed by the read of flag 5626), its loot and gold
IMapObjectHost.Talk = 0x800109fc; // TrekLoop.cs
MapObjectUse.Trigger = 0x80010bc4; // MapObjectUse.cs; docs/systems/map-objects.md: a trigger going off: kind 1 sets its flag and reads flag 5626, bringing the flags up to date; 2 animates its linked actor; 4 changes its map's toggles; then MapObjects.WriteUsed
MapObjects.CanStart = 0x80010d08; // coined; docs/systems/map-objects.md: whether a dialogue or teleporter may start: in mode 1, TrekLoop.Busy clear, nothing queued (TrekLoop.StateQueued) and trek's state 3; no fade term
IMapObjectHost.StartScript = 0x80010d68; // TrekLoop.cs
MapObjects.Touches = 0x800113bc; // coined; docs/systems/map-objects.md: (object, point, measure): if measure, the point within the stored radius (3D, inclusive), then flag A; ProcessVoxelObjects' and CutScene.Free's chain check's test
MapObjects.TouchesBody = 0x8001141c; // coined; docs/systems/map-objects.md: MapObjects.Touches at a body's position (+0x68); MapObjectUse.Tread passes measure 0
Popups.OpenJournalNotice = 0x800115a0; // coined; docs/systems/map-objects.md: opens "A new journal entry has been added." in Popups.Message
MapObjects.GateHolds = 0x800116ac; // coined; (flag slot, flags): 0 -> flags bit 8, 1 -> its inverse, else the flag xor bit 8
MapObjects.FlagGate = 0x80011704; // coined; docs/systems/map-objects.md: (slot, header, mask): flag 0 false, 1 true, else the flag, inverted by header & mask
MapObjects.WriteUsed = 0x80011760; // coined; docs/systems/map-objects.md: (flag, header, mask): writes the Used flag, set unless header & mask, then reads flag 5626, which brings the flags up to date
Teleporters.FindSecret = 0x800117c0; // coined; docs/systems/map-objects.md: a secret door found: the message (common text +0x5ec), its secret level cleared, its secret flag set and flag 5626 read
Body.InAlwaysAnimated = 0x80011830; // coined; docs/systems/combat.md: (body): the body's actor id (+0x0C) is in Body.AlwaysAnimated
Body.SetDown = 0x80011a64; // docs/systems/scripts.md
Player.Reset = 0x80011c90; // coined; docs/systems/audio.md: initialises a body slot; the default entity is Alaron's (position 0x99)
Shadows.Draw = 0x80012044; // coined; docs/systems/movement.md
BodyShadow.DrawAlpha = 0x800122c4; // BodyShadow.cs: a body's shadow alpha, fading over the last 2 units to the draw distance, capped at the body's own alpha (+0x70c); BodyAlpha is its fade for the body itself
Shadows.Render = 0x80012358; // coined; docs/systems/movement.md
Player.FreeAudioSlot = 0x80012558; // coined; docs/systems/audio.md
AllocPlayerAudio = 0x80012610; // string in the debug build 0x800d9000 (debug 0x800160bc)
Bodies.Process = 0x80012784; // coined; docs/systems/scripts.md: every body's tick (the decomp's ProcessPlayers): steering, stick, collision, animation; a body moves across the ground only by its actor's root motion (0x80013318-0x80013400)
Body.SetTint = 0x8001371c; // coined; docs/systems/combat.md: (body, rate, r, g, b) the target mark's pulse: body +0x760 rate, +0x764 colour
Body.ClearTint = 0x80013774; // coined; docs/systems/combat.md: rate -inf, the pulse off
Bodies.SetLights = 0x80013798; // coined; docs/systems/rendering.md: a body's prim, ambient, sun, moon, dynamic and map lights
MapObjects.SetActorLights = 0x80013ac4; // coined; docs/systems/rendering.md: a map's actor's tint or lights
Bodies.Render = 0x80013dcc; // coined; docs/systems/cameras.md: draws the bodies (the decomp's RenderPlayers); skips a hidden body's scene (+0x1e & 0x2000) only while CutScene.Playing, never what it holds
Body.ClampToGoal = 0x80014518; // coined; docs/systems/combat.md: a body at or past Body.SetGoal's radius, in 3D from its centre, has its x and z put back on the sphere (Body.KeepInField)
Players.Alloc = 0x80014598; // coined; docs/systems/wanderers.md: a body from Players.Handler, raising an error (Debug.RaiseError) at its capacity, 40 in trek: Alaron and 39
Bodies.LoadActor = 0x800147e8; // coined; docs/systems/rendering.md: loads a body's actor scene, with room for 4 lights
Bodies.SetFlag = 0x80014a2c; // coined; a body's flags (+0x1e) |= x
Bodies.ClearFlag = 0x80014a3c; // coined; a body's flags (+0x1e) &= ~x
CutScene.Unhide = 0x80014dfc; // docs/systems/cameras.md
Body.StickAlongCamera = 0x80014f20; // coined; the stick (x, y) turned by the camera's look across the ground
Body.ApplyInput = 0x80014fec; // coined; docs/systems/combat.md: (body, event): trek's and combat's stick handler: R orbits the camera, else the stick along the camera's look sets the heading's goal and the request (2 walk, 3 run from 0.8, 0x19 with Z held)
Body.ZeroStick = 0x80015530; // coined; docs/systems/combat.md: (body): zeroes the stick (+0x11c/+0x120), +0x124/+0x128/+0x150, only if flag 2 is clear; Body.Stop's first call
Body.Stop = 0x800156e8; // Body.cs
Body.WalkTo = 0x80015724; // coined; docs/systems/combat.md: (body, x, y, z, flag 8): an AI walk's destination, flag 0x10 set
Body.ClearPath = 0x80015850; // coined; docs/systems/combat.md: flag 0x10 cleared, the 16-entry path queue (+0x154) zeroed
Body.NextPathStep = 0x80015890; // coined; docs/systems/combat.md: pops the next queued walk (+0x154..) into WalkTo
Body.Face = 0x80015910; // docs/systems/scripts.md
Body.StepTowardGoal = 0x800159c8; // coined; the steering of a body with flag 0x10 (an AI walk): the stick toward its destination, the stuck timer, Body.GiveUp
Body.SetGoal = 0x80015bd4; // coined; combat.md: body.+0x274 = position, +0x280 = radius, flag 4
Body.ClearGoal = 0x80015c0c; // coined; docs/systems/combat.md: clears body flag 4 (Body.SetGoal's), from TurnOrder.StopBody
Body.GiveUp = 0x80015c28; // Body.cs (GiveUp, SkipToEnd): a walking body put at its last queued point, or its goal with none (+0x260), set down by Body.SetDown(0, 0, 0), its path cleared; from 0x800159c8 outside combat and from Combat.InputMoving
Body.ReleaseCamera = 0x80015dec; // coined; (body): if it owns the camera, clears flag 1 and the owner
AllocScriptCamera = 0x800168f8; // string 0x800d9618 (debug 0x8001a838), matched by tools/builds.py
ScriptCameras.Free = 0x800169c0; // ScriptCameras.cs
ProcessScriptCameras = 0x80016a50; // string 0x800d9644 (debug 0x8001a99c), matched by tools/builds.py
Explosion.Burst = 0x80016c00; // Explosion.cs; docs/systems/map-objects.md: 75 grey particles falling and bouncing for 420 ticks, and an orange light fading over 120
Explosion.SpawnFlame = 0x80017138; // Explosion.cs: a fire's spawn callback, a flame from the fire's place or its sphere's, moving its light there
Explosion.MakeFire = 0x8001732c; // Explosion.cs: (place, life, texture slot, interval, flame life, growth, colour, fade, warmth, spread): a code emitter of flames, its lift, growth and fade
Explosion.Fire = 0x800174f8; // Explosion.cs; docs/systems/map-objects.md: a fire of flames for its life, thrown with emitter flag 0x2000, and a light drifting red to yellow
Particles.Shift = 0x80017918; // coined; docs/systems/weather.md: moves every particle by a vector, and the weather's drops' landing points, as walking into another chunk moves the world's origin
LoadedMap.Activate = 0x80017af8; // LoadedMap.cs: a chunk's objects as it loads, scene objects looked up in the chart
Party.MirrorKeptSheets = 0x80017d9c; // coined; copies the four party slots into the kept sheets 0-3 (Party.Remove calls it)
Party.EraseKeptSheet = 0x80017ec8; // coined; (slot)
Party.EraseKeptSheetsOf = 0x80017f84; // coined; docs/systems/combat.md: erases every kept sheet (Party.KeptSheets, 9) with that entity id
Party.NewKeptSheet = 0x8001804c; // coined; allocs a 0x48 sheet and builds it by Character.Build, mode 3
Party.CopyGearToKept = 0x80018240; // coined; docs/systems/magic.md: a gear slot to a kept sheet as a bare item, with no enchantment
Party.CopyToKept = 0x8001844c; // coined; docs/systems/magic.md: (live sheet, kept sheet): stats, skills, gear and spellbook, no effects, so the save holds none
PakSave.WritePotion = 0x80018630; // coined; docs/systems/saves.md: (stream, potion record): kind 4 bits, power 4, timer 12; a null one skips 20
PakSave.ReadPotion = 0x8001869c; // coined; docs/systems/saves.md: (stream, entity): kind 4 bits, 0 for none, power 4, timer 12, then Character.ApplyPotionEffect
PakSave.WriteEffect = 0x80018720; // coined; docs/systems/saves.md: (stream, spell effect record): power 4 bits, kind 6, margin 5, harmful 1, timer 12; a null one skips 28
PakSave.ReadEffect = 0x800187b4; // coined; docs/systems/saves.md: (stream): power 4 bits (0 for none), kind 6, margin 5, harmful 1, timer 12, into a new effect record
PakSave.WriteStatMod = 0x800188a4; // coined; docs/systems/saves.md: (stream, stat mod): stat << 7 | (amount + 50) & 0x7F in 10 bits; null skips 10
PakSave.ReadStatMod = 0x800188f8; // coined; docs/systems/saves.md: (stream): the 10 bits as a new stat mod, null for 0
PakSave.WriteItem = 0x80018970; // coined; docs/systems/saves.md: (stream, item instance): id 13 bits, spell charges 5, stat mod 10; null or id 0 skips 28
PakSave.ReadItem = 0x800189f0; // coined; docs/systems/saves.md: (stream, inventory slot): id 13 bits (0 skips the other 15), charges 5, stat mod 10, into the slot's item
PakSave.WriteExperience = 0x80018aa0; // coined; docs/systems/saves.md: (stream, CharExp): total and spendable experience, 24 bits each
PakSave.ReadExperience = 0x80018b00; // coined; docs/systems/saves.md: (stream, CharExp): the same
PakSave.WriteStats = 0x80018b78; // coined; docs/systems/saves.md: (stream, sheet): Stats.Save of its CharStats, 80 bits
PakSave.ReadStats = 0x80018bb0; // coined; docs/systems/saves.md: (stream, CharStats): Stats.Load
PakSave.WriteSchoolSpells = 0x80018bec; // coined; docs/systems/saves.md: (stream, spellbook, group): the level of each of the group's spells in the spell table's order, 4 bits, 0 for one not known; group 0 is 5
PakSave.ReadSchoolSpells = 0x80018cec; // coined; docs/systems/saves.md: (stream, spellbook, group): the same, learning each spell at its level
PakSave.WriteSpells = 0x80018dc4; // coined; docs/systems/saves.md: (stream, spellbook, school): group 4's spells, then the school's group, 13 - count[school] slots of padding after it, which for school 0 (Chaos, whose 13 are group 5's) is 13 more
PakSave.ReadSpells = 0x80018e60; // coined; docs/systems/saves.md: (stream, spellbook, school): the same
PakSave.WriteClock = 0x80018efc; // coined; docs/systems/saves.md: (stream): the in-game clock, 32 bits
PakSave.ReadClock = 0x80018f3c; // coined; docs/systems/saves.md: (stream): the same into the world
PakSave.WriteGold = 0x80018f68; // coined; docs/systems/saves.md: (stream): the party's gold, 32 bits
PakSave.ReadGold = 0x80018f90; // coined; docs/systems/saves.md: (stream): 32 bits, returned
PakSave.WriteTimer = 0x80018fac; // coined; docs/systems/saves.md: (stream, ticks): ticks / 7200 in 12 bits, a timer in 2-minute units; an unsigned divide, so -1 doesn't come back as -1
PakSave.ReadTimer = 0x80018fe0; // coined; docs/systems/saves.md: (stream): 12 bits x 7200, 0xFFF is -1
PakSave.WriteAlaron = 0x80019028; // coined; docs/systems/saves.md: (stream, sheet): his name, 20 bytes, then the levels of the Elemental, Naming and Necromancy spells (groups 1 to 3, unpadded)
PakSave.ReadAlaron = 0x800190ec; // coined; docs/systems/saves.md: (stream, sheet): the same
PakSave.WriteSheet = 0x8001918c; // coined; docs/systems/saves.md: (stream, sheet): the entity's low byte, experience, stats, 18 skills, armor, shield, weapon and 12 gear, the spells: 720 bits (90 bytes), 52 more for Chaos; a null sheet skips 720
PakSave.ReadSheet = 0x8001928c; // coined; docs/systems/saves.md: (stream): a sheet from its entity's low byte + 0x200, built by Character.Build, then the rest; 0 skips 712
PakSave.WritePartySheet = 0x800193ac; // coined; docs/systems/saves.md: (stream, sheet): PakSave.WriteSheet, then 15 spell effects and 7 potions (always empty: the kept copy has none); a null sheet skips 0x500 bits
PakSave.ReadPartySheet = 0x80019498; // coined; docs/systems/saves.md: (stream): PakSave.ReadSheet, then the effects and potions; a null sheet skips 0x230 more
SaveBlock.Write = 0x80019810; // coined; docs/systems/weather.md: the save's party, time, weather snapshot (x 1000) and volumes
SaveBlock.Read = 0x80019b1c; // coined; docs/systems/weather.md: reads them back, restoring the weather
PakSave.WriteChart = 0x80019dec; // coined; docs/systems/saves.md: (buffer): the chart's count byte (0x800E0A70), the 19 slot numbers (0x800E0B58) and the 19 entries of 12 bytes (0x800E0A74)
PakSave.ReadChart = 0x80019e60; // coined; docs/systems/saves.md: (buffer): the same back
PakSave.Verify = 0x80019ed4; // coined; docs/systems/saves.md: (buffer): Crc.Check over the 0x1C00 bytes
PakSave.CopyThumbnail = 0x80019ef0; // coined; docs/systems/saves.md: (buffer): the pause menu's 64 x 32 RGBA5551 snapshot (0x800DA4F0, 0x1000 bytes), if there is one
PakSave.WriteHeader = 0x80019f30; // coined; docs/systems/saves.md: (header): the time played, the four party slots' entity IDs as halfwords, Alaron's name from +12
PakSave.WritePlace = 0x80019fd0; // coined; docs/systems/saves.md: (place, with place): SaveZoneEngine, then 0x2C bytes of Zones.SavedPosition
PakSave.Build = 0x8001a024; // coined; docs/systems/saves.md: (regions, with place): the header, the place, the plain flags, the minimaps' pieces, SaveBlock.Write and the chart
PakSave.Make = 0x8001a08c; // coined; docs/systems/saves.md: (buffer 0x1C00): zeroes it, PakSave.Build with the place, the thumbnail, then Crc.Seal
PakSave.Regions = 0x8001a0e8; // coined; docs/systems/saves.md: (buffer, regions): where the 0x1C00 bytes' parts are: header +0, place +0x40, flags +0x80, thumbnail +0x300, minimaps +0x1300, party stream +0x1340, chart +0x1B00
PakSave.Restore = 0x8001a158; // coined; docs/systems/saves.md: (regions, with place): the chart cleared, the flags read, flag 3617 cleared, the place, the minimaps, SaveBlock.Read, the chart, the time played; with place the saved chunk marks go to -1
PakSave.Load = 0x8001a20c; // coined; docs/systems/saves.md: (buffer): PakSave.Regions then PakSave.Restore with the place
Weather.Pause = 0x8001a238; // coined; docs/systems/weather.md: the weather's snapshot as the pause menu opens, with the thumbnail
PakSave.RestorePlace = 0x8001a484; // coined; docs/systems/saves.md: (place, with place): copies it to Zones.SavedPosition and starts the zone engine there (0x8000A344)
Weather.Resume = 0x8001a4f0; // coined; docs/systems/weather.md: restores the loaded snapshot once trek's world is built
AppProc = 0x8001a84c; // string 0x800d990c (debug); the same breadcrumbs as 0x800cde44, 0x800cde54
App.Init = 0x8001ac7c; // coined; docs/systems/ui.md: AppProc's setup: SetGfxMode(320, 240, 16), the fonts, the widget manager, App.State = 5
HandleAppFrame = 0x8001ae30; // string 0x800cde54
App.StateRegion = 0x8001af50; // coined; docs/systems/ui.md: app state 5: PAL (osTvType 0) shows Borg8 0x37C3 for ever, else state 3 with a pad in port 1, 4 without
Title.StartMusic = 0x8001b0b0; // coined; docs/systems/audio.md
Title.Frame = 0x8001b154; // coined; HandleAppFrame's state 0, where a script ending of kind 2 (game over) lands
Title.Frame2 = 0x8001b240; // coined; empty, called when the cards end
Title.CardFade = 0x8001b250; // coined; docs/systems/ui.md: one tick of a card's fade: +15 alpha to 255, hold N ticks, -15 to 0, black till 36 ticks from the fade out, then the next state
Title.LoadN64Logo = 0x8001b354; // coined; docs/systems/ui.md: Borg5 0x25A8 with clip planes 1 and 256, and the caption (Borg8 0xFA) at (109, 190)
Title.FreeN64Logo = 0x8001b46c; // coined
Title.CardsBegin = 0x8001b4d8; // coined; docs/systems/ui.md: loads the cards' images and the Copyright table, sets state 5
Title.CardsEnd = 0x8001b590; // coined; frees them, so the cards play again each time the app comes back to state 0
Title.CardsFrame = 0x8001b614; // coined; docs/systems/ui.md: the intro cards' state machine on Title.CardState, run by Title.Frame while Title.CardsActive is 1
Title.DrawCardImage = 0x8001b778; // coined; docs/systems/ui.md: (gfx, alpha, image): centred at (320 - w) / 2, (240 - h) / 2, white times alpha
Title.CardPak = 0x8001b86c; // coined; docs/systems/ui.md: card 1, state 5: Borg8 0x3758 (with the Pak) or 0x3759, hold 30 ticks, then state 4
Title.LegalLine = 0x8001b928; // coined; docs/systems/ui.md: centres a line of the Copyright table and moves y down by the font's cell height
Title.CardLegal = 0x8001b9bc; // coined; docs/systems/ui.md: card 2, state 4: Copyright lines 0-11 in the slim font, hold 120, then state 1
Title.CardN64 = 0x8001bba8; // coined; docs/systems/ui.md: card 3, state 1: the N64 logo scene orbited at 2 degrees a tick, 40 out and 15 up, hold 120, then state 2
Title.CardThq = 0x8001be3c; // coined; docs/systems/ui.md: card 4, state 2: Borg8 0x101, hold 120, then state 3
Title.CardH2o = 0x8001bf10; // coined; docs/systems/ui.md: card 5, state 3: Borg8 0xDE, hold 120, then state 0 (the cards end)
SkyColors.At = 0x8001cee0; // SkyColors.cs: the sky's five colours for a frame (RenderSky's), stored at 0x800d94f8-0x800d9508
SkyBackdrop.Draw = 0x8001c204; // SkyBackdrop.cs: the gradient's lines, toward the fog colour by min(2 fogTime, 1)
RenderSky = 0x8001d840; // the debug build's string 0x800d9c30 (debug 0x80021f00): the backdrop, the sky's colours and the lightning
SetBackgroundType = 0x8001dea8; // the debug build's string 0x800d9cb0 (debug 0x800225f8): (sky type, sky, ticks); at once for 0 ticks or a new type
Weather.Init = 0x8001e010; // coined; docs/systems/weather.md: InitZoneEngine's, clears gGlobals' weather (0x24 bytes), weather.cpp
Weather.Free = 0x8001e030; // coined; docs/systems/weather.md: the zone engine's free, stops the rain loop, weather.cpp
WeatherParticles.MakeSplash = 0x8001e04c; // WeatherParticles.cs: a particle laid on the ground as a splash
WeatherParticles.DropStep = 0x8001e138; // WeatherParticles.cs: a drop's step, which lands it as a splash
WeatherParticles.SpawnSplash = 0x8001e274; // WeatherParticles.cs: rain's own splashes
WeatherParticles.SpawnDrop = 0x8001e444; // WeatherParticles.cs: a drop or flake, which sweeps its fall
WeatherParticles.Make = 0x8001e62c; // WeatherParticles.cs: rain's or snow's two emitters, weather.cpp
Weather.StopRain = 0x8001e770; // coined; docs/systems/weather.md: stops the 0x071B loop, weather.cpp
ProcessWeather = 0x8001e7c0; // the debug build's string 0x800d9d1c (debug 0x80022f70); Weather.Draw in the port
Game.Init = 0x8001ee70; // coined; docs/systems/cinematics.md: a new game's globals and party (Party.Add Alaron), run by Game.Restart at boot and after the ending's credits and the game over
Game.Free = 0x8001f0e8; // coined; docs/systems/cinematics.md: frees the audio, characters, items and maps before Game.Restart
Game.Restart = 0x8001f284; // coined; docs/systems/cinematics.md: mode 0, the restart at the title: memsets the game's blocks, Game.Init, Game.Mode 0xF and a fade-in
ScreenFade.Step = 0x8001f330; // ScreenFade.cs
Credits.Frame = 0x8001f648; // coined; game mode 0x13's frame: starts Credits.Start once, runs the widgets over a black screen, and when it ends returns mode 0xF, 9 or 0 by Credits.Source
Combat.StartGameOverScript = 0x8001f860; // coined; docs/systems/combat.md: heals the leader, finds the dialogue object in Borg9 0xd5f whose script is CodeTable.GameOverScenes[0], Script.Start, state 21
Flags.SyncPartyStat = 0x8001f9b0; // coined; docs/systems/magic.md: (stat): the party's best modified value of the stat into its run of flags (FlagNetwork.SetBits), after a stat changes while the flags are up
Flags.SyncPartySkill = 0x8001fac8; // coined; docs/systems/magic.md: (skill): the same for a skill (Skills.AddModifiedNotify)
FlagNetwork.SetBits = 0x8001fbd0; // FlagNetwork.cs: writes a number into a run of flags, lowest bit first
FlagNetwork.Get = 0x8001fd5c; // coined; a flag: 0 is false and 1 true, else the flag network's
FlagNetwork.Set = 0x8001fda8; // coined; (flag, value): sets a flag, if it is 2 or more and in range
StateFlags.SetTime = 0x8001fdec; // StateFlags.cs
StateFlags.SetRain = 0x8001fe9c; // StateFlags.cs: flags 2319-2320 from the world's +0x6
StateFlags.SetTerrain = 0x8001fec0; // StateFlags.cs
TrekLoop.StateQueued = 0x8001fef0; // coined; docs/systems/map-objects.md: TrekLoop.Queued != -1
TrekLoop.QueueState = 0x8001ff04; // coined; docs/systems/audio.md: fades out, then switches trek to the state (0xb is a cut-scene cue, 2 a fight)
TrekLoop.Frame = 0x8001ffd8; // coined; docs/systems/ui.md: game modes 1 and 9, the switch on TrekLoop.State
TrekLoop.Busy = 0x80020638; // coined; docs/systems/map-objects.md: 1 while a trek popup, menu or dialogue widget is up (0x800d8144..0x800d8160, 0x800de9a0/4)
GetSnapShot = 0x800208b4; // string debug 0x800d9fbc (debug 0x80025744): copies the framebuffer, 320x240 at 16 bits, into the pause menu's backdrop
TrekHud.Draw = 0x80020bd4; // TrekHud.cs
TrekLoop.TickClock = 0x80020cb4; // coined; docs/systems/weather.md: trek's clock, once a frame while nothing else is up, through GameClock.Step
TrekLoop.DrawFrame = 0x80020dac; // coined; docs/systems/ui.md: trek's rendered frame: the zones, the HUD, Dialogue.DrawWidgets (its widgets step once whatever the delta) and the wanderers
FlagNetwork.SetNewestJournal = 0x80020ea4; // coined; docs/systems/flags.md: (index): the newest journal entry (0x800db05c), which GameStateFunnel.Write stores as a flag above 5555 turns on
TrekLoop.JournalEntryNotice = 0x80020eb0; // coined; docs/systems/pause-menu.md
InitGameTrek = 0x80020f40; // string 0x800da00c (debug 0x80025e30), matched by tools/builds.py
TrekLoop.Free = 0x800211a4; // docs/systems/wanderers.md
Combat.SetActionActive = 0x80021270; // coined; docs/systems/combat.md: 0x800db0cc: 1 while an action plays (the field ring isn't drawn), 0 at EndTurn
Combat.PlayDeathAnimation = 0x8002127c; // coined; docs/systems/combat.md: sets a body's animation request and its pending request to 9
Combat.ShowDamage = 0x80021294; // coined; docs/systems/combat.md: (body, damage, healing): a floating number from CombatStatIndicator.Add, 0 for damage and 1 for healing, and the hit effect on the body
Combat.DrawCastScene = 0x80021300; // coined; docs/systems/combat.md: draws the spell's scene (0x800db0c8) while the cast camera moves
Combat.DrawTargetCounts = 0x80021448; // coined; docs/systems/combat.md: every frame, the aim's cylinder at the focus: red with the reach in state 10, red with the level in 11, green of 1 in 0x12 (no numbers)
Combat.DrawFrame = 0x80021564; // coined; docs/systems/combat.md: every state's frame: HandleZoneEngineFrame with the current body, the cast scene, markers, spell and attack effects, stat indicators, target marks, the GUI, then Combat.AfterFrame
Combat.StateEnd = 0x800216f4; // coined; docs/systems/combat.md: state 0: asks to leave (0x800db0a8) and returns game mode 0
Combat.StepActionTimer = 0x80021708; // coined; docs/systems/combat.md: adds the frame's delta to cmb+0x52cc and returns 1 once the current body is idle and it passes 29
Combat.StateAction = 0x80021774; // coined; docs/systems/combat.md: state 2: an attack or spell plays; then the hit or miss, the damage numbers and state 4 (a spell goes through state 3 first)
Combat.ApplyHit = 0x80021930; // coined; docs/systems/combat.md: (victim, body): takes the victim's pending damage and plays its hit animation, 7
Combat.EndCast = 0x800219d8; // coined; docs/systems/combat.md: after a spell's scene: applies the result as Combat.StateAction does, frees the scene, state 4
Combat.StateCast = 0x80021b24; // coined; docs/systems/combat.md: state 3: the cast camera glides to the spell's scene for a few frames
Combat.FreeBody = 0x80021c6c; // coined; docs/systems/combat.md: takes a gone combatant out: its effects, markers and stat indicators, its portrait's slot and Combat.Bodies[slot]; starts the body's fade (Body.FadeOut); clears the Shadow or Alaron slot
Combat.RemoveFallen = 0x80021d2c; // coined; docs/systems/combat.md: 60 ticks after a result, removes the target if dead or fled, gives the camera back and finds the next to show
Combat.StateResult = 0x80021f30; // coined; docs/systems/combat.md: state 4: the damage numbers show, then RemoveFallen, and the turn ends unless a death is pending
Combat.StateMoving = 0x80021fd0; // coined; docs/systems/combat.md: state 5: the body walks to a point (an enemy's path, a reserve's arrival); when it stops, the state is NextState
Combat.StateFacing = 0x800221b0; // coined; docs/systems/combat.md: state 6: the body turns to its target; then the action runs (Combatant.ExecuteAction) or the turn ends
Combat.StateWaitIdle = 0x8002235c; // coined; docs/systems/combat.md: state 7: waits for the body to stop, faces, goes to state 5; nothing enters state 7
Combat.StateAI = 0x800223f8; // coined; docs/systems/combat.md: state 8: EnemyAI.Step every frame
Combat.StateVictory = 0x80022450; // coined; docs/systems/combat.md: state 12 after the fade: sets the encounter flag, remembers the beaten monster party, opens the loot and experience window and returns game mode 6
Combat.StateDefeat = 0x80022590; // coined; docs/systems/combat.md: state 13 after the fade: a game over script, or for a non-lethal fight the encounter flag and the next day
Combat.StatePause = 0x80022678; // coined; docs/systems/combat.md: state 14: frees the zone engine's memory, takes a snapshot and returns game mode 3, the pause menu
Combat.StateLeave = 0x800226e8; // coined; docs/systems/combat.md: state 16: asks to leave and returns game mode 1 (trek): the pause menu's flee
Combat.StateShadowMerge = 0x800226f8; // coined; docs/systems/combat.md: state 17, on its first frame: Combat.MergeShadow, then leaves for game mode 0xE, the cinematic
Combat.StateTargetThrown = 0x8002272c; // coined; docs/systems/combat.md: state 18, aiming a thrown flask: draws only, the controls do the rest
Combat.StateEndTurn = 0x80022764; // coined; docs/systems/combat.md: state 19: ends the current combatant's turn
Combat.StateLeaveFled = 0x800227b8; // coined; docs/systems/combat.md: state 20: leaves with the fled flag (0x800d9376 = 1), game mode 1
Combat.StateLeaveToScript = 0x800227d4; // coined; docs/systems/combat.md: state 21: leaves for the game over script, game mode 0xC
Combat.StateMenuSpells = 0x800227e8; // coined; docs/systems/combat.md: state 22: C-down's menu is open, drawn here
Combat.StateMenuItems = 0x80022844; // coined; docs/systems/combat.md: state 23: C-up's menu is open (the same code as state 22)
Combat.StateDraw = 0x80022860; // coined; docs/systems/combat.md: states 1, 9, 10, 11, 15 and 25: draws the frame, and input does the rest
Combat.StateRest = 0x80022898; // coined; docs/systems/combat.md: state 24: counts 120 ticks (0x800db0d0), then ends the turn
Combat.StateRest2 = 0x800228f8; // coined; docs/systems/combat.md: state 26: the same as 24, entered after a performance starts
Combat.RequestPause = 0x80022914; // coined; docs/systems/combat.md: Start: saves the state in 0x800d94d4 and goes to state 27
Combat.StatePauseRequested = 0x80022930; // coined; docs/systems/combat.md: state 27, as state 14 (the pause menu opens)
Combat.StateDefeatWait = 0x80022998; // coined; docs/systems/combat.md: state 28: waits 120 frames, then Combat.EnterDefeat
Combat.StateShadowDissipates = 0x800229d8; // coined; docs/systems/combat.md: state 29: the field drawn, +0x52C8 counted a frame at a time to 60, then the fade out and state 30
Combat.StateLeaveAfterShadow = 0x80022a2c; // coined; docs/systems/combat.md: state 30: when the fade is out, leaves for trek
Combat.StateIntro = 0x80022a78; // coined; docs/systems/combat.md: state 31, where a battle starts: when the fade-in ends the state is 1 for a player's combatant and 8 for an AI's
Combat.HoldForMessage = 0x80022aec; // coined; docs/systems/ui.md: while cmb+0x543c is set (a reserve fled as it came), shows "Enemy reinforcements flee" for 60 ticks and returns 1 to skip the state and input
Combat.Frame = 0x80022ba4; // coined; docs/systems/combat.md: game mode 2: Combat.Init, input for the delta (Combat.Controls), the state's function from 0x800db0d4, Combat.Exit
Combat.StartFirstTurn = 0x80022c9c; // coined; docs/systems/combat.md: the first turn's line, field radius, ring and body
Combat.Init = 0x80022d1c; // coined; docs/systems/combat.md: the first frame of a battle (0x800db0a4): hides the trek HUD, allocs the combat struct (0x544c), sets map set 16 and the arena, InitZoneEngine(1, 0) (Zones.Mode 1), sets up the combatants, the GUI, markers and effects; state 31
Combat.Exit = 0x80023060; // coined; docs/systems/combat.md: after every frame, when 0x800db0a8 asks: removes the battle's effects from the party, frees the GUI, effects, bodies, the struct and the zone engine
Combat.AfterFrame = 0x80023360; // coined; docs/systems/combat.md: bodies that aren't in a fight animation go to idle, World.SetTerrain, the Shadow check
Combat.EnterRest = 0x80023418; // coined; docs/systems/combat.md: state 24 for 120 ticks
Combat.StartCastCamera = 0x80023434; // coined; docs/systems/combat.md: builds the spell's scene at the caster's locator and the camera's glide to it
Combat.PickRandomEnemies = 0x80023770; // coined; docs/systems/combat.md: the debug menu's random battle: 1 to 12 entities chosen at random that Combat.IsExcludedEnemy lets by
Combat.ClearShadowSlots = 0x8002386c; // coined; docs/systems/combat.md: both 0xFF
Combat.CheckShadowMerge = 0x80023884; // coined; the original's alaron_shadow_merge_attempt; docs/systems/combat.md: from Combat.AfterFrame but in states 17, 29 and 30: the Shadow's and Alaron's bodies' centres within their scaled radii + 0.5: the merge with the Horn, else Combat.ShadowDissipates
Combat.StartShadowCinematic = 0x80023984; // coined; docs/systems/combat.md: state 17 and Cinematic.Load(1, 4, 1)
Combat.ShadowDissipates = 0x800239b4; // coined; docs/systems/combat.md: with the Horn Combat.StartShadowCinematic (the merge); else state 29, "The Shadow dissipates" shown, every body idle
Combat.SetShadowSlot = 0x80023a6c; // coined; docs/systems/combat.md: the Shadow's combatant index, 0x800d94cc
Combat.SetAlaronSlot = 0x80023a78; // coined; docs/systems/combat.md: Alaron's combatant index, 0x800d94cd
Combat.ClearShadowSlot = 0x80023a84; // coined; docs/systems/combat.md: 0xFF
Combat.ClearAlaronSlot = 0x80023a94; // coined; docs/systems/combat.md: 0xFF
Combat.PartyHasHorn = 0x80023aa4; // coined; docs/systems/combat.md: Party.HasItem of Items.HornOfKynon (0x0D03)
Combat.ShadowAura = 0x80023ad0; // coined; docs/systems/combat.md: first at a round's end (TurnOrder.EndRound): without the Horn the round count (+0x52C8), vanishing at 4; then each other combatant under 10 away, not gone, dead or chaos, takes 10 - d, squared without the Horn; a lethal one is Combat.ShadowDissipates
Combat.WithinRadius = 0x80023d44; // coined; docs/systems/combat.md: (a, b, r): the two combatants' cells are within r on both axes and in the circle
Combat.AnyoneWithin10 = 0x80023e9c; // coined; docs/systems/combat.md: some other combatant is within 10
Combat.NearShadow = 0x80023f34; // coined; docs/systems/combat.md: the combatant is within 10 of the Shadow (or, for the Shadow, anyone is)
Combat.Defeat = 0x80023f98; // coined; docs/systems/combat.md: a lethal fight goes to Combat.EnterDefeat, a non-lethal one (the Shadow's) to Combat.EnterDefeatWait
Combat.EnterDefeat = 0x80023fd0; // coined; docs/systems/combat.md: state 13 and a fade out
Combat.EnterRestState = 0x80023fec; // coined; docs/systems/combat.md: Combat.EnterRest, then state 26
Combat.EnterDefeatWait = 0x80024014; // coined; docs/systems/combat.md: state 28
Compass.Draw = 0x800240b8; // Compass.cs
Sundial.Draw = 0x800248a4; // Sundial.cs
Hud.SetSunPhase = 0x800254b4; // coined; docs/systems/magic.md: (on): the Detect Sun Phase HUD flag
Hud.SetMoonPhase = 0x800254c8; // coined; docs/systems/magic.md: (on): the Detect Moon Phase HUD flag
PartyPortraits.Draw = 0x8002569c; // docs/systems/ui.md
Color.Scale = 0x80025700; // coined; docs/systems/ui.md: (rgba in, rgba out, factor): each channel times the factor, truncated
PartyPortraits.DrawFrames = 0x8002583c; // coined; PartyPortraits.cs
GetMapTerrain = 0x80025ca0; // the debug build's string 0x800da630 (debug 0x8002c470): World::SetTerrain, the terrain's sky and the sky type
Zones.LoadCellTable = 0x80025e5c; // coined; borgmaps.cpp: builds the 6-byte cell table 0x800dcbd0 from 12-byte entries (row, column, map, scene)
GetMapData = 0x80025f54; // string 0x800ce680
Zones.MapOf = 0x80026040; // coined; docs/systems/scripts.md: (map set, row, column): the chunk's Borg9 index
Zones.RequestBgm = 0x80026204; // coined; docs/systems/audio.md
Zones.SetMapSet = 0x80026264; // coined; docs/systems/audio.md: sets the music for the map set, and for a portal the chunk and point the player arrives at (docs/formats/code-tables.md)
TrekHud.Free = 0x80026c78; // coined; frees the HUD, unless the byte at 0x800d7ea4 is set
TrekHud.Make = 0x80026d08; // coined; makes the HUD again
LensFlare.Draw = 0x80026fb4; // LensFlare.cs: steps the fade byte (+0x6890) and draws the flare's pieces
Clouds.Draw = 0x80027654; // Clouds.cs
Clouds.Step = 0x80027a24; // Clouds.cs
WidgetPulseMenu.Create = 0x80027c48; // coined; docs/systems/combat.md: (list, capacity): a WidgetScrollMenu with vtable 0x800CE910 and wrapping up/down at +8/+0xC
WidgetPulseMenu.Step = 0x80027c98; // coined; docs/systems/combat.md: steps the pulse counter 0..19 and lays the rows out, the scroll offset following its goal 10 a tick
Color.Mix = 0x80027f1c; // coined; docs/systems/combat.md: (from, to, &out, t): per channel from + trunc((to - from) x t)
WidgetPulseMenu.Draw = 0x8002809c; // coined; docs/systems/combat.md: draws each row, the cursor's in Color.Mix(pulse from, its own colour, counter / 20)
WidgetFastScrollMenu.Create = 0x80028830; // coined after ./menus/widgetfastscrollmenu.cpp (debug string 0x800dad40); docs/systems/pause-menu.md: the Party lists' scroll menu, a WidgetScrollMenu's pulse layout with vtable 0x800ceac0
WidgetFastScrollMenu.Step = 0x80028b00; // coined; docs/systems/pause-menu.md: scrolls to the cursor, steps the pulse by 1 (ping-pong 0..N-1), then steps its children
WidgetFastScrollMenu.SetPulse = 0x80029270; // coined; docs/systems/pause-menu.md: (from RGBA, to RGBA, N), resets the counter, step 1
SkyObjects.Draw = 0x80029764; // SkyObjects.cs
WidgetGroup.SnapX = 0x8002b830; // coined; moves the group and its children to the x kept at +0x64
WidgetGroup.Create = 0x8002b86c; // coined; (left, top, right, bottom): a widget of pages, one shown at a time, which it cuts its children to, with a list of 8 tweens
WidgetGroup.Destroy = 0x8002b904; // coined
WidgetGroup.Draw = 0x8002b958; // coined; its children cut to its box
WidgetGroup.Step = 0x8002ba00; // coined; steps the page shown and the one sliding out, and the tweens; the one sliding out goes once they've ended
WidgetGroup.Add = 0x8002baa0; // coined; appends a page, the first becoming the one shown
WidgetGroup.Clear = 0x8002bb4c; // coined; frees every page
WidgetGroup.Next = 0x8002bc68; // coined after ./menus/widgetgroup.cpp; docs/systems/pause-menu.md#saving-and-loading: the page shown slides out left by the group's width and the next in from its right edge, 60 frames each on MenuTween.EaseOut
WidgetGroup.Previous = 0x8002bd94; // coined; docs/systems/pause-menu.md#saving-and-loading: the same the other way
WidgetGroup.Shown = 0x8002bec8; // coined; the page shown
WidgetGroup.Sliding = 0x8002bed0; // coined; whether a page is sliding out
WidgetGroup.ShowPage = 0x8002bedc; // coined; shows the page of +0x98's index at once, the rest moved to the right edge
WidgetGroup.SetIndex = 0x8002bfe8; // coined; the index ShowPage shows
WidgetGroup.DropOutgoing = 0x8002bff0; // coined; frees the page that slid out
Credits.Start = 0x8002c0b0; // coined; docs/systems/audio.md
Credits.Destroy = 0x8002c5a0; // coined; docs/systems/ui.md#the-credits: the widget's destructor: sets the sound and music volumes back, and the music's, frees "The End", stops 0x05D9 (AudioEngine.Stop)
Credits.Step = 0x8002c6d8; // coined; docs/systems/ui.md#the-credits: the widget's frame (vtable +0x2c), by its state byte +0x7c, then ProcessAudioBubbles and its children's steps
Credits.StepWait = 0x8002c7a8; // coined; state 0: one frame, then state 1
Credits.StepCards = 0x8002c7b8; // coined; docs/systems/ui.md#the-credits: state 1, the first cards one at a time (centred, fading in by 4 x delta, holding 120 / delta frames, fading out), to state 2 at the card ending at line 0x1D
Credits.StepScroll = 0x8002ca64; // coined; docs/systems/ui.md#the-credits: state 2, the cards up a pixel every other frame, each joining 32 above the screen's foot, to state 3 when the last is off the top
Credits.StepEnd = 0x8002cb50; // coined; docs/systems/ui.md#the-credits: state 3, the ending's "The End" (fading in by 2 x delta, holding 240 frames, fading out), else straight to state 4
Credits.Skip = 0x8002cd90; // coined; docs/systems/ui.md#the-credits: B, and A and Start through the two below: state 4 unless Credits.Source is 2 (the ending)
Credits.OnA = 0x8002cdb4; // coined; calls Credits.Skip
Credits.OnStart = 0x8002cddc; // coined; calls Credits.Skip
InputMenu.Create = 0x8002ced4; // coined after ./menus/inputmenu.cpp (debug string 0x800db620); docs/systems/pause-menu.md: the name entry's grid and cursor
InputMenu.Draw = 0x8002d464; // coined; docs/systems/pause-menu.md: draws the name, the letter being chosen in the pulse's grey
InputMenu.Step = 0x8002d7e4; // coined; docs/systems/pause-menu.md: the pulse: grey 5 a step between 95 and 230, 54 steps a cycle
PauseMenu.CreateMenu = 0x8002e450; // coined; (mem, widget manager, tab): allocates and constructs the BigAssMenu
PauseMenu.SlideOut = 0x8002e9d0; // coined; docs/systems/audio.md: closing the menu, plays 0x074E (0x074D from the World tab)
WorldMenu.Build = 0x8002eca8; // coined; docs/systems/pause-menu.md
PauseMenu.Draw = 0x8002edb4; // coined; docs/systems/pause-menu.md: the tabs cut to the clip, then the scroll
PauseMenu.Update = 0x8002ee38; // coined; docs/systems/pause-menu.md: the open menu's frame: the tab slide, 10 pixels a frame, the scroll's step and its camera
PauseMenu.Input = 0x8002f088; // coined; docs/systems/pause-menu.md: the menu's input, the stick and then L or Z and R
PauseMenu.OpenStep = 0x8002f1d0; // coined; docs/systems/pause-menu.md: the unrolling's frame: widens the clip by the scroll's frame, open when its animation ends
PauseMenu.OpenFade = 0x8002f3dc; // coined; docs/systems/pause-menu.md: opening without the scroll: the widgets' alpha up 60 a frame
PauseMenu.CloseStep = 0x8002f4d4; // coined; docs/systems/pause-menu.md: the rolling up's frame: narrows the clip, then brightens the backdrop 10 a frame
PauseMenu.CloseFade = 0x8002f734; // coined; docs/systems/pause-menu.md: closing without the scroll (the post-battle window): the widgets' alpha down 60 a frame
PauseMenu.OnTabBack = 0x8002f7c4; // coined; docs/systems/audio.md: L or Z, plays 0x074D
PauseMenu.OnTabForward = 0x8002f948; // coined; docs/systems/audio.md: R, plays 0x074E
PauseMenu.OnLeft = 0x8002fb14; // coined; docs/systems/audio.md: forwards to the page
PauseMenu.OnRight = 0x8002fb88; // coined; docs/systems/audio.md: forwards to the page
PauseMenu.OnUp = 0x8002fbfc; // coined; docs/systems/audio.md: forwards to the page, then plays 0x073B
PauseMenu.OnDown = 0x8002fc94; // coined; docs/systems/audio.md: forwards to the page, then plays 0x073B
PauseMenu.OnB = 0x8002fe5c; // coined; docs/systems/audio.md: plays 0x0741
PauseMenu.OnA = 0x8002fef0; // coined; docs/systems/audio.md: forwards to the page, then plays 0x0740
PauseMenu.OnStart = 0x8002ff7c; // coined; docs/systems/audio.md: plays 0x0741
DollMenu.Create = 0x80030030; // coined; (mem, 0, mode): allocates and runs DollMenu::InitMenu
DollMenu.Step = 0x80030480; // coined; docs/systems/pause-menu.md: Widget.StepChildren unless the save screen's page is up (DAT_800deac0)
PartyMenu.Changing = 0x800304b4; // PartyMenu.Motion.cs: the header, silhouette or lists still tweening
PartyMenu.ChangeMember = 0x8003054c; // coined; docs/systems/audio.md: C-left and C-right, plays 0x0739
PartyMenu.ListBaseStep = 0x80030888; // coined; docs/systems/pause-menu.md: lays out a list's title and arrows, then Widget.StepChildren; each list's step calls it and Widget.StepChildren again, so the cursor pulses twice a frame
PartyMenu.ListsNew = 0x80030b00; // coined; the lists widget's constructor: PartyMenu.ListsCreate
PartyMenu.ListsCreate = 0x80030c50; // coined; docs/systems/pause-menu.md: the four lists, cut to x 160 to 300 and y 101 to 205
PartyMenu.ListsDraw = 0x8003140c; // coined; docs/systems/ui.md: the lists widget's draw (vtable 0x800cf5b0 +0x44): its children, the post-battle window's lines among them, in the slim font, then the main font again
PartyMenu.ListsStep = 0x800314cc; // coined; docs/systems/ui.md
PartyMenu.ListsSliding = 0x80031580; // coined; docs/systems/pause-menu.md
PartyMenu.ListsSetMember = 0x8003159c; // coined; docs/systems/pause-menu.md
PartyMenu.ChangeList = 0x80031620; // PartyMenu.cs: the next list or the one before, sliding 140 over 20 frames, plays 0x073D
PartyMenu.CostLines = 0x800317e0; // coined; docs/systems/pause-menu.md: state 5's "XP Cost" and "XP Remaining" lines for the cursor's row and the member shown
PartyMenu.ListsUp = 0x80031950; // coined; docs/systems/pause-menu.md
PartyMenu.ListsDown = 0x800319a0; // coined; docs/systems/pause-menu.md
PartyMenu.ListsLeft = 0x800319f0; // coined; docs/systems/pause-menu.md: the stick's left, the next list
PartyMenu.ListsRight = 0x80031a10; // coined; docs/systems/pause-menu.md: the stick's right, the list before
PartyMenu.ListsAccept = 0x80031a30; // coined; docs/systems/pause-menu.md: A on the lists: the cursor's row, and in state 5 the list's no-trainer Confirm (vtable +0xdc)
TrainingMenu.For = 0x80031c0c; // TrainingMenu.cs
TrainingMenu.PriceLines = 0x80032088; // TrainingMenu.cs
TrainingMenu.Draw = 0x80032288; // coined; docs/systems/ui.md: the trainer's widget's draw (vtable 0x800cf688 +0x44): its children in the slim font, then the main font again
TrainingMenu.Step = 0x80032348; // coined; the trainer's widget's step (vtable +0x2c), in the slim font
TrainingMenu.MoveCursor = 0x8003253c; // docs/systems/pause-menu.md
TrainingMenu.Accept = 0x80032750; // docs/systems/pause-menu.md
TrainingMenu.Details = 0x800327fc; // TrainingMenu.cs
MenuPopup.FadeIn = 0x80032840; // coined; PopupFade.cs: alpha 60 more while under 195, else 255 and open
MenuPopup.FadeOut = 0x800328ac; // coined; PopupFade.cs: alpha 60 less while 61 or more, else gone
MenuPopup.Open = 0x800336a0; // coined; docs/systems/audio.md: the parchment popups and the details panel open, plays 0x074D
MenuPopup.Create = 0x800337bc; // coined; docs/systems/pause-menu.md: the details' kinds build their popup through it
MenuPopup.Draw = 0x80034af0; // coined; docs/systems/ui.md: the details' and parchment popups' draw (vtable 0x800cfa20 +0x44), in the slim font
MenuPopup.Step = 0x80034bb0; // coined; the popups' step (vtable +0x2c), in the slim font
PartyMenu.CloseDetails = 0x80034c18; // coined; docs/systems/audio.md: C-down released, plays 0x074E
PartyMenu.InventoryListStep = 0x8003575c; // coined, in submenuinventory.cpp; docs/systems/pause-menu.md: PartyMenu.ListBaseStep, then Widget.StepChildren
PartyMenu.InventoryA = 0x80035fa0; // coined; docs/systems/pause-menu.md: the carried and worn lists' A: the combat pause's member check (Common 489, 490), potions (488), flasks, then equip or take off
PartyMenu.InventoryDetails = 0x80036710; // coined; docs/systems/pause-menu.md: C-down's details of an inventory row
PartyMenu.SpellListStep = 0x800378e4; // coined; docs/systems/pause-menu.md: the same; spells rather than skills only by the lists' creation order
PartyMenu.SpellDetails = 0x80037994; // coined; docs/systems/pause-menu.md: C-down's details of a spell row
Training.BuySkill = 0x80037ccc; // coined; docs/systems/pause-menu.md: Yes to a skill's price: the rank up, the XP and gold taken, PartyMenu.HealthGoldChange
Training.TrainSkill = 0x80038034; // docs/systems/pause-menu.md
PartyMenu.SkillListStep = 0x80038e4c; // coined; docs/systems/pause-menu.md: the same; skills rather than spells only by the lists' creation order
PartyMenu.SkillDetails = 0x80038ea4; // coined; docs/systems/pause-menu.md: C-down's details of a skill row
Training.BuySpell = 0x800391e0; // coined; docs/systems/pause-menu.md: Yes to a spell's price: learnt or ranked up, the XP and gold taken, PartyMenu.HealthGoldChange, the first spell's help (flag 0xE1B)
Training.TrainSpell = 0x8003945c; // docs/systems/pause-menu.md
PartyMenu.StatListStep = 0x8003a4d4; // coined; docs/systems/pause-menu.md: PartyMenu.ListBaseStep, tints its texts, then Widget.StepChildren
PartyMenu.StatDetails = 0x8003a7d0; // coined; docs/systems/pause-menu.md: C-down's details of a stat row
Training.StatCost = 0x8003a874; // coined; the stat list's cost function (vtable +0xf4): -1 for MAX
Training.BuyStat = 0x8003a90c; // coined; docs/systems/pause-menu.md: Yes to a stat's price: the point up, the XP taken, PartyMenu.HealthGoldChange
Training.TrainStat = 0x8003aab8; // coined; docs/systems/pause-menu.md: the stats list's Confirm: refusals (lines 510, 511) or the XP question (512), no trainer
PartyMenu.PortraitsCreate = 0x8003ad50; // coined; docs/systems/pause-menu.md
PartyMenu.PortraitsChange = 0x8003b3cc; // coined; docs/systems/pause-menu.md: the portraits move and resize over 15 frames, the name and icons crossfade
PartyMenu.PortraitsDraw = 0x8003b9a0; // coined; docs/systems/ui.md: the portraits' draw (vtable 0x800d04a0 +0x44), the name in the slim font
PartyMenu.PortraitsStep = 0x8003ba60; // coined; docs/systems/pause-menu.md
PartyMenu.HealthGoldCreate = 0x8003bb20; // coined; docs/systems/pause-menu.md
PartyMenu.HealthGoldChange = 0x8003be5c; // coined; docs/systems/pause-menu.md: the bar's width tweens, the hit points and level crossfade
BarterMenu.Destroy = 0x8003caf0; // coined; frees the loot inventory 0x800d9578
BarterMenu.BarterMenu = 0x8003cb68; // BarterMenu.cs
BarterMenu.PileLine = 0x8003cfd8; // BarterMenu.cs
BarterMenu.Draw = 0x8003d0d8; // coined; docs/systems/ui.md: the barter widget's draw (vtable 0x800d0738 +0x44): the pile, its title and its line in the slim font
BarterMenu.Step = 0x8003d198; // coined; the barter widget's step (vtable +0x2c), in the slim font
BarterMenu.LeaveItems = 0x8003d5f4; // BarterMenu.cs; docs/systems/pause-menu.md: the leave-items choice's "Yes, leave them." callback: PauseMenu.CloseToTrek
BarterMenu.Back = 0x8003d614; // docs/systems/pause-menu.md
BarterMenu.Accept = 0x8003d7cc; // docs/systems/pause-menu.md
BarterMenu.Appraise = 0x8003de10; // BarterMenu.cs
DollMenu.Up = 0x8003df30; // coined; the page's stick up: the barter's, the training's or the lists'
DollMenu.A = 0x8003e0b0; // coined
DollMenu.B = 0x8003e0f0; // coined; docs/systems/pause-menu.md: the barter's B, or with no barter the page itself (closes state 5)
DollMenu.CUp = 0x8003e128; // coined; the barter's C-up only
DollMenu.CDown = 0x8003e160; // coined; details: the barter's, the training's or the lists'
DollMenu.Start = 0x8003e1a0; // coined; the same as B
PartyMenu.CLeft = 0x8003e1c8; // coined; docs/systems/pause-menu.md: the next member
PartyMenu.CRight = 0x8003e1f4; // coined; docs/systems/pause-menu.md: the member before
PartyMenu.EquipmentChange = 0x8003e374; // coined; docs/systems/pause-menu.md: crossfades the slots whose item differs
PartyMenu.EquipmentSetSlot = 0x8003e3f0; // coined; docs/systems/pause-menu.md
PartyMenu.CombatantOfEntity = 0x8003e5dc; // coined; docs/systems/combat.md: in a battle, the combatant (Combat +0x52D0) whose entity (+0x40) is the given one, else 0
MenuTween.FadeAndFree = 0x8003f1b0; // coined; docs/systems/pause-menu.md: a tween that frees its widget when it ends
OptionsMenu.Create = 0x8003f594; // coined; the System tab's widget on a page (0 the list, 1 the options, 2 the Theatre, 3 the save screens), shown at once at alpha 255
OptionsMenu.Draw = 0x8003f6e0; // coined; the page fading out while its alpha is above 0, then the page
OptionsMenu.Step = 0x8003f81c; // coined; docs/systems/pause-menu.md#the-system-tab: the page's alpha (+0x7c) up 60 a frame to 255 and the one fading out's (+0x7d) down 60 to 0, a crossfade of 5 frames
OptionsMenu.OptionsMenu = 0x8003f8c4; // docs/systems/pause-menu.md
OptionsMenu.ShowOptions = 0x8003fd5c; // coined; the Options row: the options page (WidgetOptionsConfig), 25 right of centre, fading in over the list
OptionsMenu.ShowTheatre = 0x8003fe34; // coined; the System tab's Theater row: builds the Theatre page once, makes it the tab's page (state 2) and fades it in
OptionsMenu.ShowLoad = 0x8003ffa0; // coined; the Load Game row: the load screen, fading in over the list
OptionsMenu.ShowSave = 0x800400e4; // coined; the Save Game row: the save screen, fading in over the list
pauseMenuSelectCallBack = 0x800403ac; // string 0x800dd300 (debug 0x80047c1c), matched by tools/builds.py
WorldMenu.WorldMenu = 0x8004069c; // WorldMenu.cs
WorldMenu.TabStep = 0x80040dc4; // coined; docs/systems/pause-menu.md: Camp's and Journal's pulse, 0..20 and back, while the save screen's page isn't up
WorldMenu.Camp = 0x80041020; // coined; docs/systems/camping.md
OptionsPage.Create = 0x80041150; // coined; docs/systems/ui.md: the Options screen's widget, vtable 0x800d0cb8 (init 0x80041264)
OptionsPage.Draw = 0x800419c8; // coined; docs/systems/pause-menu.md: steps its pulse here, 0..20 and back, its alpha 12 a step
OptionsMenu.OnLeft = 0x800421d8; // coined; docs/systems/audio.md: the volume bars step down silently; the resolution row plays 0x073D
OptionsMenu.OnRight = 0x80042330; // coined; docs/systems/audio.md: the volume bars step up silently; the resolution row plays 0x073D
IntroMenu.Create = 0x800427b0; // coined; docs/systems/ui.md: the title menu widget's constructor (vtable 0x800d0db8)
IntroMenu.Destroy = 0x800427ec; // coined
IntroMenu.Build = 0x800429b8; // coined; docs/systems/audio.md: registers the title menu's callbacks
IntroMenu.Draw = 0x80042aa8; // coined; docs/systems/ui.md: the boxes by the pages' alphas, then the page and its box
IntroMenu.Step = 0x80042d0c; // coined; docs/systems/ui.md: the pages' crossfade, +20 a tick up and -20 down, and the blink on PRESS START
IntroMenu.Blink = 0x80042e5c; // coined; docs/systems/ui.md: PRESS START: a count to 101, back to 70, toggling; hidden for the first 101 ticks
IntroMenu.ShadowBox = 0x80042eb0; // coined; docs/systems/ui.md: IntroMenu_ShadowBG: (x0, y0, x1, y1), the nine slices 0x1BC-0x1C4 tinted black
IntroMenu.ShowPressStart = 0x800432b4; // coined; docs/systems/ui.md: state 0: the shadow 0x104 at (40, 20), the logo 0x103 at (54, 20) and PRESS START 0x102 at (123, 205)
IntroMenu.ShowList = 0x80043598; // coined; docs/systems/ui.md: state 1: the list and its box (94, 67)-(226, 183)
IntroMenu.ShowOptions = 0x800436c8; // coined; docs/systems/ui.md: state 4: OptionsPage.Create(0) and its box
IntroMenu.ShowNameEntry = 0x800437f8; // coined; docs/systems/ui.md: state 2: the InputMenu on Alaron's name and its box from y 43 to 179
IntroMenu.OnLoaded = 0x80043958; // coined; docs/systems/ui.md: the load screen's callback: Title.Action 2, fading out 0.05 a tick
IntroMenu.OnLoadBack = 0x80043984; // coined; docs/systems/ui.md: the load screen's cancel: back to the list
IntroMenu.ShowLoad = 0x800439a8; // coined; docs/systems/ui.md: state 3: the pause menu's load widget at (51, 24), white, and its box
IntroMenu.MakeList = 0x80043ae8; // coined; docs/systems/ui.md: the Menu title 0xF2 at (130, 75), the scroll menu at (160, 115), rows 8 apart, and common lines 159-161
IntroMenu::ProcessIntroMenu = 0x80043c44; // the debug build's string 0x800dd644 (debug 0x8004b544): A on the list's rows: the name entry, the options, or the load screen (state 0xB)
IntroMenu.Confirm = 0x80043cfc; // coined; docs/systems/ui.md: the name entry's A: OK sets state 6 (New Game), the cancel key goes back to the list
IntroMenu.OptionsBack = 0x80043d40; // coined; docs/systems/ui.md: B in the options: back to the list once the page has nothing more to go back to
IntroMenu.Input = 0x80043e44; // coined; docs/systems/ui.md: drops pad events until the crossfade ends, then to the load screen or the stick, and left and right to the options
IntroMenu.OnUp = 0x80044020; // coined; docs/systems/audio.md: plays 0x073B
IntroMenu.OnDown = 0x8004407c; // coined; docs/systems/audio.md: plays 0x073B
IntroMenu.OnB = 0x800440d8; // coined; docs/systems/audio.md: plays 0x0741
IntroMenu.OnStart = 0x800441c8; // coined; docs/systems/audio.md: plays 0x0740
IntroMenu.OnA = 0x800442b4; // coined; docs/systems/audio.md: plays 0x0740
Theatre.Create = 0x800443b0; // coined, in ./menus/theatermenu.cpp; the Theatre page's widget
Theatre.Destroy = 0x800443ec; // coined, in ./menus/theatermenu.cpp
Theatre.Build = 0x80044444; // coined, in ./menus/theatermenu.cpp; the title (image 0x100, centred on x 160 at y 50), the rows' scroll menu at (160, 90), 5 apart, centred, rows in 103,70,60 and the cursor pulsing 103,64,64 to 197,174,176 over 15 steps, and the handlers
Theatre.Draw = 0x80044680; // coined, in ./menus/theatermenu.cpp
Theatre.Step = 0x800446d0; // coined, in ./menus/theatermenu.cpp
Theatre.AddRow = 0x80044704; // coined, in ./menus/theatermenu.cpp; a DB title 'flag text': the text if the flag is set, with Theatre.Play as its A handler and the flag as its id, else 16 dashes
Theatre.AddRows = 0x800447e8; // coined, cites ./menus/theatermenu.cpp line 192; reads the DB's Theatre block (ROM 0x1FEC5C0, 0x60 bytes, up to *****)
Theatre.Class = 0x8004495c; // coined, in ./menus/theatermenu.cpp; the widget's class, 0xC
Theatre.OnLeft = 0x80044970; // coined, in ./menus/theatermenu.cpp
Theatre.OnRight = 0x800449a0; // coined, in ./menus/theatermenu.cpp
Theatre.OnUp = 0x800449d0; // coined, in ./menus/theatermenu.cpp
Theatre.OnDown = 0x80044a00; // coined, in ./menus/theatermenu.cpp
Theatre.OnA = 0x80044a3c; // coined, in ./menus/theatermenu.cpp; the cursor's row's A handler: Theatre.Play for a seen row (and the page returns the row with its id 2), nothing for the dashes
Theatre.Play = 0x80044aa4; // coined, in ./menus/theatermenu.cpp; a seen row's A: Theatre.Reopen = 1, Cinematic.Load (the cinematic of the row's flag in Theatre.Flags, kind 0, mode 9)
Theatre.OnStart = 0x80044b50; // coined, in ./menus/theatermenu.cpp; calls the page's B
MessagePopup.Create = 0x80044e34; // coined; docs/systems/pause-menu.md: (text, max width, text colour, box colour, 1): the centred message box, narrowed to the text's measured width
Spell.SchoolIcon = 0x80045050; // coined; docs/systems/combat.md: (school, &image): the icon of the school in the table at 0x800DEFC0, 0 if none
Widget.CreateImageBox = 0x80045394; // coined; docs/systems/ui.md: (parent, image ID, left, top, right, bottom): an image widget sized to the rectangle, inclusive (right - left + 1)
ChoicePopup.Create = 0x800457f4; // coined; docs/systems/ui.md: a centred choice popup, a WidgetScrollMenu with its own default pulse (vtable 0x800d1050)
ChoicePopup.CreateList = 0x80045af4; // coined; docs/systems/combat.md: (popup, row capacity, width, max height, 0, 0): the popup's pulse list (120 wide at x 99, centred on x 160) and its feathered panel; the combat menus' base
ChoicePopup.Destroy = 0x80045c5c; // coined; docs/systems/combat.md: restores the widget-manager globals, frees the panel images and the list
ChoicePopup.AddRow = 0x80045f08; // coined; docs/systems/combat.md: WidgetScrollMenu.AddChild of the popup's list
ChoicePopup.CreatePanel = 0x80045f24; // coined; docs/systems/combat.md: (popup, rect, 0): the nine feathered pieces 0x1C4, 0x1C3, 0x1C2, 0x1C0, 0x1C1, 0x1BC-0x1BF
ChoicePopup.Layout = 0x80046488; // coined; docs/systems/combat.md: fits the panel to the list's visible height and centres it on y = 120
Borg8.GetCached = 0x80046884; // coined; docs/systems/ui.md: image by id, cached in a table (DAT_800df020)
Dialogue.CreateWidgets = 0x80046920; // coined; docs/systems/ui.md: the widget set by style: the conversation's, or Backdrop.Widgets for styles 2 and 4
Backdrop.Widgets = 0x80046db8; // coined; docs/systems/ui.md: a backdrop's picture, text and choices
Dialogue.TakeChoice = 0x800470c8; // coined; docs/systems/ui.md: frees the choices, advances the script by the taken widget's id, shows the next node
Dialogue.BuildWidgets = 0x800471a8; // coined; docs/systems/ui.md: makes the container and a style's widgets (styles 2 and 4: Backdrop.Page)
Dialogue.ShowNode = 0x800472fc; // coined; docs/systems/ui.md: a node's text and choices by style (styles 2 and 4: Backdrop.Node), then the input callbacks
Dialogue.Destroy = 0x800477e0; // coined; docs/systems/ui.md: frees the widgets and removes the container (Backdrop.End)
Backdrop.Page = 0x80047930; // coined; docs/systems/ui.md: the picture and colours by the script's picture number
Backdrop.Node = 0x80047e14; // coined; docs/systems/ui.md: a node's text and choices
Backdrop.CleanText = 0x80048064; // coined; docs/systems/ui.md: trims a node's leading spaces, drops a v/V + 4 digits prefix, trims again
Dialogue.OnLeft = 0x800481b0; // coined; docs/systems/ui.md
Dialogue.OnRight = 0x80048200; // coined; docs/systems/ui.md
Dialogue.OnUp = 0x80048250; // coined; docs/systems/ui.md: container callback, forwards to the scroll menu's up
Dialogue.OnDown = 0x800482a0; // coined; docs/systems/ui.md
Dialogue.OnA = 0x800482f0; // coined; docs/systems/ui.md: the cursor's choice, or the text when there are none
Dialogue.OnBHelp = 0x80048354; // coined; docs/systems/ui.md: style 4 only: B takes the last choice, or with none the text, moving on as A does
PauseMenu.Open = 0x800483b0; // coined; docs/systems/audio.md: builds the menu (BigAssMenu) on the tab the mode chooses
PauseMenu.DarkenStep = 0x8004847c; // coined; docs/systems/pause-menu.md: once a frame until the menu is built, lowers the backdrop's tint 10 a frame to 0x80, then returns 1
PauseMenu.DrawBackdrop = 0x800484cc; // coined; docs/systems/pause-menu.md: the snapshot at the tint, or black with its top and bottom 40 lines once the menu is open
PauseMenu.Frame = 0x80048744; // coined; docs/systems/audio.md: the frame of the pause menu, the shops and the loot window; sets the music volume and runs ProcessAudioBubbles with a delta of 1
PauseMenu.ReadFrame = 0x80048ba4; // coined; docs/systems/pause-menu.md: counts the controller samples since the last frame (the delta, 1 to 6, at 0x800d8094) and hands on the input
PauseMenu.Leave = 0x80048d88; // coined; docs/systems/audio.md: clears sounds (when trek is not up) and loads the chunks again
PauseMenu.OnLoaded = 0x80048e18; // coined; docs/systems/pause-menu.md: the load page's callback: sets PauseMenu.LoadDone
PauseMenu.Exit = 0x80048e64; // coined; docs/systems/ui.md: the trek pause menu's exit code to trek's next state (PauseExitCode): 0 close, 1 camp, 2 the Theatre's cinematic, 3 help, 4 loaded, 5 credits
PauseMenu.CloseToTrek = 0x80048f40; // coined; docs/systems/pause-menu.md: the shops' and loot window's close: NextState 0xA, trek state 3
PauseMenu.Snap = 0x80048f9c; // coined; a wrapper of GetSnapShot (0x800208b4)
PauseMenu.PrepareLoot = 0x80048ff8; // coined; docs/systems/combat.md: (loot inventory, gold, shopkeeper): the snapshot if none, then 0x800d9578/7c/80, and the gold added to the party at once when the shopkeeper is -1
WorldMenu.ShowMap = 0x80049080; // coined; docs/systems/pause-menu.md
WorldMenu.Marker = 0x80049234; // WorldMenu.cs
WorldMenu.Step = 0x80049428; // WorldMenu.cs
ZoneEngine.EnterRegion = 0x8004960c; // ZoneEngine.cs; docs/systems/pause-menu.md: (row, column) looked up in CodeTable.RegionFlags, the first match's flag set, from the end of LoadGameBorgScenes
MinimapSeen.Save = 0x80049760; // MinimapSeen.cs
MinimapSeen.Load = 0x80049868; // coined; docs/systems/saves.md: (24 bytes): each piece's seen flag from its bit, in CodeTable.MinimapSections' order
Minimap.Load = 0x80049a08; // Minimap.cs
Minimap.StepFrame = 0x8004a5a8; // Minimap.cs
Minimap.Draw = 0x8004ad14; // Minimap.cs
Minimap.Choose = 0x8004af0c; // Minimap.cs
Minimap.LoadSections = 0x8004b404; // coined; docs/systems/ui.md
Minimap.Toggle = 0x8004b6f0; // Minimap.cs
Minimap.Select = 0x8004b96c; // Minimap.cs
Minimap.SelectBarrows = 0x8004bfac; // coined; MinimapImporter.cs
Plane.SetDrawState = 0x8004c350; // coined; docs/systems/movement.md
Plane.Draw = 0x8004c4a4; // coined; docs/systems/movement.md
InitLight = 0x8004ce80; // the debug build's string 0x800de600 (debug 0x800548d0); builds a light, PointLight's constructor
PointLight.Blend = 0x8004cf88; // PointLight.Blend: from + trunc((to - from) * clamp(t)), per channel
PointLight.Wrap = 0x8004d150; // PointLight.Wrap: one period off past either end
Lights.SwapColours = 0x8004d17c; // coined; docs/systems/rendering.md: an alternating light's colours change places
PointLight.Scale = 0x8004d220; // PointLight.Scale: RGBA times a float, truncated; SetSceneColors also gives it the screen fade's brightness
WorldLights.AddNear = 0x8004d384; // WorldLights.AddNear (debug 0x80054dd8): moves lights on, once a frame, and adds those that reach a point
WorldLights.ForBody = 0x8004d878; // WorldLights.ForBody: the lights the grid cell under a party body lists
Lights.AddZone = 0x8004d9b0; // coined; WorldLights.ForActor does it: every light of a chunk's map
Lights.AddDynamic = 0x8004d9e0; // coined; WorldLights.ForBody and ForActor do it: the dynamic lights
DynamicLights.Init = 0x8004da20; // coined; docs/systems/rendering.md: from InitZoneEngine
DynamicLights.Clear = 0x8004daa0; // DynamicLights.Clear: from FreeZoneEngine
AllocDynamicLight = 0x8004db1c; // the debug build's string 0x800de68c (debug 0x80055580)
FreeDynamicLight = 0x8004dbe0; // the debug build's string 0x800de6b8 (debug 0x80055654)
DynamicLights.Step = 0x8004dc74; // DynamicLights.Step: lives count down by the frame's ticks
Audio.PlaceSound = 0x8004dd50; // coined; docs/systems/audio.md
Audio.ShiftSounds = 0x8004dda8; // coined; docs/systems/audio.md
Audio.LoadSound = 0x8004de58; // coined; docs/systems/audio.md
Audio.StopSound = 0x8004de94; // coined; docs/systems/audio.md
Audio.Init = 0x8004df08; // coined; docs/systems/audio.md: 82 bubbles (0x24 bytes) and 16 one-shots (0x78 bytes)
Audio.FreeSoundSlot = 0x8004e004; // coined; docs/systems/audio.md
Audio.AddSound = 0x8004e078; // coined; docs/systems/audio.md
Audio.PlaySound = 0x8004e150; // coined; docs/systems/audio.md: a one-shot (Borg12, pan, gain, lifetime, delay)
FreeAudioSound = 0x8004e294; // string in the debug build 0x800de704 (debug 0x80055d14)
Audio.FreeBubbles = 0x8004e314; // coined; docs/systems/audio.md
Audio.PersistMusic = 0x8004e3dc; // coined; docs/systems/audio.md
Audio.FindPersistentMusic = 0x8004e4c8; // coined; docs/systems/audio.md
Audio.StartChunk = 0x8004e58c; // coined; docs/systems/audio.md
Audio.ClearSounds = 0x8004e738; // coined; docs/systems/audio.md
Audio.Free = 0x8004e7ec; // coined; docs/systems/audio.md
Audio.FreeOwner = 0x8004e864; // coined; docs/systems/audio.md
Audio.UpdateSound = 0x8004e900; // coined; docs/systems/audio.md
Audio.Attenuation = 0x8004eae4; // coined; docs/systems/audio.md
Audio.Pan = 0x8004eb1c; // coined; docs/systems/audio.md
Audio.VolumeAndPan = 0x8004eb90; // coined; docs/systems/audio.md: a body's, radius 15
ProcessAudioBubbles = 0x8004eca0; // string in the debug build 0x800de770 (debug 0x8005672c)
Dialogue.Condition = 0x8004f680; // coined; docs/systems/scripts.md: a condition op's value (0x17-0x1f); 0x18 CheckFlag reads its flag through FlagNetwork.Get
Dialogue.Effect = 0x8004f7b8; // coined; docs/systems/scripts.md: an effect op (0x20-0x3a); 0x20 SetFlag and 0x21 ClearFlag only write
Dialogue.DrawWidgets = 0x8004feb0; // coined; docs/systems/ui.md: WidgetManager.Update then Draw over the 320x240 frame
Script.Start = 0x8004ff80; // coined; (script, ref point base, then a cut-scene's stage as map set, row and column (+0x2A..+0x2E of its object), the object's index or 0x7FFF): starts a Borg13 script; also looks it up in the endings table (CutScene.EndingKind)
CutScene.EndFrame = 0x80050270; // coined; docs/systems/weather.md: CutScene.ModeFrame's state 2, the ending's fade-out frame
CutScene.ModeFrame = 0x8005039c; // coined; docs/systems/weather.md: game mode 0xC's frame, which sets and clears CutScene.Playing
Dialogue.PressDispatch = 0x800505a0; // coined; docs/systems/ui.md: calls the mode's press function (Backdrop.Start sets it)
BattleSetup.Scripted = 0x80050804; // BattleSetup.cs: a script's battle fills the setup block: its enemies, collision, arena (above 27 made 0) and animation bytes, flee unless a cut-scene
GameState.AddMember = 0x80050970; // GameState.cs
Conversation.Keeper = 0x80050a34; // Conversation.cs
Trainer.From = 0x80050a70; // Training.cs
CutScene.PlayFrame = 0x80050f50; // coined; docs/systems/weather.md: CutScene.ModeFrame's state 1 for a cut-scene, HandleZoneEngineFrame and the bubbles
Dialogue.ModeTable = 0x8005102c; // coined; docs/systems/ui.md: five functions a phase, by start_func
Script.Alloc = 0x80051180; // coined; docs/systems/scripts.md: makes Script.Current from Script.Start's arguments, its return mode 1
Script.Free = 0x800512f8; // coined; docs/systems/scripts.md: frees Script.Current and zeroes it, first in CutScene.Free, so the chain's Script.Start can make another
CutScene.Control = 0x80051378; // coined; docs/systems/scripts.md
Conversation.Speaker = 0x800514cc; // coined; docs/systems/wanderers.md
CutScene.RunFree = 0x80051570; // coined; docs/systems/scripts.md: calls the script's free slot for its type, CutScene.Free for a cut-scene
DialogueModeInitPrescripted = 0x800515a8; // string 0x800debbc (debug 0x800592c0), matched by tools/builds.py
CutScene.Free = 0x8005169c; // coined; docs/systems/scripts.md: a cut-scene's end: the script, FreeZoneEngine(1), then by CutScene.EndingKind: 2 the title; 1 Cinematic.Load(3, 2, 0); 3 with flag 3442 Cinematic.Load(2, 3, 1); else the chain check (0x80051810)
Backdrop.Start = 0x80051904; // coined; docs/systems/ui.md
Backdrop.End = 0x80051950; // coined; docs/systems/ui.md
CutScene.LoadStage = 0x80051984; // coined; docs/systems/weather.md: the stage's map set and chunk, then LoadGameBorgScenes
BattleSetup.Against = 0x80051a4c; // BattleSetup.cs: a conversation's battle with a monster party talking: TrekLoop.State 2, the bytes 0, then BattleSetup.FromMonsterParty on the party (its arena by the terrain) over the script's
Transition.AfterScript = 0x80051ad4; // Transition.cs: Conversation.End's ending by kind: 2 BattleSetup.Against, 5 and 7 TrekLoop.State
Conversation.Tick = 0x80051bd8; // Conversation.cs
Conversation.Press = 0x80051c4c; // Conversation.cs
Conversation.End = 0x80051ccc; // Conversation.cs
CutScene.SpeakerBody = 0x80051dc4; // coined; docs/systems/scripts.md: the speaker's body from the cut-scene's actors, which a press asks to talk (request 4)
TrekLoop.Cue = 0x80051e04; // TrekLoop.cs
CutScene.StandActors = 0x80051e2c; // coined; docs/systems/scripts.md: each frame, every actor's request (+0x14) to 0 but the one the script animated (+0x88) while +0xac is set; the port's CutSceneActor.Settle
CutScene.Press = 0x80051ed4; // CutScene.cs
CutScene.CheckEnd = 0x80051f4c; // CutScene.cs
Backdrop.LeaveTrek = 0x80051fd4; // coined; docs/systems/ui.md: a backdrop's and the help menu's start (Dialogue.ModeTable slots 2 and 4): TrekLoop.State to 0xb, which frees trek, and InitGameTrek builds it again as the script ends
Sign.Start = 0x80052014; // coined; docs/systems/ui.md: a sign's start (slot 3): the player's request to idle, then StartDialog in style 3, over trek
Sign.End = 0x80052088; // coined; docs/systems/ui.md: a sign's end (slot 0x12): frees its widgets and the script, trek staying
Script.Running = 0x800520bc; // coined; docs/systems/map-objects.md: Game.Mode is 0xC or a script is running (Script.Current); ProcessVoxelObjects starts nothing while it holds
JournalMenu.JournalMenu = 0x80052228; // JournalMenu.cs
Journal.AddEntry = 0x8005256c; // coined; docs/systems/pause-menu.md: (journal, text): lists an entry if the flag its text begins with is set
Journal::Load = 0x8005263c; // string 0x800dee88 (debug 0x8005b3ec), matched by tools/builds.py
JournalMenu.FadeIn = 0x80052eb0; // coined; JournalMenu.cs: alpha up 60 a frame to 255
JournalMenu.FadeOut = 0x80052f10; // coined; JournalMenu.cs: alpha down 60 a frame to 0
AudioKeys.Load = 0x80053000; // coined after ./src/audiokey.cpp, which it cites
AudioKeys.Free = 0x800530b4; // coined after ./src/audiokey.cpp, which it cites
AudioKeys.PlaySurfaceSteps = 0x800530dc; // coined; docs/systems/audio.md
AudioKeys.PlayEntityKey = 0x800532bc; // coined; docs/systems/audio.md
AudioKeys.PlaySpellCast = 0x800534bc; // coined; docs/systems/audio.md
AudioKeys.ProcessPlayer = 0x80053560; // coined; docs/systems/audio.md
Cinematic.Load = 0x80053880; // coined; docs/systems/cinematics.md: (index, kind, return mode): the index picks the record at 0x800E0780; the kind picks Cinematic.EndCase's case (0 Theatre, 1 opening, 2 ending, 3 Roog, 4 Shadow, table 0x800D20B0); the return mode is read by kinds 0 and 4 alone
Cinematic.Tick = 0x80053934; // coined; game mode 0xE's frame, from ScreenFade.Step: begins once (Cinematic.Begin), counts ticks (Cinematic.ReadInput), starts and draws shots, steps the fades, ends with Cinematic.EndCase; returns the next mode
Cinematic.FreeShot = 0x80053ad8; // coined; stops the shot's music and frees its scene, animation and sequence (each pointer is zeroed)
Cinematic.Begin = 0x80053b74; // coined; the first frame: black background (SetBackgroundType 2), stops trek's music and asks for it again, takes the leader's name, frees the HUD, makes the caption box, drops pending input
Cinematic.EndCase = 0x80053c20; // coined; the end or a skip: frees the caption box, remakes the HUD, sets the done flag, then by kind returns the next mode
Cinematic.ReadInput = 0x80053d18; // coined; counts the controller samples since the last call (the frame's ticks, at least 1, no cap); a newly pressed B or Start (0x5000) sets Cinematic.State to 0
Cinematic.DrawShot = 0x80053d94; // coined; a shot's frame: the black clear (RenderSky), the depth clear and 320x240 scissor, the scene stepped and drawn through its own camera, then the caption
Cinematic.StartShot = 0x80053e4c; // coined; docs/systems/audio.md
Cinematic.EndOpening = 0x8005403c; // coined; kind 1 (opening): starts script 866 from its object in Borg9 0x0FDB, returns mode 0xC
Cinematic.EndEnding = 0x800540f0; // coined; kind 2 (ending): Credits.Source = 2, returns mode 0x13 (the credits)
Cinematic.EndRoog = 0x80054104; // coined; docs/systems/cinematics.md: kind 3 (Roog): Party.FindMember of entity DB record 153's id (Alaron), sets bit 0 (True Name) of member->+0x14->+0xC, returns the literal 1 (trek)
Cinematic.EndShadow = 0x80054150; // coined; kind 4 (Shadow): returns Cinematic.ReturnMode
Cinematic.EndTheatre = 0x80054164; // coined; kind 0 (the Theatre menu): returns Cinematic.ReturnMode
Cinematic.InitFades = 0x80054170; // coined; zeroes the fade's colour, alpha, remaining time, progress and clocks, points it at the cinematic's fade list
Cinematic.StartShotFades = 0x800541d4; // coined; a shot began: the fade clock to 0, the shot number up
Cinematic.StepFades = 0x800541f0; // coined; the fade list's next entry starts when the shot's clock reaches its start x 2; the overlay's alpha steps by its rate and a screen-sized rectangle is drawn over everything
Cinematic.CaptionsCreate = 0x800545d0; // coined, in ./src/cinematictext.cpp (cites line 86); makes the caption box (TextBand.Create, rectangle 0,200,300,230, inset 25,5, colour 225,225,225,200, grow flag 1) and holds the leader's name for Alaron's
Cinematic.CaptionsFree = 0x800546b4; // coined, in ./src/cinematictext.cpp (cites line 113); frees the caption box and the caption index
Cinematic.ShowCaption = 0x80054720; // coined, in ./src/cinematictext.cpp; (text, ticks to show): TextBand.SetText and the remaining time
Cinematic.DrawCaption = 0x80054784; // coined, in ./src/cinematictext.cpp; steps the box and draws it over the whole screen at full alpha while the remaining time is at least the frame's ticks, then takes them off
Text.StartsWith = 0x800548bc; // coined; 1 if the second string is a prefix of the first
Text.ReplaceAll = 0x800548f0; // coined; (out, in, with, what): copies the text, replacing each occurrence of what
Cinematic.ShowDueCaption = 0x800549ac; // coined, in ./src/cinematictext.cpp; when the next caption's start x 2 is reached it replaces Alaron and ALARON with the leader's name, shows it and reads the one after
Cinematic.AdvanceCaptionClock = 0x80054a7c; // coined, in ./src/cinematictext.cpp; the shot's caption clock plus the frame's ticks
Cinematic.ReadCaption = 0x80054a90; // coined, in ./src/cinematictext.cpp (cites line 263); reads the next caption of the list: its start x 2, its length (end - start) x 2 and its decrypted text; none left is 0xFFFF
Cinematic.LoadCaptionIndex = 0x80054bbc; // coined, in ./src/cinematictext.cpp (cites line 287); reads the caption index (0x210 bytes at ROM 0x1FED330)
Cinematic.FreeCaptionIndex = 0x80054c60; // coined, in ./src/cinematictext.cpp (cites line 297)
Cinematic.SelectCaptions = 0x80054ca0; // coined, in ./src/cinematictext.cpp; a shot's caption list by number (0xFFFF none): seeks it, reads its first caption, clocks the captions from 0
Title.Build = 0x80054f04; // coined; docs/systems/ui.md: the title mode's first frame: clears Title.FlyEnding, makes the IntroMenu (Title.Menu), then Title.StartScenery
Title.SceneryFrame = 0x80054f70; // coined; docs/systems/ui.md: steps the fly-through by delta, starts its 100-tick fade out once within 101 ticks of its end, frees it at alpha 0 and builds the next
Title.ModeFrame = 0x800551c0; // coined; docs/systems/cinematics.md: game mode 0xF's frame, the title screen: New Game, once its fade-out reaches 0, calls Cinematic.Load(0, 1, 1) (0x80055434) and returns mode 0xE; Continue (state 2, the title menu's result 9), once its fade-out ends, returns mode 1, trek, with no cinematic (docs/systems/saves.md); both New Game and Continue end the frame with Title.Leave
Title.Input = 0x80055560; // coined; docs/systems/ui.md: the pad's events to the menu, delta their count, and the menu's result to the fade out (New Game 6) or the load screen (0xB)
Title.FreeScenery = 0x80055698; // coined; docs/systems/ui.md: FreeZoneEngine(0), the Borg6 and its scene
Title.Leave = 0x80055718; // coined; docs/formats/code-tables.md: the title screen's hand-off to the game: a new game's map set 0 and portal 0, the player's actor 0x25F9 and scale 0.5
Title.StartScenery = 0x80054d70; // coined; docs/formats/code-tables.md: builds the title screen's scenery: the next of the six fly-throughs (Title.Flycams; place 4 is passed over without the Pak), its Zones.Row and Zones.Column, InitZoneEngine(2, 0) and the camera animation
TextBand.Create = 0x80055800; // coined; the cinematics' captions' and the combat log box's widget, not the conversation box's: a black band (image 0x1C4), a gradient over it (0x1C3) and a WidgetText; (rectangle left, top, right, bottom; text inset x, y; colour; grow flag)
TextBand.Destroy = 0x80055a2c; // coined
TextBand.SetText = 0x80055a80; // coined; sets the text, and with the grow flag sizes the box to it: 2 x inset y + the wrapped height, upward from the rectangle's bottom if that is over its height
MenuPopup.OnResultClosed = 0x80055c50; // coined; docs/systems/pause-menu.md: the result's A and B, closing the popup under it
MenuPopup.Menu = 0x80055c98; // coined; docs/systems/pause-menu.md: the skills' popups are built through it
MenuPopup.OnB = 0x80055e10; // coined; docs/systems/audio.md: the crafting and healer popups close, plays 0x074E
MenuPopup.ShowResult = 0x80055ed4; // coined; docs/systems/pause-menu.md: a skill's result, a message over its popup
MapObjectMemory.OffsetChunk = 0x80056710; // coined; docs/systems/saves.md: moves a row and column by a neighbour's code, 0x11 for none
MapObjectMemory.Clear = 0x80056740; // MapObjectMemory.cs
MapObjectMemory.Remember = 0x800567d0; // MapObjectMemory.cs
MapObjectMemory.Write = 0x80056950; // coined; docs/systems/saves.md: calls MapObjectMemory.Remember
MapObjectMemory.Age = 0x80056990; // MapObjectMemory.cs
MapObjectMemory.Has = 0x80056a58; // coined; docs/systems/saves.md: whether a memory is held
MapObjectMemory.Find = 0x80056b38; // MapObjectMemory.cs
MapObjectMemory.Forget = 0x80056c18; // MapObjectMemory.cs
MapObjectMemory.ForgetKind = 0x80056d40; // coined; docs/systems/saves.md: forgets every memory of a type, to make room
EnemyAI.ReserveFleesOnArrival = 0x80056e18; // coined; docs/systems/combat.md: with flee points, morale under 12 and more than half the enemies that began able: 2d6 over the record's morale (+0x1b), less 1 for the aspect, 4 with the leader gone, and the leader's morale's say; Combat.SpawnReserves passes it over
EnemyAI.Morale = 0x80056fa8; // coined; docs/systems/combat.md: (c, isSelf): clears the check-due flag; the AI's byte +6, less 1 for an opposed aspect, 2 once a weakness hit it (flag 0x10), 1 no Stamina, 1 under half the enemies able, 1 under a harmful effect; 2 more under half the party able, 3 a target with no Stamina, 2 flag 4; isSelf 1: 4 less with the leader gone, the leader's morale's 0-2; 2 to 11; isSelf 0 keeps it in cmb+0x11
EnemyAI.MayCheckMorale = 0x8005722c; // coined; docs/systems/combat.md: a check due (flag 2), or no Stamina, or not fleeing already and no more than half the enemies that began able
EnemyAI.CheckFlee = 0x800572ac; // coined; docs/systems/combat.md: at a turn start: the leader's morale, its own, a 2d6 roll against it: EnemyAI.StartFleeing
EnemyAI.IsOpponent = 0x8005737c; // coined; docs/systems/combat.md: in play, alive and on the other side
EnemyAI.AnyScoredWithinRadius = 0x800573f0; // coined; docs/systems/combat.md: some scored target is within the combatant's radius
EnemyAI.SpellValue = 0x80057498; // coined; docs/systems/combat.md: the weight of a spell kind in a score: a constant per kind, or counted over the field for the aspect and school ones
EnemyAI.ListOpponents = 0x8005783c; // coined; docs/systems/combat.md: the scores' list (AiScores) with an entry for each opponent
EnemyAI.CollectAttackCells = 0x80057908; // coined; docs/systems/combat.md: every free cell within the radius with an opponent attackable from it
EnemyAI.CollectAttackCellsByReach = 0x80057c30; // coined; docs/systems/combat.md: the same, keeping for each opponent the cell nearest it and whether it's already in reach
EnemyAI.AreaCentre = 0x80058008; // coined; docs/systems/combat.md: Fireball's count: the focus (cmb+0x18/+0x1C) to the opponents' mean place, the spell target set built, then +1 for each candidate of the other side and -1 for each of its own (may be negative: the score wraps in a byte)
EnemyAI.TargetCountScore = 0x8005818c; // coined; docs/systems/combat.md: rebuilds the spell target set; the number selected less 1
EnemyAI.ScoreSpellCells = 0x800581c8; // coined; docs/systems/combat.md: for each of the eight action slots with a spell, each free cell within the field (its own footprint vacated, its x, z moved there): an AiScores entry (x, z, slot + 1, (SpellValue + count * 10 + the spell's known level) & 0xFF, set B's cursor); room for (r*r*4*8) & 0xFFE0; returns a flag nothing reads
EnemyAI.ScoreSpellsInPlace = 0x800585b0; // coined; docs/systems/combat.md: ScoreSpellCells for a field of 0 (Pochanargat): one entry a slot at its own cell
EnemyAI.FarthestCell = 0x800587bc; // coined; docs/systems/combat.md: the cell within the radius with the greatest summed distance from the scored list
EnemyAI.AreaDanger = 0x80058a48; // coined; docs/systems/magic.md: (ai, x, z, score, flag, radius): 5 off a cell within radius of an opponent, or 5 on for one that is clear
EnemyAI.ScoreAttackCells = 0x80058c7c; // coined; docs/systems/combat.md: scores cells for an attack by direction to the opponent, flanking and height
EnemyAI.ChooseSpellOrAttack = 0x800590b0; // coined; docs/systems/combat.md: ScoreSpellCells, then with any entry the best ties (Sort 0, KeepBest) by distance (ScoreByDistance, Sort 1); whether a spell scored, else the style's weapon fallback
EnemyAI.Style0 = 0x8005910c; // coined; docs/systems/combat.md: an attack style (0x800e0b80 +0): sorts the opponents
EnemyAI.Style1 = 0x80059144; // coined; docs/systems/combat.md: an attack style (+8), melee with base Intelligence 15 or more: ListOpponents, ScoreAttackCells, Sort(0)
EnemyAI.Style2 = 0x80059178; // coined; docs/systems/combat.md: an attack style (+0x10)
EnemyAI.Style3 = 0x8005923c; // coined; docs/systems/combat.md: an attack style (+0x18)
EnemyAI.Style4 = 0x8005933c; // coined; docs/systems/combat.md: an attack style (+0x20), a weapon that strikes near and far: as Style1
EnemyAI.Style5 = 0x80059370; // coined; docs/systems/combat.md: an attack style (+0x28)
EnemyAI.Style6 = 0x800593ac; // coined; docs/systems/combat.md: an attack style (+0x30)
EnemyAI.Style7 = 0x80059424; // coined; docs/systems/combat.md: an attack style (+0x38)
EnemyAI.Style8 = 0x80059460; // coined; docs/systems/combat.md: an attack style (+0x40)
EnemyAI.Style9 = 0x8005949c; // coined; docs/systems/combat.md: an attack style (+0x48)
EnemyAI.Style10 = 0x8005950c; // coined; docs/systems/combat.md: an attack style (+0x50)
EnemyAI.WalkIsClear = 0x80059c94; // coined; docs/systems/combat.md: a straight walk between two points stays on free, gentle cells
EnemyAI.FaceStep = 0x8005a048; // coined; docs/systems/combat.md: sets the facing from the path's next step
EnemyAI.WalkPath = 0x8005a0d8; // coined; docs/systems/combat.md: walks the path in cmb+0x5320 a cell at a time, steering the body (Combat.StateMoving)
EnemyAI.SwapWeapon = 0x8005a560; // coined; docs/systems/combat.md: swaps the held weapon for the AI record's spare, with the 'changes weapons' line, and rests (state 24): a swap costs the turn
EnemyAI.ChooseWeapon = 0x8005a620; // coined; docs/systems/combat.md: ai+4 := ai+7, the entity's +0x3D (the selected spell's source) cleared, the action melee or ranged, a swap to the spare when the held is the wrong kind; both target sets rebuilt
EnemyAI.PlanPath = 0x8005a974; // coined; docs/systems/combat.md: ArenaGrid.FindPath to the chosen cell into cmb+0x5320
EnemyAI.FleeStep = 0x8005aa3c; // coined; docs/systems/combat.md: a fleeing combatant's step toward its flee point
EnemyAI.ApproachTarget = 0x8005ab14; // coined; docs/systems/combat.md: a step toward the target when it's in sight
EnemyAI.StartWalkTo = 0x8005ac30; // coined; docs/systems/combat.md: (from, to, fraction, body): the body's move to a point, state 5
EnemyAI.Act = 0x8005ad9c; // coined; docs/systems/combat.md: plans, approaches or flees
EnemyAI.NearestFleePoint = 0x8005ae3c; // coined; docs/systems/combat.md: the arena's flee point nearest a position, and the distance
EnemyAI.FindFleePoint = 0x8005af78; // coined; docs/systems/combat.md: the flee point to walk to from a cell
EnemyAI.BeginFleeWalk = 0x8005b038; // coined; docs/systems/combat.md: the flees line; leaves at once if the flee point is near, else the walk to it
EnemyAI.CanActOnTarget = 0x8005b218; // coined; docs/systems/combat.md: the chosen target is in reach or can be cast at
EnemyAI.Step = 0x8005b314; // coined; docs/systems/combat.md: state 8's frame: flees, plans a path, walks it, or acts on the target; ends the turn when it can do neither
EnemyAI.FleeAdvance = 0x8005b434; // coined; docs/systems/combat.md: after a walk (state 6 with NextState 8, or state 5's stuck timer): Execute for one not fleeing; fleeing, counts its turns down from 4 and leaves at 0, within 1.5 of a flee point, or not a unit from its turn's start; then rests
EnemyAI.Execute = 0x8005b594; // coined; docs/systems/combat.md: the chosen action: the weapon, the target, state 6 (face) and the action
EnemyAI.ElementalSelected = 0x8005b60c; // coined; docs/systems/magic.md: spell target set B holds an elemental
EnemyAI.ZombieSelected = 0x8005b6ac; // coined; docs/systems/magic.md: set B holds a Zombie or Plague Zombie
EnemyAI.PoisonedSelected = 0x8005b734; // coined; docs/systems/magic.md: set B holds a poisoned combatant
EnemyAI.ClearTarget = 0x8005b998; // coined; docs/systems/combat.md: target and path index to none
EnemyAI.IsFleeing = 0x8005b9ac; // coined; docs/systems/combat.md: the combatant is on the enemies' side and bit 0 of the AI's flags is set
EnemyAI.StartFleeing = 0x8005b9e4; // coined; docs/systems/combat.md: sets bit 0 and 4 steps if the arena has flee points and the combatant isn't engaged
EnemyAI.HasBossStyle = 0x8005ba40; // coined; docs/systems/combat.md: 13 entity indexes (0x57-0x59, 0x5e, 0x5f, 0x7a, 0xa7-0xa9, 0xab, 0xad, 0xba, 0xbc); called only by EnemyAI.Init
EnemyAI.Init = 0x8005ba7c; // coined; docs/systems/combat.md: (ai, entity id, ce): ai+0 the spare weapon (the first weapon id, when the first and third are set), the eight action slots (the entity's five spells, its armor's, shield's and weapon's own spell), morale from the record, the attack style 0-10 and the type 0-2 by the wielded weapon, base Intelligence 15 and whether any spell is there
EnemyAI.Free = 0x8005bd90; // coined; docs/systems/combat.md
AiScores.Alloc = 0x8005be88; // coined; docs/systems/combat.md: a list of n 8-byte entries (cell x, z, slot, score, combatant); 0x800e0be0 capacity, 0x800e0be2 count, 0x800e0be4 the list
AiScores.Sort = 0x8005bfc4; // coined; docs/systems/combat.md: qsort by score
AiScores.KeepBest = 0x8005c018; // coined; docs/systems/combat.md: trims to the entries tied with the first
AiScores.Free = 0x8005c080; // coined; docs/systems/combat.md
EnemyAI.Nop = 0x80056e10; // coined; docs/systems/combat.md: empty
EnemyAI.Nop2 = 0x8005a0d0; // coined; docs/systems/combat.md: empty
EnemyAI.ScoreByDistance = 0x80058b90; // coined; docs/systems/combat.md: (ai, flag): each AiScores entry's score the ArenaGrid.Distance from the combatant's cell to the entry's, then EnemyAI.AreaDanger while cmb+0x12 is set and the leader lives
EnemyAI.RunStyle = 0x80059628; // coined; docs/systems/combat.md: runs the attack style and takes the first AiScores entry: ai+5 its combatant's slot, the goal cell, and for a spell entry the action slot into the entity's +0x3E/+0x3D
EnemyAI.AimAreaSpell = 0x8005974c; // coined; docs/systems/combat.md: for a selected spell of kind 8 (Fireball) alone: of the arena's cells within range byte x casting level of the caster, the first with the most candidates of the other side less its own, above 0, into cmb+0x18/+0x1C; else AreaCentre's mean's cell
EnemyAI.ClipToCircle = 0x80059a84; // coined; docs/systems/combat.md: (centre, r, a, b, out): where the segment a-b meets the circle, the quadratic with b where 2b belongs; from the centre, a radius along it
EnemyAI.ShadowSmoothPath = 0x8005a734; // coined; docs/systems/combat.md: in the Shadow's battle, cuts the path where a segment of it comes within 10 of the Shadow
EnemyAI.ChooseGoal = 0x8005b144; // coined; docs/systems/combat.md: Step's choice for one not fleeing: RunStyle; Execute and 1 when the goal is its own cell
EnemyAI.PrepareAction = 0x8005b1d8; // coined; docs/systems/combat.md: AimAreaSpell, PrepareTargetSets, EnterRest when neither set offers a target
EnemyAI.FaceTarget = 0x8005b2e0; // coined; docs/systems/combat.md: Combatant.FaceCombatant at ai+5's combatant: state 6 for the action
EnemyAI.SelectWeaponTarget = 0x8005b7c8; // coined; docs/systems/combat.md: ai+5 kept, selected alone, if target set A has it as a candidate, else A's cursor; empties B
EnemyAI.SelectSpellTarget = 0x8005b878; // coined; docs/systems/combat.md: ai+5 kept if spell set B has it selected, else B's cursor; empties A
EnemyAI.PrepareTargetSets = 0x8005b8f8; // coined; docs/systems/combat.md: SyncFromBody, both target sets rebuilt, the spell's target first for a caster (ai+4 2), else the weapon's
AiScores.Add = 0x8005bf20; // coined; docs/systems/combat.md: (x, z, slot, score, combatant): appends an entry unless the list is full
Entity.AppendResistanceLine = 0x8006ffb0; // coined; docs/formats/code-tables.md: (resistance entry, text, buffer, length): "Immune to %s" at a multiplier of 0 or less, "Resistant to %s" below 2.0 (0x800d3248), else "Vulnerable to %s", the element name from Entity.ElementNames[element byte]; nothing for element 0
Entity.CanLayOnHands = 0x80071ed0; // coined; docs/systems/combat.md: modified Healer != 0 and modified Stamina >= max(1, 11 - Healer)
Entity.CanHealWithHerbs = 0x80071f38; // coined; docs/systems/combat.md: modified Healer != 0, a Herb (0x0112) in the party's inventory, modified Stamina >= max(1, 5 - Healer)
Entity.FindItem = 0x80072028; // coined; docs/systems/combat.md: (entity, item id): by the id's high byte 5 the armor, 6 the shield, 7 the held weapon, else the carried items (sheet +0x28); the item or null
Inventory.Has = 0x80072db0; // coined; docs/systems/combat.md: (inventory, item id): the id is held (Find != -1)
ItemPile.CanLeave = 0x80072de4; // Inventory.cs; docs/systems/pause-menu.md: (inventory): none of the 21 must-take items (CodeTable.MustTakeItems) is in it; the loot window's B asks to leave the rest only then
Inventory.Load = 0x800733ec; // coined; docs/systems/saves.md: (inventory, stream): vtable +0x24: 128 stacks of a quantity and an item, the reserved items' quantities, the key items from their flags, the 13 key gear and the old potion replaced
Inventory.Save = 0x800734c4; // coined; docs/systems/saves.md: (inventory, stream): vtable +0x2C: 128 stacks of a quantity (8 bits) and an item (28), the 80 reserved quantities, the 13 key gear (slots 239 to 251, an item each)
Party.IndexOf = 0x80074d3c; // coined; docs/systems/combat.md: (party, entity id): its slot 0-3, 0xFF if not in the party
Party.EquipErrorIndex = 0x80075368; // coined; docs/systems/combat.md: (party, code): the equip error table's index for a check's code (pairs at 0x800D3750: 1 -> 1, 2 -> 6, 3 -> 5), 1 for an unknown one
Party.EquipFlaskInCombat = 0x800753f0; // coined; docs/systems/combat.md: (party, entity, slot, item): a flask from the pause menu's Party tab: SetSpellAction and Combat.NextState = 19; refused for entity 0x024A
Party.EquipItem = 0x800754e0; // coined; docs/systems/combat.md: (party, slot, inventory index, &old item id): the aspect check, then the equip function for the item's type from the table at 0x800E2EB0
Party.EquipArmor = 0x8007561c; // coined; docs/systems/combat.md: the body armor row: take it from the inventory, Party.TakeOffArmor (refused with code 3 in the combat pause), Entity.EquipArmor
Party.EquipShield = 0x80075774; // coined; docs/systems/combat.md: the shield row, likewise with Party.TakeOffShield
Party.EquipWeapon = 0x800758cc; // coined; docs/systems/combat.md: the weapon row of the equip table: check, take from the inventory, stow the held item, Entity.EquipWeapon, Combatant.AfterEquipChange in the combat pause
Party.EquipScroll = 0x80075a58; // coined; docs/systems/combat.md: the scroll row (type 0x11): equips into a gear slot while fewer than 3 of the type are worn
Party.EquipTypeC = 0x80075b18; // coined; docs/systems/combat.md: the type 0x0C row: FUN_80079C44 with a limit of 2
Party.EquipGear = 0x80075b44; // coined; docs/systems/combat.md: the rows for types 9, 0xA, 0xB, 0xD, 0xE, 0xF, 0x13: swaps into the gear slot of the same type
Party.TakeOffArmor = 0x80076140; // coined; docs/systems/combat.md: body armor to the inventory, refused (code 3) in the combat pause
Party.TakeOffShield = 0x80076278; // coined; docs/systems/combat.md: the shield likewise
Party.TakeOffGear = 0x80076558; // coined; docs/systems/combat.md: (party, slot, gear slot): a gear item to the inventory, no combat restriction
Party.ShowHealerResult = 0x800776c0; // coined; docs/systems/combat.md: the healer's line: Combat.ShowLog in combat, else a message box
Party.LayOnHands = 0x80077778; // coined; docs/systems/combat.md: (party, healer, target): Stamina over 2, 3 Stamina, heals Healer x 2 + 5, no roll; returns the result line
Party.LayOnHandsResult = 0x800778f4; // coined; docs/systems/combat.md: (party, healer, target): Lay On Hands, then the result line to the log or a popup
Party.RefreshHerbCount = 0x8007791c; // coined; docs/systems/combat-actions.md: Heal With Herbs' refresh of the inventory list after a Herb is taken in trek
Party.HealWithHerbs = 0x8007798c; // coined; docs/systems/combat.md: (party, healer, target): a Herb removed, Stamina max(1, 5 - Healer), the (Int x 4 + Healer x 11) roll, heals 4 x the step; returns the line
Party.HealWithHerbsResult = 0x80077be8; // coined; docs/systems/combat.md: (party, healer, target): Heal With Herbs, then the result line
Party.Restore = 0x80077c10; // coined, beside party.cpp's others; the port's Crafting.Restore (Items/Crafting.cs): (party, healer, target, stat) a Herb, Stamina 15 - Healer, the (Int x 2 + Healer x 5) roll, restores twice the step up to the base
Party.Brew = 0x80077e98; // coined, beside party.cpp's others; the port's Crafting.Brew (Items/Crafting.cs): (party, member, recipe) the (Int x 3 + Alchemist x 6) & 0xFFFF roll against a d100, its step against the recipe's, adds the potion
Party.MemberHasItem = 0x80079b90; // coined; (party, member index, item id): the member is there and Entity.FindItem finds it
Party.HasItem = 0x80079bcc; // Party.Items.cs HasItem: the party's inventory, or any of the four members' Entity.FindItem
Party.EquipLimited = 0x80079c44; // coined; docs/systems/combat.md: (party, slot, item, entity, limit, charges): equips gear while fewer than `limit` of its type are worn
Skills.AddSkillBase = 0x8007a65c; // coined; docs/systems/combat.md: (skills, skill, amount): Skills.AddBase on the skills' base (+0x00) and modified (+0x18) arrays
Skills.AddShieldBase = 0x8007a6bc; // coined; docs/systems/combat.md: (skills, amount): Skills.AddBase on the shield skill (+0x17, +0x2F)
Skills.AddModifiedNotify = 0x8007a6ec; // coined; docs/systems/magic.md: (skills, skill, amount): the modified level (+0x18) changed, then Flags.SyncPartySkill if it moved (the Stealth spell's)
Skills.BaseLevel = 0x8007a7ec; // coined; docs/systems/combat.md: (skills, skill): the base byte, signed, 10 at most
Skills.WeaponBaseLevel = 0x8007a814; // coined; docs/systems/combat.md: (skills, weapon class): the base weapon byte (+0x0C), 10 at most
Skills.ShieldBaseLevel = 0x8007a83c; // coined; docs/systems/combat.md: (skills): the base shield byte (+0x17), 10 at most
PakCheck.Frame = 0x80082280; // coined; docs/systems/ui.md: app state 3: the Controller Pak's check at boot, its states in the table at 0x800d4240
PakCheck.Done = 0x80082758; // coined; sets App.State 0
App.StateNoController = 0x80083290; // coined; docs/systems/ui.md: app state 4: the sky and "WARNING NO CONTROLLER" (Borg8 0xFB), with no way out
ProcessVoxelObjects = 0x80083838; // string debug 0x800d8b88 (debug 0x8008cee0), matched by tools/builds.py
CombatMenu.ResetCursors = 0x80087c60; // coined; docs/systems/combat.md: Combat.Init's reset of both menus' remembered rows to 0xFF
CombatMenu.Step = 0x80087da8; // coined; docs/systems/combat.md: (delta): the menu's step (the cursor's pulse and scroll) once per tick of the frame
CombatMenu.Draw = 0x80087e30; // coined; docs/systems/combat.md: draws the open menu over the 320 x 240 frame, after Combat.DrawFrame
CombatMenu.HasCharges = 0x800885e0; // coined; docs/systems/combat.md: (item): the item has a spell struct (item+0x10) whose charges byte (+4) is not 0
CombatMenu.MakeEmptyMessage = 0x8008860c; // coined; docs/systems/combat.md: (text): the "No ... available" message box, 150 wide, (225,225,225,255) on (50,50,50,150)
CombatMenu.IsManaged = 0x8008867c; // coined; docs/systems/combat.md: (list head, widget): the widget is in the widget manager's list
CombatMenu.NewSpellsMenu = 0x800886b0; // coined; docs/systems/combat.md: allocates 0xB4 bytes and builds C-down's menu
CombatMenu.MakeEntry = 0x80088714; // coined; docs/systems/combat.md: (text, callback, short, byte, colour, icon image, icon width): a row, a container of an icon at (0,0) and the text at (iconWidth + 5, iconWidth/2 - textHeight/2), the callback at +0x18
CombatMenu.WidenTo = 0x8008887c; // coined; docs/systems/combat.md: (row, width): the larger of the width and the row's
CombatMenu.PartySlotOf = 0x800888e4; // coined; docs/systems/combat.md: (entity): its index in GameState.Party (0-3), else -1
CombatMenu.ResetSpellCursors = 0x80088928; // coined; docs/systems/combat.md: 0x800E3180's four bytes to 0xFF
CombatMenu.PickSpell = 0x80088958; // coined; docs/systems/combat.md: a spell row's callback: entity +0x3D = 1, +0x3E = the spellbook index, then Combat.BeginSpellTargeting
CombatMenu.CompareNames = 0x80088ac8; // coined; docs/systems/combat.md: strcmp of two collected spells' names, for the qsort
CombatMenu.CollectSpells = 0x80088af0; // coined; docs/systems/combat.md: (flags, out, spellbook): {spell pointer, index} pairs of the flagged slots
CombatMenu.BuildSpellsMenu = 0x80088b58; // coined; docs/systems/combat.md: the ChoicePopup of C-down: Lay On Hands, Heal With Herbs, Perform, then the spells by name, with the scroll arrows
CombatMenu.DestroySpellsMenu = 0x80088f90; // coined; docs/systems/combat.md: stores the cursor's row, then calls the selected row's A callback: releasing C-down chooses
CombatMenu.NewItemsMenu = 0x80089070; // coined; docs/systems/combat.md: allocates 0xB4 bytes and builds C-up's menu
CombatMenu.ResetItemCursors = 0x800890e4; // coined; docs/systems/combat.md: 0x800E3190's four bytes to 0xFF
CombatMenu.PickPotion = 0x80089114; // coined; docs/systems/combat.md: a potion row's callback: Combatant.SetSpellAction(c, 0x1000 + kind, inventory index), state 9, TargetSet.BeginAttackFocused
CombatMenu.PickItemSpell = 0x80089178; // coined; docs/systems/combat.md: an item spell row's callback: entity +0x3D = the source (2 armor, 3 shield, 4 weapon, 5 gear), +0x3E = the slot, Combat.BeginSpellTargeting
CombatMenu.BuildItemsMenu = 0x800891b4; // coined; docs/systems/combat.md: the ChoicePopup of C-up: the potions by kind, then the weapon's, shield's, armor's and gear slots' spells
CombatMenu.DestroyItemsMenu = 0x800895a0; // coined; docs/systems/combat.md: the same as the spells menu's destructor: releasing C-up chooses
CombatMenu.AddItemSpellRow = 0x80089678; // coined; docs/systems/combat.md: (menu, item, callback, source, slot, width, icon width): a row of the item's first spell's name and the item's image
Input.Thread = 0x80091344; // coined; docs/systems/ui.md: the pad thread: a pad event each VI retrace, so one a 60 Hz tick
Input.ControllerPresent = 0x80091d94; // coined; (port): a standard pad with no error bits
Pak.Init = 0x80091eb8; // coined; docs/systems/saves.md: (controller): osPfsInitPak under the pak lock (0x800E4508), through the pfs record at the pointer 0x800E4314 + controller * 0x78 + 4
Pak.InitMotor = 0x80091f34; // coined; docs/systems/saves.md: (controller): osMotorInit under the lock
Pak.Open = 0x8009202c; // coined; docs/systems/saves.md: (controller): Pak.Init; on error 0xB (not a Controller Pak) tries the motor and another device probe (0x800B8680): 0xB if either finds a device, else 10
Pak.FreePages = 0x800921bc; // coined; docs/systems/saves.md: (&pages, controller): osPfsFreeBlocks, as a byte of 256-byte pages
Pak.AllocateFile = 0x8009225c; // coined; docs/systems/saves.md: (&file number, name, extension, company, game code, size, controller): osPfsAllocateFile, the name and extension turned into the pak's character codes
Pak.FindFile = 0x80092370; // coined; docs/systems/saves.md: (&file number, name, extension, company, game code, controller): osPfsFindFile
Pak.FileState = 0x80092474; // coined; docs/systems/saves.md: (&state, file number, controller): osPfsFileState, with the name and extension turned back to ASCII; zeroed on error
Pak.WriteFile = 0x80092564; // coined; docs/systems/saves.md: (buffer, file number, offset, size, controller): osPfsReadWriteFile with the write flag
Pak.ReadFile = 0x8009261c; // coined; docs/systems/saves.md: (buffer, file number, offset, size, controller): osPfsReadWriteFile with the read flag
Pak.DeleteFile = 0x800926d4; // coined; docs/systems/saves.md: (file number, controller): osPfsFileState, then osPfsDeleteFile
Scene.SetRotationRPY = 0x8009da48; // coined; docs/systems/combat.md: (scene, pitch?, roll, heading) through guRotateRPYF into the scene's matrix (+0x88); DrawCastScene passes a missile's spin angle as the roll
Scene.GetPosition = 0x8009e4fc; // coined; docs/formats/actors.md: (scene, out vec3, transform index): the transform's position (+0x1C..+0x24); ActorStateMachine.Tick reads the root with it
Scene.SetTransformPosition = 0x8009e528; // coined; (scene, vec3, transform index): writes the position; drawing an actor zeroes the root with it and puts it back
ObjectGrid.CellAt = 0x800a4110; // coined; docs/systems/map-objects.md: (grid, point, &column, &row): truncated toward zero, off the grid (0, 0)
ObjectGrid.Cell = 0x800a568c; // coined; docs/systems/map-objects.md: (grid, column, row): the cell's record, its object list at +8 and count at +0x10
ProcessGameStates = 0x800cb034; // string debug 0x800e4dc0 (debug 0x800d4f80), matched by tools/builds.py
GameStateFunnel.MarkAndProcess = 0x800cb31c; // coined; docs/systems/flags.md: sets the dirty halfword and runs ProcessGameStates, as a game is begun or loaded
GameStateFunnel.Write = 0x800cb33c; // coined; docs/systems/flags.md: (funnel, flag, value): stores it and sets the dirty halfword
GameStateFunnel.Read = 0x800cb3ac; // coined; docs/systems/flags.md: (funnel, flag): a plain flag (type byte 3) as stored, else ProcessGameStates first while the dirty halfword (+6) is set
GameStateFunnel.SetBit = 0x800cb430; // coined; docs/systems/saves.md: (bits, index, value, masks)
GameStateFunnel.GetBit = 0x800cb480; // coined; docs/systems/saves.md: (bits, index, masks)
GameStateFunnel.Unpack = 0x800cb4e8; // coined; docs/systems/saves.md: (funnel, buffer): each plain flag's value from its bit, then the derived ones evaluated (0x800CB31C)
GameStateFunnel.Pack = 0x800cb58c; // coined; docs/systems/saves.md: (funnel, buffer): the plain flags (the first 5001 of 5627) as bits, flag n at byte n >> 3, bit n & 7, in a zeroed (count + 31) / 32 words
Crc.Compute = 0x800cbb00; // coined; docs/systems/saves.md: CRC.cpp (named by the debug build's asserts); (buffer, size): big-endian words, each byte shifted in as crc << 8 | byte with the table entry of the old top byte xored in (CRC-32, polynomial 0x04C11DB7, over the augmented message)
Crc.Check = 0x800cbbd4; // coined; docs/systems/saves.md: CRC.cpp (named by the debug build's asserts); (buffer, size): takes 8 off the last word, true if Crc.Compute is then 0
Crc.Seal = 0x800cbc0c; // coined; docs/systems/saves.md: CRC.cpp (named by the debug build's asserts); (buffer, size): zeroes the last word, then stores Crc.Compute + 8 in it
Crc.TableEntry = 0x800cbc50; // coined; docs/systems/saves.md: CRC.cpp (named by the debug build's asserts); (byte): eight shifts of byte << 24, xor 0x04C11DB7 on a carried top bit
Crc.Init = 0x800cbc94; // coined; docs/systems/saves.md: CRCTable.cpp (the debug build's string 0x800e4f30, debug 0x800d5c24); builds the 256-entry table (the pointer at 0x800E6560), once; SaveMenu.Create calls it
Crc.Free = 0x800cbd28; // coined; docs/systems/saves.md: CRCTable.cpp (the debug build's string 0x800e4f30, debug 0x800d5c24); frees the table
Zones.UnloadedNeighbours = 0x800cd59c; // coined; docs/formats/maps.md: the (row, column) in the 3x3 of each bit of Borg9 byte 0x1A, read at 0x8000b374
Body.AlwaysAnimated = 0x800cda50; // coined; docs/systems/combat.md: u16 actor ids, 0 ending them (2D4A 3463 30C5 28DC 28E9 2BE3 3094 31FE 3347), whose bodies animate in combat even idle and 13.0 (0x800cdb50) or more from the camera's aim
PartyMenu.SlotItemTable = 0x800d0820; // coined; docs/systems/combat.md: DollEquipmentMenu::GetEntityItemId's 15 slot getters; the weapon slot's (0x8003E66C) gives 0x1000 while the member's combatant has action 3
Combatant.FlaskMuzzle = 0x800d2b40; // coined; docs/systems/combat.md: float 4.0, a flask's muzzle number for its flight
Combatant.FlaskSpin = 0x800d2b44; // coined; docs/systems/combat.md: float 8.0, a flask's spin a tick in flight
CodeTable.AuraImmune = 0x800d3214; // RomVersion.cs
CodeTable.AuraResistant = 0x800d3224; // RomVersion.cs
CodeTable.AuraVulnerable = 0x800d3234; // RomVersion.cs
CodeTable.AuraResistantBelow = 0x800d3248; // RomVersion.cs
CodeTable.AuraFollower = 0x800d3250; // RomVersion.cs
CodeTable.AuraLeader = 0x800d325c; // RomVersion.cs
CodeTable.AuraHitpoints = 0x800d3264; // RomVersion.cs
CodeTable.AuraLevel = 0x800d3278; // RomVersion.cs
CodeTable.AuraProtection = 0x800d3284; // RomVersion.cs
CodeTable.CombatNoItems = 0x800d4834; // RomVersion.cs
CodeTable.CombatNoSpells = 0x800d4858; // RomVersion.cs
CodeTable.CombatLayOnHands = 0x800d4880; // RomVersion.cs
CodeTable.CombatHealWithHerbs = 0x800d4890; // RomVersion.cs
CodeTable.CombatPerform = 0x800d48a0; // RomVersion.cs
Input.DeadZone = 0x800d52a4; // coined; docs/systems/combat.md: float 0.1, each stick axis zeroed at or under it
Input.StickScale = 0x800d52a8; // coined; docs/systems/combat.md: float 80.0, a stick axis's signed byte divided by it, clamped to 1
App.State = 0x800d808c; // coined; docs/systems/ui.md: HandleAppFrame's switch: 0 Title.Frame, 1 ScreenFade.Step, 3 PakCheck.Frame, 4 no controller, 5 the region check
Frame.Delta = 0x800d8094; // coined; docs/systems/combat.md: float, the ticks (pad events) of this frame, 1 to 6
Title.CardsActive = 0x800d8098; // coined; 1 while the cards run, set by Title.StartMusic
Title.Music = 0x800d809c; // coined; the music sequence (0x632 with the Pak, else 0x5d9), whose voice is in the next two words
Title.MusicVoice = 0x800d80a0; // coined; AudioEngine.Play's byte, for its volume and Stop
Title.MusicSerial = 0x800d80a4; // coined; AudioEngine.Play's word
Title.CardState = 0x800d80a8; // coined; docs/systems/ui.md: the card's state: 5, 4, 1, 2, 3, then 0
Wanderers.Head = 0x800d80d8; // coined; docs/systems/wanderers.md: the slots' pointer at +0, the free stack of 39 u16 at +4, in use at +0x52, capacity at +0x54
TrekLoop.Built = 0x800d8140; // coined; docs/systems/scripts.md: s16, 1 once InitGameTrek has run; while set, InitGameTrek starts its fade-in from black
Popups.Message = 0x800d8160; // coined; docs/systems/map-objects.md: the open message popup (the journal's notice, a trap's damage), 0 with none
Zones.Cells = 0x800d8168; // coined; docs/systems/wanderers.md: the 3x3, 0x20 a cell: scene id and pointer, map id, zone, second scene id and pointer, load id at +0x18, grid slot byte at +0x1d
Zones.SavedPlace = 0x800d9092; // coined; docs/systems/scripts.md: Zones.SavedPosition +0x26, the saved Zones.Chunk: -1 but after Combat.Exit's Goblin Ambush rewrite (0); CutScene.Free chains into a tangible dialogue object at the saved place only while it isn't -1
Combat.ThrowDeadVec = 0x800d94c0; // coined; docs/systems/combat.md: a flask miss's destination point (ThrowMiss writes it, nothing reads it)
Title.Action = 0x800d958c; // coined; docs/systems/ui.md: 0 normal, 1 New Game fading out, 2 a loaded game fading out
Title.Menu = 0x800d9590; // coined; the IntroMenu widget
Zones.LoadCounter = 0x800da0c4; // coined; docs/systems/wanderers.md: the next chunk load id
MapObjects.UseTable = 0x800da3f0; // coined; docs/systems/map-objects.md: a use function a type (teleporter 0x800102c0, dialogue 0x80010d68, trigger 0x80010bc4)
MapObjects.EnabledTable = 0x800da424; // coined; docs/systems/map-objects.md: a flag A gate a type (7 teleporter 0x8001132c, 9 dialogue 0x8001143c, 10 trigger 0x800113a0, else false)
Title.MusicPending = 0x800dae90; // coined; byte, 1 in the ROM's data and after the cards end: the next Title.Frame starts the music and the cards
Title.LegalLines = 0x800daea0; // coined; the Copyright table (String table 6), loaded for the legal card
Title.LogoAngle = 0x800daebc; // coined; docs/systems/ui.md: float, the N64 logo's camera angle in degrees, +2 a tick
ScreenFade.BlackFrames = 0x800daef2; // coined; docs/systems/scripts.md: the frames a fade-out has been at black; the third ends it
TrekLoop.Queued = 0x800db064; // coined; docs/systems/scripts.md: s16, the trek state TrekLoop.QueueState asked for, -1 none (0 in the data image until the first InitGameTrek); TrekLoop.Frame takes it once the screen fade has ended
Combat.MissileLength = 0x800db0b0; // coined; docs/systems/combat.md: float, the flight's 3D length
Combat.MissileSpeed = 0x800db0b4; // coined; docs/systems/combat.md: float, the flight's step a tick
Combat.MissileArc = 0x800db0b8; // coined; docs/systems/combat.md: float, the flight's arc height
Combat.MissileSpin = 0x800db0bc; // coined; docs/systems/combat.md: float, the flight's spin a tick
Combat.MissileTravelled = 0x800db0c0; // coined; docs/systems/combat.md: float, how far the flight has gone
Combat.MissileAngle = 0x800db0c4; // coined; docs/systems/combat.md: float, the missile's spin angle
Spell.SchoolIcons = 0x800defc0; // coined; docs/systems/combat.md: 6 pairs of u16 {school, image}: Chaos 0x01A9, Elemental 0x01A5, Naming 0x01A6, Necromancy 0x01A7, None 0, Star 0x01A8; the count at 0x800DEFD8
Script.Current = 0x800dfe00; // coined; docs/systems/scripts.md: the running script's 0x1CC struct (+0x90 its return mode, +0xAA its type, +0xAB CutScene.ModeFrame's state), 0 with none
CutScene.Chaining = 0x800dfe0c; // coined; docs/systems/scripts.md: set while CutScene.Free starts the cut-scene it chains into, so TrekLoop.Cue queues no fade-out
CutScene.ReturnToMenu = 0x800dfe18; // coined; docs/systems/scripts.md: set when a script's return mode is 7; InitGameTrek then starts in trek state 7
Title.FlyEnding = 0x800e09d0; // coined; docs/systems/ui.md: byte, set as a fly-through starts its fade out, cleared as the title is built
Title.BuildPending = 0x800e0a56; // coined; docs/systems/cinematics.md: byte, set after Title.Leave, so the next title frame builds the title again
Title.LeavePending = 0x800e0a57; // coined; docs/systems/cinematics.md: byte, set when New Game or Continue is chosen, so Title.ModeFrame ends by calling Title.Leave
MapObjectMemory.Count = 0x800e0a70; // coined; docs/systems/saves.md: the byte before the chart: how many of its 19 entries are used
Title.Flycams = 0x800e09dc; // coined; docs/formats/code-tables.md: 6 x 0x14 bytes: u32 Borg6, then four u32s (u16 in the low half): 0x800d90dc, 0x800d90de (Title.FlycamOrigin), Zones.Row, Zones.Column
Title.FlycamPlace = 0x800e0a54; // coined; docs/formats/code-tables.md: u16, the place in Title.Flycams, 0 first
Title.FlycamOrigin = 0x800d90dc; // coined; docs/systems/ui.md: two u16s Title.StartScenery stores from the fly-through table, the row and column of the chunk whose corner the camera animation's coordinates are from; no instruction names them but the stores
AiScores.Capacity = 0x800e0be0; // coined; docs/systems/combat.md: u16
AiScores.Count = 0x800e0be2; // coined; docs/systems/combat.md: u16
AiScores.List = 0x800e0be4; // coined; docs/systems/combat.md: the entries: u8 score, x, z, action slot + 1, u32 combatant
AiScores.DescendingCompare = 0x8005bde0; // coined; docs/systems/combat.md: Sort(0)'s comparator, by the score byte, higher first
AiScores.AscendingCompare = 0x8005be34; // coined; docs/systems/combat.md: Sort(1)'s comparator, lower first
Quicksort.Partition = 0x800b3730; // Quicksort (src/HBHT.Core/Combat/AiScores.cs), after the debug build's quicksort.cpp: Hoare's partition against whatever is in slot lo
Quicksort.RandomPivot = 0x800b389c; // Quicksort (src/HBHT.Core/Combat/AiScores.cs): one Rng.RangeOn(0x800e6b60, lo, hi) draw, that element to lo, then Partition
Quicksort.Sort = 0x800b3978; // Quicksort (src/HBHT.Core/Combat/AiScores.cs): three elements by a network, two by a compare, more by RandomPivot and Partition
Entity.ElementNames = 0x800e0c00; // coined; docs/formats/code-tables.md: pointer to String/Common line 241, the 17 element names by element byte (set at 0x80083620 to the loaded table + 0x3c4)
Items.HornOfKynon = 0x800e2a42; // coined; docs/systems/combat.md: u16 item id 0x0D03, read only by Combat.PartyHasHorn
Party.EquipErrors = 0x800e2e90; // coined; docs/systems/combat.md: a pointer to the equip error strings, Common lines 95 onwards, set at start
Party.EquipTable = 0x800e2e98; // coined; docs/systems/combat.md: 12-byte rows {item type << 24, 0xFFFF, equip function}, ended by 0xFF: 5, 6, 7, 9, A, B, D, E, F, 0x13, 0x11, 0xC
Potions.Names = 0x800e2fb0; // coined; docs/systems/combat.md: a pointer to the PotionNames string table's pointers, set at start
CombatMenu.Widget = 0x800e3170; // coined; docs/systems/combat.md: the open menu, 0 when none
CombatMenu.SpellCursors = 0x800e3180; // coined; docs/systems/combat.md: 4 bytes by party slot, the row C-down's menu last ended on, 0xFF at battle start
CombatMenu.ItemCursors = 0x800e3190; // coined; docs/systems/combat.md: the same for C-up
Zones.TriggerHook = 0x800e4aa0; // coined; docs/systems/map-objects.md: the function PerformCallback(8) calls, MapObjectUse.Tread, set by InitZoneEngine (0x8000df84)
Combat.MissileStep = 0x800e6870; // coined; docs/systems/combat.md: vec3, the flight's direction
Combat.MissilePosition = 0x800e6880; // coined; docs/systems/combat.md: vec3, the missile's position on the straight line
Quicksort.Seed = 0x800e6b60; // RandomStreams.Sort (src/HBHT.Core/Rng/IRandom.cs): the quicksort's own LCG, 0 at boot, never seeded or saved
Quicksort.Swap = 0x800e6b64; // coined; docs/systems/combat.md: the swap buffer the quicksort allocates
Body.StickTowardGoal = 0x8001555c; // coined; docs/systems/combat.md: (out, in): the way to the goal turned into the camera's frame, normalised: an AI body's stick
Body.WalkStick = 0x80015690; // coined; docs/systems/combat.md: that stick times 0.95 (0x800cdcb8): the AI runs
Body.SneakStick = 0x80015638; // coined; docs/systems/combat.md: that stick times 0.5 (0x800cdcb0), with the destination's flag 8
SetPlayerMoveToQueue = 0x800157c8; // the original's name, the debug build's string 0x800d94d4 (debug.txt); docs/systems/combat.md: (body, x, z, tolerance, flag): a point to walk to into the ring of 16 at +0x154, started at once by Body.NextPathStep if the body is heading nowhere
Body.FadeOut = 0x80014ad4; // coined; docs/systems/combat.md: body flag 0x100 and 0x78 ticks at +0x708: the fade of a body Combat.FreeBody frees (the dead and the fled) and Combatant.Leave's; ProcessPlayers counts it down, stops stepping the actor, takes +0x70c down over the last 60 and frees the body (FreePlayer) under 1
Body.FadeSpan = 0x800cdb2c; // coined; docs/systems/combat.md: f32 60.0, the last ticks of Body.FadeOut's 120 a body's alpha (+0x70c) falls over, (u8)(left / 60 x 255) (Combatant.Alpha, Battle.FadeShownTicks)
Character.HpFraction = 0x8006e9c8; // coined; docs/systems/combat.md: min(1.0, hit points / maximum): ScoreAttackCells' wounded-target term
EnemyAI.BossStyleTable = 0x800d24b0; // coined; docs/systems/combat.md: EnemyAI.HasBossStyle's jump table, entity list places 0x57-0xBC
Combat.IsExcludedEnemy = 0x8005c0c0; // coined; docs/systems/combat.md: 1 for an entity that never fights (not a monster-category ID, or in some index ranges): Combat.CreateEnemyCombatants drops it from the list
Combat.Reset = 0x8005c150; // coined; docs/systems/combat.md: zeroes the combat struct (0x544c), loads the combat strings (String/Combat, 0x500 bytes)
Combat.FindSpawnPoint = 0x8005c210; // coined; docs/systems/combat.md: (set, letter, side): the arena's reference point named like "bad2a" or "good0b" (combat strings 0xdc, 0xf4 and 0xf8)
Combat.SpawnPosition = 0x8005c294; // coined; docs/systems/combat.md: a slot's start cell and facing from the arena's reference points; the set is 4 minus the setup's animation byte, party members in particular ways when the collision byte is 2, a reserve's is set 0
Combat.CreateBody = 0x8005c474; // coined; docs/systems/combat.md: AllocPlayer for a combatant: its entity's model and size, placed on the floor, party bodies lit by map lights (+0x70a)
Combat.CountFieldEnemies = 0x8005c684; // coined; docs/systems/combat.md: the non-empty entries among the first four of the enemy list
Combat.FindSholeh = 0x8005c6c0; // coined; docs/systems/combat.md: 1 plus the index of Sholeh (D0e28e4+0x200) among the first four enemies, or 0
Combat.NextReserve = 0x8005c70c; // coined; docs/systems/combat.md: the next non-empty entry of the enemy list after an index, or 0xC
Combat.PartyPotionTier = 0x8005c750; // coined; docs/systems/combat.md: 7, 5, 4, 4 or 0 by which of the potion items 0x1001, 0x1000, 0x1002, 0x1003 the party holds; the start of cmb+0x12
Character.Build = 0x8006e434; // coined; docs/systems/combat.md: (character, entity ID, mode): the sheet from the entity's DB row (stats, skills, spells, equipment); mode 1 an enemy's, wielding the third weapon slot's weapon, else the first
Combat.CreatePartyCombatants = 0x8005c7c8; // coined; docs/systems/combat.md: one combatant (0x8c) and body for each living party member, raising cmb+0x12 to twice its Fireball's casting level
Combat.CreateSholeh = 0x8005ca60; // coined; docs/systems/combat.md: Sholeh as a party member when she's among the first four enemies
Combat.ForbidFleeForBosses = 0x8005cccc; // coined; docs/systems/combat.md: clears the setup's flee byte for the twelve entities at 0x800d2688 (the bosses) and sets it for the Shadow (place 0xAC, an immediate)
Combat.CreateEnemyCombatants = 0x8005cd98; // coined; docs/systems/combat.md: one combatant and AI for each of the first four enemies, and the leader: the highest base Intelligence, replaced only by a higher
Combat.ApplyFleeRuleByFlag = 0x8005d054; // coined; docs/systems/combat.md: the table at 0x800d26a0: encounter flags 978 (no fleeing), 5250 and 3749 (fleeing)
Combat.CompactEnemyList = 0x8005d0f0; // coined; docs/systems/combat.md: moves the entries up over empty ones
Combat.Setup = 0x8005d15c; // coined; docs/systems/combat.md: fills the combat struct from the setup block and the party: counts, the arena grid, the party's, Sholeh's and the enemies' combatants, the flee points, the first turn order
Combat.SkipFleeingReserves = 0x8005d310; // coined; docs/systems/combat.md: while the next reserve flees on arrival (EnemyAI.ReserveFleesOnArrival) it is passed over and its portrait marked; no caller (SpawnReserves does it itself)
Combat.FreeSlot = 0x8005d3a8; // coined; docs/systems/combat.md: frees a combatant's entity and struct
Combat.SpotIsClear = 0x8005d474; // coined; docs/systems/combat.md: no living body is within its radius of the point
Combat.FindFreeSpawn = 0x8005d5b0; // coined; docs/systems/combat.md: the first free point of a set, "bad" letters a-d then "good"
Combat.ChooseSpawn = 0x8005d748; // coined; docs/systems/combat.md: a slot's own point, else the first free one of sets 0 to 4
Combat.SpawnReserves = 0x8005d914; // coined; docs/systems/combat.md: at each round's end, fills the enemy slots from the next reserves (flag 0x400, the joins the battle line)
Combat.RollEquipmentDrops = 0x8005dc78; // coined; docs/systems/combat.md: a chest's chances for the entity's weapon and armor and three more kinds, and their values
Combat.RollChestItem = 0x8005df38; // coined; docs/systems/combat.md: one of a chest's six item slots: its chance, its amount, the item added to the loot
Combat.AddChestLoot = 0x8005e0f0; // coined; docs/systems/combat.md: a chest's gold (cmb+0x20), its equipment, one random item, its six slots
Combat.AddBonusLoot = 0x8005e238; // coined; docs/systems/combat.md: the setup's bonus ID (0x800d9470): a chest if its type is 8, else the item itself
Combat.TallyRewards = 0x8005e2ac; // coined; docs/systems/combat.md: at victory: every enemy in the list gives its experience (+0x7c, into cmb+0x24) and chest, the loot adding its worth; the bonus loot; each living party member is given the experience; the gold is doubled
Combat.Free = 0x8005e414; // coined; docs/systems/combat.md: frees everything the combat struct holds
Combat.ResetTargetSets = 0x8005e5a4; // coined; docs/systems/combat.md: the two target sets' modes
Combat.ShowLog = 0x8005e604; // coined; docs/systems/combat.md: copies a line to the log (cmb+0x4fc4) and shows it in the box
Combat.QueueLog = 0x8005e658; // coined; docs/systems/combat.md: copies a line to the queued one (cmb+0x50c4), shown by Combat.FlushQueuedLog
Combat.QueueLog2 = 0x8005e698; // coined; docs/systems/combat.md: the third line (cmb+0x51c4)
Combat.ShowLogAgain = 0x8005e6d8; // coined; docs/systems/combat.md: shows the current log line again
Combat.FlushQueuedLog = 0x8005e6f4; // coined; docs/systems/combat.md: shows the queued line
Combat.ShowThirdLog = 0x8005e74c; // coined; docs/systems/combat.md: shows the third line
Combat.FindFleePoints = 0x8005e76c; // coined; docs/systems/combat.md: 1 in cmb+0x5440 if the arena has a reference point "flee0" to "flee7"
Combat.PauseAllowed = 0x8005e808; // coined; docs/systems/combat.md: the frame counter (cmb+0x5448) is above 3
ArenaGrid.WidthFromWorld = 0x8005e820; // coined; docs/systems/combat.md: the collision world's width in cells
ArenaGrid.HeightFromWorld = 0x8005e890; // coined; docs/systems/combat.md: the collision world's depth in cells
ArenaGrid.Fill = 0x8005e900; // coined; docs/systems/combat.md: a byte for each cell: the floor's height times 2, found by a downward sweep, and bit 7 for a cell with no floor
Combatant.DebugStub1 = 0x8005ead0; // coined; docs/systems/combat.md: empty
Combatant.DebugStub2 = 0x8005ead8; // coined; docs/systems/combat.md: empty
Combatant.Init = 0x8005eae0; // coined; docs/systems/combat.md: (ce, entity, loot flag, x, z, size, ..., slot): zeroes the 0x8c bytes, sets the position, size, direction, resistances (entity record +0x63, +0x68) and the grid cells; an AI for enemies
Combatant.FreeAI = 0x8005ed84; // coined; docs/systems/combat.md: frees the AI record
Combatant.GetCell = 0x8005edd0; // coined; docs/systems/combat.md: (ce, &x, &z): the cell the position rounds to
Combatant.GetOldCell = 0x8005ee1c; // coined; docs/systems/combat.md: the cell of the turn's start
Combatant.GetPosition = 0x8005ee68; // coined; docs/systems/combat.md: x and z
Combatant.GetOldPosition = 0x8005ee7c; // coined; docs/systems/combat.md: the turn's starting x and z
Combatant.CellX = 0x8005ee90; // coined; docs/systems/combat.md: x rounded to a byte cell
Combatant.CellZ = 0x8005eee4; // coined; docs/systems/combat.md: z rounded to a byte cell
Combatant.OldCellX = 0x8005ef38; // coined; docs/systems/combat.md: the turn's starting x as a cell
Combatant.OldCellZ = 0x8005ef8c; // coined; docs/systems/combat.md: the turn's starting z as a cell
Combatant.X = 0x8005efe0; // coined; docs/systems/combat.md: +0
Combatant.Z = 0x8005efe8; // coined; docs/systems/combat.md: +4
Combatant.OldX = 0x8005eff0; // coined; docs/systems/combat.md: +8
Combatant.OldZ = 0x8005eff8; // coined; docs/systems/combat.md: +0xc
Combatant.SetPosition = 0x8005f000; // coined; docs/systems/combat.md: x and z
Combatant.SetOldPosition = 0x8005f00c; // coined; docs/systems/combat.md: the starting x and z
Combatant.HasActed = 0x8005f018; // coined; docs/systems/combat.md: flag bit 0 (+0x2c): set when the turn's action is chosen, cleared by EndTurn
Combatant.IsActive = 0x8005f024; // coined; docs/systems/combat.md: flag bit 1: in play and able to act (Combatant.UpdateActive)
Combatant.IsPerforming = 0x8005f034; // coined; docs/systems/combat.md: flag bit 2: a Troubadour performance
Combatant.HasMoved = 0x8005f044; // coined; docs/systems/combat.md: flag bit 3: moved this turn (a throw's chance loses 25; a spell's doesn't)
Combatant.IsHostileSide = 0x8005f054; // coined; docs/systems/combat.md: flag bit 4: the enemies' side (it differs from bit 5 for a charmed combatant)
Combatant.IsEnemyBorn = 0x8005f064; // coined; docs/systems/combat.md: flag bit 5: came from the enemy list
Combatant.IsGone = 0x8005f074; // coined; docs/systems/combat.md: flag bit 6: dead or fled, out of play
Combatant.IsEngaged = 0x8005f084; // coined; docs/systems/combat.md: flag bit 7: set by Combatant.UpdateRadius while an opponent is within reach (engaged); EnemyAI.StartFleeing tests it (once named IsFleeing; EnemyAI.IsFleeing is the AI's flag)
Combatant.IsHealing = 0x8005f094; // coined; docs/systems/combat.md: flag bits 8 or 9: Lay On Hands (0x100) or Heal With Herbs (0x200)
Combatant.SetFlags = 0x8005f0a4; // coined; docs/systems/combat.md: or's flag bits in
Combatant.ClearFlags = 0x8005f0b4; // coined; docs/systems/combat.md: clears flag bits
Combatant.ToggleFlags = 0x8005f0cc; // coined; docs/systems/combat.md: xor's flag bits
Combatant.RemainingMove = 0x8005f0dc; // coined; docs/systems/combat.md: the field of influence's radius (+0x21) less the distance from the turn's start cell, 0 at the least
Combatant.DebugStub3 = 0x8005f1b0; // coined; empty, the first call of Combatant.UpdateRadius and Combatant.TurnsPerRound
Combatant.IsFreeOfOpponents = 0x8005f1b8; // coined; docs/systems/combat.md: 1 when no opponent in play is within reach (Combatant.IsWithinReach)
Combatant.UpdateRadius = 0x8005f29c; // coined; docs/systems/combat.md: the field of influence (+0x21): the modified Dexterity's band in 0x800e0c20, less Slow or plus Haste, 1 when engaged (bit 7) or performing or near the Shadow, 13 at most, 0 for Pochanargat
Combatant.TurnsPerRound = 0x8005f4d0; // coined; docs/systems/combat.md: from the base Dexterity: 0 at 0 or less, 1 for 1-17, 18-24 alternates 1 and 2, 25-29 is 2, 30-34 alternates 2 and 3, 35 and up is 3; the toggle is cmb+0x34
Combatant.TotalProtection = 0x8005f570; // coined; docs/systems/combat.md: the entity's base protection (+2), the armor's byte +0x25, the armor skill divided by 5, less the Acid flask's potion records (3), plus 15 for a Defence potion's (15); 0 if it isn't positive
Combatant.ShieldDefence = 0x8005f6b0; // coined; docs/systems/combat.md: (u8)(the shield's defence +0x24 times the shield skill, plus Warrior)
Combatant.ProtectionVsAttack = 0x8005f71c; // coined; docs/systems/combat.md: TotalProtection plus the shield's byte +0x25 when the second argument is 0
Combatant.SaveStartPosition = 0x8005f770; // coined; docs/systems/combat.md: old x and z = x and z
Combatant.UpdateFromBody = 0x8005f784; // coined; docs/systems/combat.md: each frame of a player's move: the position from the body's, 3 changes then the moved flag
Combatant.SetFacingByDirection = 0x8005f8bc; // coined; docs/systems/combat.md: the facing vector (+0x18) from one of 8 directions
Combatant.SetFacingToward = 0x8005f96c; // coined; docs/systems/combat.md: the facing vector toward a cell; 1 if it changed
Combatant.IsAimedAt = 0x8005fa44; // coined; docs/systems/combat.md: the facing line passes within 0.5 of a point
Combatant.IsBehind = 0x8005fb54; // the port's; docs/systems/combat.md: the attacker is aimed at the target and behind it, within 45 degrees of its facing (formerly coined IsInFrontOf)
Combatant.PointBody = 0x8005fc38; // coined; docs/systems/combat.md: moves the body toward the combatant's cell
Combatant.FaceAndSettle = 0x8005fc98; // coined; docs/systems/combat.md: turns the body to its facing, then state 6 (NextState = the old state)
Combatant.FaceCombatant = 0x8005fd28; // coined; docs/systems/combat.md: state 6; the facing toward another combatant
Combatant.PlaceBody = 0x8005fe04; // coined; docs/systems/combat-actions.md: the body's X and Z the combatant's plus the scaled radius (body+0x34), set down (0, 0, 0); only Entity.Teleport calls it
Combatant.ApplyFacing = 0x8005fe64; // coined; docs/systems/combat.md: the body's facing from the combatant's
Combatant.AnimationForWeapon = 0x8005fee4; // coined; docs/systems/combat.md: the weapon class's attack animation request, by the table at 0x800d27e0, 0x12 if none
Combatant.WeaponReach = 0x8005ff74; // coined; docs/systems/combat.md: the weapon's reach: 400 for a thrown flask, 0 unarmed, else the weapon's byte +0x27
Combatant.IsAdjacentToward = 0x8005ffcc; // coined; docs/systems/combat.md: the cell is next to the combatant in its direction
Combatant.IsWithinReach = 0x8006011c; // coined; docs/systems/combat.md: melee reach: the distance is within the larger body radii of both, plus 0.75
Combatant.CanReachWithWeapon = 0x800601e4; // coined; docs/systems/combat.md: the target is in reach of the weapon: melee, ranged (not within 2), or a flask's range
Combatant.DistanceTo = 0x8006035c; // coined; docs/systems/combat.md: distance between two combatants' positions
Combatant.DistanceBetweenBodies = 0x800603b4; // coined; docs/systems/combat.md: after syncing both from their bodies
Combatant.CanUseItemSpell = 0x800603fc; // coined; docs/systems/combat.md: Entity.CanUse of the item spell in the slot
Combatant.ActionAllowsTarget = 0x80060420; // coined; docs/systems/combat.md: a flask is for the other side; a drunk potion only for the user
Combatant.CanTargetBySide = 0x8006049c; // coined; docs/systems/combat.md: the action may be used on the target: alive and in play, and the side fits
Combatant.CanAttack = 0x80060590; // coined; docs/systems/combat.md: the target can be attacked or healed now: side, reach, line of sight along the grid (WalkClear), then ArenaGrid.HasSight from the attacker's body lifted by both heads' heights (0x8006079c, 0x800607dc) to the target's body's centre
Combatant.SpellTargetCount = 0x80060818; // coined; docs/systems/combat.md: how many a spell may take: 1, all, or half its level rounded up
Combatant.SpellKindAllowsTarget = 0x8006088c; // coined; docs/systems/combat.md: for the special kinds 4, 0xf, 0x10, 0x11 and 0x1b: whether the target's entity is one it may be cast at
Combatant.SpellCanTarget = 0x80060988; // coined; docs/systems/combat.md: a spell may be cast at this combatant: not gone or dead, the side the spell wants, no effect that blocks it, the kind fits
Combatant.AICanCast = 0x80060a94; // coined; docs/systems/magic.md: for a combatant the AI plays (AI record, flag 8), every source: modified Stamina for Casting.Cost at Casting.Level, a charge, the target's requirement, the part of the day
Combatant.InSpellRange = 0x80060b60; // coined; docs/systems/magic.md: (caster, target, range, x, z): the body is within range plus its radius
Combatant.CanCast = 0x80060c38; // coined; docs/systems/combat.md: the full test for casting the current spell at a combatant: not the Shadow's merge pair, side, range, line of sight
Combatant.IsFriendlySpell = 0x80061008; // coined; docs/systems/combat.md: the entity's selected spell exists and its target type (+0x19) is 1 (Party); EnemyAI.Morale's +3 term
Combatant.ActionIsValid = 0x8006103c; // coined; docs/systems/combat.md: the action mode (+0x25) has what it needs: a weapon, a throwable, a flask
Combatant.AfterEquipChange = 0x800610c0; // coined; docs/systems/combat.md: from party.cpp when a weapon is changed in combat: stops performing, clears the healing bits, the default action, and the pause menu ends the turn (NextState 0x13)
Combatant.SetAction = 0x8006113c; // coined; docs/systems/combat.md: sets +0x25 (none, melee, ranged, flask, thrown); reverts if invalid; goes back to the turn
Combatant.DirectionToward = 0x800611e0; // coined; docs/systems/combat.md: one of 8 directions from a cell offset
Combatant.SetDirection = 0x8006129c; // coined; docs/systems/combat.md: direction, facing and body turn
Combatant.EndTurn = 0x80061300; // coined; docs/systems/combat.md: closes the popups, clears bit 0, cancels the spell choice, restores the weapon, state 1, TurnOrder.Advance
Combatant.Leave = 0x80061480; // coined; docs/systems/combat.md: a fleeing combatant leaves: bit 6, counts down, frees its body and effects, its portrait marked fled
Combatant.AspectOpposesTime = 0x800615b4; // coined; docs/systems/combat.md: aspect 1 (Lunar) when it isn't night, or 2 (Solar) at night
Combatant.IsAspectOpposed = 0x800615f4; // coined; docs/systems/combat.md: the combatant's aspect against the time of day
Combatant.IsAspectFavoured = 0x8006161c; // coined; docs/systems/combat.md: the reverse
Combatant.IsFlanking = 0x8006167c; // coined; docs/systems/combat.md: from the target's facing and the cells: the attacker is behind or beside it
Combatant.IsDamageKind = 0x800619f0; // coined; docs/systems/combat.md: an element or damage kind of 1-2, 4-0xd counts as a physical kind
Combatant.ResistanceApplies = 0x80061a30; // coined; docs/systems/combat.md: a resistance entry's element applies to an attack element
Combatant.ResistanceMultiplier = 0x80061aa4; // coined; docs/systems/combat.md: the product of the target's resistances (two on the sheet, one on the weapon, one on each armor and effect) that apply to a damage element
Combatant.SpellResistanceApplies = 0x80061c5c; // coined; docs/systems/combat.md: a spell resistance entry's kind (group, undead, aspect, true name, heavy, category) applies to the target
Combatant.SpellResistanceMultiplier = 0x80061d84; // coined; docs/systems/combat.md: the same product for a spell
Combatant.ResistBonusFromEffects = 0x80061f3c; // coined; docs/systems/combat.md: 6 times the byte of an effect of kind 0x26-0x29 that matches the caster's category, for the resist roll
Combatant.StrengthTier = 0x80062008; // coined; docs/systems/combat.md: 0 to 8: the modified Strength's band in 0x800e0c30 (4, 9, 17, 24, 28, 32, 36, 39)
Combatant.Death = 0x80062080; // coined; docs/systems/combat.md: removes its effects, clears its grid cells, counts down, sets Sholeh's flag 622, the first enemy death sets cmb+8, ends a performance
Combatant.IsImmobilised = 0x80062250; // coined; docs/systems/combat.md: an effect of one of the kinds at 0x800e0c38 is on it
Combatant.MeleeChance = 0x800622c4; // coined; docs/systems/combat.md: the hit chance: the attacker's Strength, Endurance and Level, weapon, skill and Dexterity against the target's armor and Level, bonus for the grid's height, less 30 if the attacker is aspect-opposed, night, ...
Combatant.AdjustRoll = 0x80062594; // coined; docs/systems/combat.md: a roll against a chance: with the Dexterity skill capped at the chance's, rolls 1-100 and subtracts
Combatant.GainSkillExperience = 0x80062650; // coined; docs/systems/combat.md: a chance of a point of weapon skill experience after an attack
Combatant.ApplyResistance = 0x80062704; // coined; docs/systems/combat.md: damage times the target's resistance product, 1 at the least unless the product is 0; a product over 1 marks the target's AI hit (bits 0x12)
Combatant.WeaponSpellProc = 0x800627d0; // coined; docs/systems/combat.md: the weapon's own spell is cast on a hit (SpellCanTarget, then CastSpell as an item's), its margin kept in the entity's +0x3C
Combatant.ResolveMelee = 0x800628a4; // coined; docs/systems/combat.md: a melee attack: the chance, the roll, damage by margin, the log lines, the skill experience, the damage dealt
Combatant.MeleeDamage = 0x80062ae4; // coined; docs/systems/combat.md: damage by the margin of success (Combat.DegreeOfSuccess), Strength tier dice, protection, Strength and the weapon's damage
Combatant.TroubadourScale = 0x80062c58; // coined; docs/systems/combat.md: scales damage by the Troubadour's bonus (cmb+0x13) for or against the party
Combatant.AspectScale = 0x80062cf8; // coined; docs/systems/combat.md: scales by aspect and time of day
Combat.WeatherPenalty = 0x80062d78; // coined; docs/systems/weather.md: night, storm, fog and distance penalties to a throw (ThrowChance's alone)
Combatant.HeightModifier = 0x80062e0c; // coined; docs/systems/combat.md: a chance plus a value for higher or lower ground; no caller
Combatant.SkillTerm = 0x80062ed8; // coined; docs/systems/combat.md: (value, factor, mult, ...): a skill's contribution
Combat.RangedChance = 0x80062f50; // coined; docs/systems/weather.md: x (1 - intensity x 0.3), x 0.7 at night
Combatant.ResolveRanged = 0x80063324; // coined; docs/systems/combat.md: a ranged or thrown attack: the chance, the roll, damage as Combatant.MeleeDamage's, the log lines
Combatant.IsDispelKind = 0x80063548; // coined; docs/systems/combat.md: a spell kind (list at 0x800d29bc) that removes an effect instead of adding one
Combatant.CheckSpellAvailable = 0x800635b8; // coined; docs/systems/combat.md: the spell may be cast: otherwise the line 'Spell Unavailable' or the reagent's
Combatant.FailSpell = 0x800636a4; // coined; docs/systems/combat.md: a line, the spell choice cancelled
Combatant.LogCasts = 0x80063718; // coined; docs/systems/combat.md: the casts line and the cast-on line
Combatant.LogCastFailed = 0x800637c0; // coined; docs/systems/magic.md: the caster's "spell failed" line
Combatant.LogResisted = 0x8006382c; // coined; docs/systems/magic.md: (caster, target, spell): "X resists Y"
Combatant.LogMissingComponent = 0x800638c8; // coined; docs/systems/combat.md: the reagent's name in the line
Combatant.IsLimitedKind = 0x80063944; // coined; docs/systems/combat.md: a spell kind in the list at 0x800d29c4 (4, 16, 17, 27): the charms, which the disable limit counts
Combatant.IsImmobilisingKind = 0x800639ac; // coined; docs/systems/combat.md: a spell kind in the list at 0x800e0c38 (34, 53, 57): an effect that stops the target
Combatant.DisableLimit = 0x80063a00; // coined; docs/systems/magic.md: (caster, target, spell): with reserves to come (Combat+7 isn't 12), the enemies' slots (Combat+3 to Combat+1) charmed or held and alive counted; at 3 or more the resists line and false
Combatant.CheckDisableLimit = 0x80063b10; // coined; docs/systems/combat.md: the limit for kinds in either list, when the caster is on the party's side
Combatant.CheckImmobilisingLimit = 0x80063b9c; // coined; docs/systems/magic.md: DisableLimit for the holds (34, 53, 57), whatever the caster's side
Combatant.CheckReagent = 0x80063bfc; // coined; docs/systems/combat.md: the party's inventory has the reagent (it's consumed on a cast)
Combatant.CastChance = 0x80063ca0; // coined; docs/systems/magic.md: (caster, level): (modified Intelligence x 4 + L x 6 + base Level) x the moon's factor (World+3) for a Lunar caster or the part of the day's (World+2), the Troubadour's scale, at least 5
Combatant.ResolveCastRoll = 0x80063df4; // coined; docs/systems/combat.md: the cast roll against the chance: success or the cost, and a chance of an experience point
Combatant.AttemptCast = 0x80063f7c; // coined; docs/systems/combat.md: pays the cost and rolls the cast
Combatant.PrepareCast = 0x8006406c; // coined; docs/systems/combat.md: rolls the cast's d100 step into the entity's +0x3c (0x80064184) and marks it acted; an AI's cast sets no margin before it
Combatant.IsResistable = 0x800641b8; // coined; docs/systems/combat.md: the spell kind may be resisted
Combatant.ResistRoll = 0x80064298; // coined; docs/systems/magic.md: (caster, spell, target, &margin): Teleportation barred by the Shadow; modified Willpower x 3 + modified Endurance + base Level, the ward, the aspect; a d100 at or under it takes its step off the margin, or resists, Mirror's counter spending the rest
Combatant.CastBanish = 0x800644dc; // coined; docs/systems/combat.md: a banish kind of spell
Combatant.CastDispel = 0x80064550; // coined; docs/systems/combat.md: a dispel kind of spell
Combatant.CastWind = 0x80064624; // coined; docs/systems/magic.md: Wind at a target: on the caster's side, Entity.AddStaminaEffect (Stamina and its maximum up 2 a level, a record), else the damage byte
Combatant.ApplySpellEffect = 0x800646e0; // coined; docs/systems/combat.md: by the spell's kind: banish, dispel, heal, or the effect added to the target (Entity.AddEffect) for its level times 1800 ticks
Combatant.CastSpell = 0x800648cc; // coined; docs/systems/magic.md: (caster, target, spell, proc): CheckSpellAvailable, the level, PrepareCast, ResistRoll, ApplySpellEffect, (margin + its result) d6 through SpellDamage; 0xFFFE not cast, 0xFFFF resisted, 0xFFFD an effect, else the damage
Combatant.SpellDamage = 0x800649e4; // coined; docs/systems/combat.md: a spell's damage scaled by the target's resistance
Combatant.ConsumeFlask = 0x80064ab0; // coined; docs/systems/combat.md: removes the used flask (0x1000 plus its kind) from the party's inventory and reverts the action
Combatant.AttachSpellVisual = 0x80064b10; // coined; docs/systems/combat.md: sets the body's animation to cast and files the spell's visual handle in the matching effect
Combatant.HealByPotion = 0x80064bbc; // coined; docs/systems/magic.md: Healing and Curing in combat: Range(15, 25) or Range(40, 60) percent of the maximum hit points
Combatant.DrinkPotion = 0x80064c84; // coined; docs/systems/combat.md: the action-3 items that are drunk, not thrown (kinds 4 and up): 4 and 6 timed, 5 full Stamina, 7 and 8 an effect, others by Entity.AddEffect; 1 if it did
Combatant.ThrowChance = 0x80064efc; // coined; docs/systems/combat.md: the chance for a thrown flask
Combatant.ThrowMiss = 0x80065120; // coined; docs/systems/combat.md: the flask misses: its line and visual
Combatant.ThrowNop = 0x80065268; // coined; docs/systems/combat.md: empty
Combatant.FlaskDamage = 0x80065270; // coined; docs/systems/combat.md: the dice by flask kind: 8d6, 4d6, 15, 2d6
Combatant.FlaskExplosion = 0x800652f8; // coined; docs/systems/combat.md: a flask's blast: the damage to every combatant by its distance from the landing cell (damage divided by distance; Sleep Gas a duration)
Combatant.ThrowFlask = 0x80065600; // coined; docs/systems/combat.md: a thrown flask: its chance, the landing cell by a sweep, the dice
Combatant.ResolveHealer = 0x8006591c; // coined; docs/systems/combat.md: Lay On Hands or Heal With Herbs: the party's call (Party.LayOnHands, Party.HealWithHerbs) and the line of what it healed
Combatant.ResolveAction = 0x80065acc; // coined; docs/systems/combat.md: dispatches a non-spell action by its mode (+0x25): 1 melee, 2 and 4 ranged or melee, 3 a flask or potion
Player.SetCastSound = 0x80065bfc; // coined; docs/systems/audio.md
Combatant.CastCurrentSpell = 0x80065c08; // coined; docs/systems/combat.md: the combatant's chosen spell: CastSpell, and its visual and sound
Combatant.ShadowFightTrick = 0x80065dcc; // coined; docs/systems/combat.md: the Goblin Ambush (978): a hit on Alaron takes 1 and queues it, counting Combat.ShadowTurnsLeft down; at 0 his Strength goes to 0
Combatant.CheckDeath = 0x80065e98; // coined; docs/systems/combat.md: a combatant at 0 after damage dies (Combatant.Death) unless it has Cheat Death, which only a line shows
Combatant.ExecuteAction = 0x80065f6c; // coined; docs/systems/combat.md: (self, target, isAction): ends a performance, points at the target, runs the cast or the action, the damage and the death check, state 2
Combatant.StopPerforming = 0x80066100; // coined; docs/systems/combat.md: bit 2 off, the Troubadour bonus gone, the performance's attachment freed
Combatant.UpdateActive = 0x8006615c; // coined; docs/systems/combat.md: bit 1 on unless a stat of Intelligence, Willpower, Dexterity or Strength is 0 or it is immobilised
Combatant.GainSmallExperience = 0x8006620c; // coined; docs/systems/combat.md: a one-in-ten chance of an experience point
Combatant.PlaceRingAndBody = 0x8006627c; // coined; docs/systems/combat.md: the body to its cell and the ring to it
Combatant.StartTroubadour = 0x800662f4; // coined; docs/systems/combat.md: (Troubadour × 5 + Intelligence) × 2 against a d100: starts the performance (bit 2, +0x13, the notes over the head, Borg5 0x1abb in slot 2), or the failure line
Combatant.SetHealingMode = 0x8006662c; // coined; docs/systems/combat.md: bit 8 or 9 on (a healing action), target set A rebuilt
Combatant.StartLayOnHands = 0x800666d4; // coined; docs/systems/combat.md: bit 8
Combatant.StartHealWithHerbs = 0x800666f0; // coined; docs/systems/combat.md: bit 9
Combatant.SetSpellAction = 0x8006670c; // coined; docs/systems/combat.md: action 3, the spell's number in +0x27 and a level in +0x26
Combatant.RevertAction = 0x8006679c; // coined; docs/systems/combat.md: back to the weapon's action after a flask or a spell
Combatant.ShieldModel = 0x80066844; // coined; docs/systems/combat.md: the shield's Borg5, or -1
Combatant.WeaponModel = 0x800668b4; // coined; docs/systems/combat.md: the weapon's Borg5, or -1
Combatant.WeaponIsBowKind = 0x80066908; // coined; docs/systems/combat.md: the weapon is in the list at 0x800e0c08
Combatant.AttachModel = 0x80066980; // coined; docs/systems/combat.md: (c, slot, locator, model): nothing for -1; else AttachItemToPlayer on its body and ChangeAttachmentNode to the locator
Combatant.UpdateDrawnFlag = 0x80066a2c; // coined; docs/systems/combat.md: +0x8a (Combatant.Drawn): 1 for a flask kind under 4, a bow or a thrown weapon (0x800e0c14): the attack is aimed freely and flies (states 18 and 3); not about what's drawn on the body
Combatant.EquipVisuals = 0x80066aec; // Combatant.EquipVisuals (HBHT.Core); docs/systems/combat.md: frees slots 1 and 0; slot 1 the shield at locator 2, or a bow at 1 (0 for EntityBody.Hand 0); slot 0 the weapon at locator 0, the arrow 0x348f (at 1 for Hand 0), or the flask 0x34c5 for action 3; nothing in the hand for action 0
Combatant.CannotUseShield = 0x80066c18; // coined; docs/systems/combat.md: the entity record's shield skill (+0x62) is 0xFF: Brenna, Donovan, Godric, Keelin, Niesen and Sholeh
Combatant.HasNoWeaponAttachment = 0x80066c5c; // coined; docs/systems/combat.md: the entity is one of eight whose weapon isn't drawn in the hand (CombatRecord.UndrawnWeapons, the list at 0x800d2a0c)
Combatant.LoadWeaponScene = 0x80066cf8; // coined; docs/systems/combat.md: the weapon's or the flask's Borg5
Combatant.WeaponMuzzle = 0x80066dd0; // coined; docs/systems/combat.md: the cast camera's offsets by the weapon's index
Combatant.RemoveAllEffects = 0x8006701c; // coined; docs/systems/combat.md: removes the entity's 15 effects
Combatant.SyncFromBody = 0x80067074; // coined; docs/systems/combat.md: the grid cells and the position from the body
Combatant.ClearTarget = 0x80067144; // coined; docs/systems/combat.md: forgets the last target (+0x10) if it's dead
Combatant.LogHpLoss = 0x800671a4; // coined; docs/systems/combat.md: 'x loses n hit points'
Combatant.LogHpGain = 0x8006723c; // coined; docs/systems/combat.md: 'x gains n hit points'
Combatant.SetDefaultAction = 0x800672d4; // coined; docs/systems/combat.md: action 1, 2 or 4 by what's wielded
Combatant.LogMiss = 0x80067354; // coined; docs/systems/combat.md: 'x attacks y' and 'y avoids the attack'
Combatant.LogMissed = 0x800673f0; // coined; docs/systems/combat.md: 'x attacks y' and 'x misses y'
ArenaGrid.DistanceSquared = 0x800674a0; // coined; docs/systems/combat.md: of two cells, a u16
ArenaGrid.Distance = 0x800674e4; // coined; docs/systems/combat.md: sqrtf of that, truncated to a u16
Combat.DivideClamped = 0x80067558; // coined; docs/systems/combat.md: (value, divisor, round up, minimum, maximum)
Combat.MergeShadow = 0x800675c0; // coined; docs/systems/combat.md: state 17's first frame, before the cinematic: the party's first member's stats (AddTrained), protection, skills and spells raised toward the Shadow's, flag 566
Combat.SetKillFlags = 0x80067860; // coined; docs/systems/combat.md: a win's boss flags, for the enemy list's first four, by entity list place (0xa8, 0xab, 0xad, 0xaf-0xb5, 0xba), whether the boss fell or not
ArenaGrid.Init = 0x80067960; // coined; docs/systems/combat.md: width and height from the world, half and diagonal, zeroes the two 100x100 layers (heights, path marks) and fills them (ArenaGrid.Fill)
ArenaGrid.Nop = 0x80067aa4; // coined; docs/systems/combat.md: empty
ArenaGrid.MaxX = 0x80067aac; // coined; docs/systems/combat.md: width - 1
ArenaGrid.MaxZ = 0x80067abc; // coined; docs/systems/combat.md: height - 1
ArenaGrid.Diagonal = 0x80067acc; // coined; docs/systems/combat.md: the diagonal, the longest path
ArenaGrid.HeightDifference = 0x80067ad4; // coined; docs/systems/combat.md: the second cell's height (7 bits) minus the first's, 0x7F outside
ArenaGrid.IsStep = 0x80067bbc; // coined; docs/systems/combat.md: the height difference is under 2
ArenaGrid.IsOccupied = 0x80067bec; // coined; docs/systems/combat.md: some cell of a footprint has bit 7
ArenaGrid.IsOutside = 0x80067cf4; // coined; docs/systems/combat.md: some cell of a footprint is off the grid
ArenaGrid.IsFree = 0x80067db0; // coined; docs/systems/combat.md: inside and unoccupied
ArenaGrid.IsGentle = 0x80067e3c; // coined; docs/systems/combat.md: the height difference is under 3
ArenaGrid.WalkClear = 0x80067e6c; // coined; docs/systems/combat.md: a line from one cell to another: every step inside, no occupied cell, no step of height over 1 beside it
ArenaGrid.Occupy = 0x8006820c; // coined; docs/systems/combat.md: sets bit 7 on a footprint
ArenaGrid.Vacate = 0x800682e0; // coined; docs/systems/combat.md: clears bit 7
ArenaGrid.Refill = 0x800683b4; // coined; docs/systems/combat.md: refills the heights (ArenaGrid.Fill)
ArenaGrid.RefillWithBodies = 0x800683e8; // coined; docs/systems/combat.md: refills the heights and occupies a cell for each living body
ArenaGrid.HasSight = 0x800684c4; // coined; docs/systems/combat.md: line of sight in 3D: a sweep from one eye height to the other's, then the bodies between
ArenaGrid.StepInDirection = 0x80068700; // coined; docs/systems/combat.md: adds the direction's dx and dz (0x800d2bd0, 0x800d2bd8)
ArenaGrid.TrimPath = 0x80068784; // coined; docs/systems/combat.md: removes a loop from a path
ArenaGrid.StraightenPath = 0x8006894c; // coined; docs/systems/combat.md: keeps only the cells where the direction changes
ArenaGrid.Neighbours = 0x80068b3c; // coined; docs/systems/combat.md: the eight neighbours' squared distance to the goal and direction, for a path step
ArenaGrid.BestNeighbour = 0x80068c94; // coined; docs/systems/combat.md: the least
ArenaGrid.FindPath = 0x80068cd4; // coined; docs/systems/combat.md: (start, goal, size): a greedy walk, at most the diagonal long; the path in 2-byte cells and its length
ArenaGrid.DirectionTo = 0x80068f08; // coined; docs/systems/combat.md: one of 8 directions from one cell to another
ArenaGrid.StepToward = 0x80068f7c; // coined; docs/systems/combat.md: one cell toward another
TargetSet.GiveCameraToCursor = 0x80068fe0; // coined; docs/systems/combat.md: the camera to the cursor's body
TargetSet.SetMode = 0x8006901c; // coined; docs/systems/combat.md: +0xa2: 0 for attacks, 1 for spells; clears
TargetSet.Nop = 0x80069038; // coined; docs/systems/combat.md: empty
TargetSet.ClearSelection = 0x80069040; // coined; docs/systems/combat.md: the selected flags (+0x48) and the count
TargetSet.ClearCandidates = 0x80069080; // coined; docs/systems/combat.md: the candidate flags
TargetSet.Clear = 0x800690ac; // coined; docs/systems/combat.md: everything, the counts and the cursor
TargetSet.Select = 0x8006912c; // coined; docs/systems/combat.md: marks a candidate selected if there's room under the maximum
TargetSet.Deselect = 0x8006918c; // coined; docs/systems/combat.md: unmarks
TargetSet.SelectAll = 0x800691c8; // coined; docs/systems/combat.md: selects every candidate up to the maximum
TargetSet.Rebuild = 0x80069264; // coined; docs/systems/combat.md: the set for a combatant: an attack set from Combatant.CanAttack, a spell set from Combatant.CanCast, then the selection
TargetSet.FindAttackTargets = 0x80069304; // coined; docs/systems/combat.md: marks every combatant the combatant can attack
TargetSet.FindSpellTargets = 0x800693c4; // coined; docs/systems/combat.md: marks every combatant the spell can be cast at; the maximum from Combatant.SpellTargetCount
TargetSet.BeginAttack = 0x800694a8; // coined; docs/systems/combat.md: the first target: the candidates, ordered by angle, the cursor on the old target or the first
TargetSet.BeginAttackFocused = 0x8006953c; // coined; docs/systems/combat.md: BeginAttack and the camera to the cursor
TargetSet.BeginSpell = 0x80069574; // coined; docs/systems/combat.md: for a spell of 1 target: ordered; of more: all that fit; of all: all
TargetSet.Nop2 = 0x80069618; // coined; docs/systems/combat.md: empty
TargetSet.StepCursorFocused = 0x80069620; // coined; docs/systems/combat.md: the cursor on and the camera
TargetSet.StepSpell = 0x80069674; // coined; docs/systems/combat.md: steps a spell's cursor or selection
TargetSet.StepSpellOne = 0x800696d4; // coined; docs/systems/combat.md: a one-target spell's cursor
TargetSet.Nop3 = 0x80069754; // coined; docs/systems/combat.md: empty
TargetSet.OrderByAngle = 0x8006975c; // coined; docs/systems/combat.md: orders the candidates into four groups by side of the facing line and by the distance from it, nearest first
TargetSet.FocusOnCursor = 0x80069cc4; // coined; docs/systems/combat.md: cmb+0x18 and +0x1c to the cursor's body
TargetSet.MoveCursor = 0x80069d00; // coined; docs/systems/combat.md: the cursor on to the next in the ordered list
TargetSet.SelectNearest = 0x80069d90; // coined; docs/systems/combat.md: selects the candidates nearest the cursor up to the maximum
TargetSet.SetCursorTo = 0x80069fac; // coined; docs/systems/combat.md: the cursor to a combatant
TargetSet.RestoreCursor = 0x8006a05c; // coined; docs/systems/combat.md: the old target if it's still a candidate
TargetSet.SetCursorIfCandidate = 0x8006a0b0; // coined; docs/systems/combat.md: (set, slot): the cursor to the slot if it is a candidate, selecting it; 0 if not
TurnOrder.Free = 0x8006a130; // coined; docs/systems/combat.md: frees the order's list
TurnOrder.Build = 0x8006a16c; // coined; docs/systems/combat.md: a round's order: the extra turns first (third, then second), then the first turns, each group in random order; fills cmb+0x30 and sets the first combatant
TurnOrder.StopBody = 0x8006a5c4; // coined; docs/systems/combat.md: stops the current combatant's body
TurnOrder.EndRound = 0x8006a62c; // coined; docs/systems/combat.md: performances cost a Stamina point, effects age a round, reserves spawn, the toggle flips, a new order
TurnOrder.Defeat = 0x8006a780; // coined; docs/systems/combat.md: the whole party gone: state 13 (or a non-lethal fight's), line 0xd4
TurnOrder.Victory = 0x8006a804; // coined; docs/systems/combat.md: Combat.SetKillFlags, Combat.TallyRewards, state 12, fade out, line 8
TurnOrder.CountActive = 0x8006a880; // coined; docs/systems/combat.md: cmb+2, +4 and +6: the combatants, the party's and the enemies' that are in play and able to act
TurnOrder.CheckEnd = 0x8006a97c; // coined; docs/systems/combat.md: no party member active is a defeat, no enemy active (and no reserve) a victory
TurnOrder.BeginTurn = 0x8006a9c8; // coined; docs/systems/combat.md: the turn's line, a newcomer's, the camera, then state 8 for an AI's or state 1
TurnOrder.Advance = 0x8006ac4c; // coined; docs/systems/combat.md: the next combatant in the order that is alive, active and in play, then BeginTurn and World.AdvanceTurn; a round's end first
TurnOrder.ClearActions = 0x8006ae64; // coined; docs/systems/combat.md: clears every combatant's pending damage and action marks
ItemTables.ShieldModels = 0x8006b3b8; // ItemTables.cs
Entity.PortraitImage = 0x8006c2d4; // coined; docs/systems/ui.md: (entity table, entity ID): its portrait's Borg8 ID from the entity-model tables (+8), 0x125 if none
EntityBody.Actor = 0x8006c3bc; // EntityRecord.Body: the Borg7 ID, 0x2d4a if none
EntityBody.Height = 0x8006c634; // coined; docs/systems/combat.md: an entity's model Height x Scale (1.0 without an entry): CodeTable.EntityModels +0x10 x +0x18, dialog entities +0x0C x +0x10
EntityBody.EyeHeight = 0x8006c748; // coined; entitydb: the height from 0x8006c634 less 0.2 (cameras.md GetHeightMinPoint2)
EntityBody.ShadowAlpha = 0x8006c798; // coined; 0x7f for entity indexes 0xaf-0xb5 and 0xc0, else 0xff
EntityBody.Strike = 0x8006c7fc; // EntityBody.Strike (HBHT.Plugins); docs/systems/combat.md: (entity table, entity id): an entity's model-table float (CodeTable.EntityModels +0xC, 0.2-0.67), the share of an attack's animation at which ProcessPlayers lets body +0x18 go, or 0.4 (0x800d2cf8) for one without
EntityBody.ShotStrike = 0x8006c884; // coined; docs/systems/combat.md: the same for a bow's and a thrown weapon's requests (14, 15): 0.4 (0x800d2cfc) whatever the entity
EntityBody.Hand = 0x8006c8bc; // coined; 0 for 11 entities (bandit bosses and woodsmen, Becan, Keelin), else 1; chooses the hand the gear goes in (Combatant.+0x84)
EntityBody.Radius = 0x8006c920; // EntityRecord.Body: the collision radius (0.55 for dialogue entities)
EntityBody.Scale = 0x8006c9b0; // EntityRecord.Body
Ids.IndexInList = 0x8006cbc0; // coined after ./src/ids.cpp (GetIdIndex's helper): the position of a byte in a list, or -1
GetIdIndex = 0x8006cbf8; // the debug build's own name (debug.txt's 0x80075de8, its string 0x800e004c): the place of an ID in its list: a spell's kind, an entity's list place
ItemTables.ItemModels = 0x8006d018; // docs/formats/db.md
Ids.IsElemental = 0x8006e110; // coined; docs/systems/magic.md: the entity ID's list position is an elemental's (0xc2, 0xc4, 0xc5, 0xc7) or the Firelord's (0xbf)
Character.Free = 0x8006e6d4; // coined; frees a character sheet's parts
Character.MaxHp = 0x8006e8d4; // Character.cs
Character.Hp = 0x8006e93c; // Character.cs
Character.IsDead = 0x8006ea54; // Character.cs
Character.DrainStamina = 0x8006ea80; // Character.cs: Stamina first, then Endurance
Character.HasCheatDeath = 0x8006eb4c; // coined; docs/systems/combat.md: the effect of kind 0x17 is on it
Character.TakeDamage = 0x8006eb8c; // Character.cs: the Level first, then DrainStamina; at 0 Cheat Death heals twice its margin and ends, else Combatant.Death's pieces
Character.Heal = 0x8006ece4; // Character.cs
Entity.TopUpStamina = 0x8006eeac; // coined; docs/systems/magic.md: (entity, fraction flag): Stamina to the base (or a share of it)
Entity.EquipArmor = 0x8006f0e8; // coined; docs/systems/magic.md: body armor, slot 0 of entity+0x20 (EquipSlot)
Entity.EquipShield = 0x8006f108; // coined; docs/systems/magic.md: the shield, slot 1; needs the shield skill
Entity.EquipWeapon = 0x8006f168; // coined; docs/systems/magic.md: the weapon at entity+0x24; its enchantment is not applied
Entity.EquipGear = 0x8006f1ec; // coined; docs/systems/magic.md: a gear slot; its enchantment is applied
Entity.ApplyItem = 0x8006f2a8; // coined; docs/systems/magic.md: (entity, item, text, apply enchantment): the item's stat bonus, then ApplyEnchantment when asked
Entity.EquipSlot = 0x8006f3ac; // coined; docs/systems/magic.md: builds the armor or shield instance, applies it (with its enchantment), Dexterity and Stealth
Entity.UnequipSlot = 0x8006f4ac; // coined; docs/systems/magic.md: armor or shield
Entity.UnequipWeapon = 0x8006f570; // coined; docs/systems/magic.md
Entity.UnequipGear = 0x8006f5c4; // coined; docs/systems/magic.md
Character.TakeOffEnchantment = 0x8006f654; // Character.Effects.cs: reverses ApplyItem; removes the first record of the item's enchantment kind with timer -1
Entity.HasPotion = 0x8006f800; // coined; docs/systems/magic.md: a potion record of that kind is on
Character.ApplyPotionEffect = 0x8006f84c; // Character.Effects.cs: (entity, kind, power, timer): a potion record and its stat or skill change (9, 10: stat +10; 13, 14, 16: skill +3)
Entity.UndoPotion = 0x8006f970; // coined; docs/systems/magic.md: reverses a potion record's change
Entity.AgePotions = 0x8006fa28; // coined; docs/systems/magic.md: ages the 7 potion records
Entity.RemovePotion = 0x8006fadc; // coined; docs/systems/magic.md: (entity, slot): UndoPotion, the visual, the record
Entity.RestoreStamina = 0x8006fb60; // coined; docs/systems/magic.md: removes Exhaustion (31) records and tops Stamina up
Potions.CanDrink = 0x8006fbe8; // Potions.cs: (entity, kind, text): whether a potion does anything now, else the refusal text
Entity.CureWeakness = 0x8006fdb8; // coined; docs/systems/magic.md: removes every record of the weakening kinds; the Restore potion's
Potions.Drink = 0x8006fe34; // Potions.cs: (entity, item, kind, text): PotionUsable, then the potion's effect in trek, and the item used up
Entity.HasEffect = 0x8006ff68; // coined; docs/systems/magic.md: a record of that kind is on
Entity.CharmAllowed = 0x8006ffa8; // coined; docs/systems/magic.md: a stub returning 1, asked before Character.AddEffect toggles a charm's hostile flag
Entity.SenseAura = 0x80070070; // coined; docs/systems/magic.md: (combatant, power): the info popup, a line more at power over 0, 2, 4, 6, 8
Entity.FreeEffectSlot = 0x800702c0; // coined; docs/systems/magic.md: the first null of the 15 spell effect slots, or -1
Character.AddEffect = 0x800702f0; // Character.Effects.cs: (entity, kind, power, timer, margin, combatant): adds a timed spell effect, the sheet's change per kind, nothing if the kind is on or the 15 slots are full
EffectRules.End = 0x800707ec; // EffectRules.cs: (entity, slot, combatant): reverses a record's change to the sheet by kind; kinds 0x19 and 0x2F give the AI record's morale back
EffectRules.Round = 0x80070a3c; // EffectRules.cs: (entity, combatant, amount): ages the 15 records, then Poison, the d6 burns, Photosynthesis and Web by kind
Entity.CurrentSpell = 0x80070cb4; // coined; docs/systems/magic.md: the spell instance named by entity+0x3d (source) and +0x3e (index)
Entity.CurrentSpellChecked = 0x80070d50; // coined; docs/systems/magic.md: CurrentSpell for sources 0-5
Entity.SpellCharges = 0x80070d84; // coined; docs/systems/magic.md: 1 for the spellbook, else the item spell's charges
Entity.UseCharge = 0x80070e0c; // coined; docs/systems/magic.md: one charge off a gear-slot scroll or wand (item types 0x11, 0x0d)
Casting.Level = 0x80070e68; // Casting.cs: (entity, spell): min(level, Wizard) from the spellbook, the item spell's own level, else 0
Casting.Cost = 0x80070efc; // Casting.cs: (entity, spell, level): max(1, Stamina cost - level)
Entity.PaySpellCost = 0x80070f18; // coined; docs/systems/magic.md: (entity, cost): SpellShortfall as a test, then paid
Entity.SpellShortfall = 0x80070f70; // coined; docs/systems/magic.md: (entity, cost, commit): the cost less the batteries (weapon, armor, shield, gear) and Stamina; 0 is paid
Entity.DrawBattery = 0x800710a8; // coined; docs/systems/magic.md: (entity, item, cost, commit): the item's Stamina bonus byte given toward the cost
Entity.CampHeal = 0x80071124; // coined; docs/systems/magic.md: (entity, fraction, seconds): heals a share of the maximum, ages the effects, refills the worn items' batteries
Casting.TimeAllows = 0x80071260; // Casting.cs: (caster entity, spell): 0, or 3 / 4 for Day and Night specials
Casting.Requirement = 0x800712c0; // Casting.cs: (target entity, spell): 0, or the message index for a missing True Name (7), a too-large target (8), Solar (9) or Lunar (10)
Entity.ShowAgeResult = 0x8007138c; // coined; docs/systems/magic.md: (entity, damage, healing, combatant): the numbers over the body, Combatant.Death and FreeBody on death
Character.AgeEffects = 0x80071444; // Character.Effects.cs: (entity, combatant, amount): potions, effects, then the numbers and death; EndRound's and TickClock's
Character.AddExp = 0x80071528; // Character.cs
Character.AddTotalExp = 0x800715ac; // coined; docs/systems/pause-menu.md: (character, pool): total += (int)(pool x 1.5), spendable untouched; the post-battle window's before and after level
Entity.HealPercent = 0x800715dc; // coined; docs/systems/magic.md: (entity, lo, hi): heals Range(lo, hi) percent of the maximum, none in the Shadow battle; Healing and Curing
Entity.ClearPotions = 0x80071754; // coined
Character.LevelForExp = 0x800717a4; // coined; the last CodeTable.LevelExp threshold the total reaches, 40 at most
Entity.ClearEffects = 0x80071830; // coined; the potion effects but kind 0x10, the 15 spell effects, then the gear's modifiers
Character.PutOnEnchantment = 0x8007192c; // Character.Effects.cs: (entity, item): AddEffect of the item's permanent record, when it has one
Entity.Teleport = 0x80071978; // coined; docs/systems/combat-actions.md: Teleportation, Character.AddEffect's kind 12: unless the footprint at Combat+0x18/+0x1c truncated is taken (IsOccupied), SetPosition, TurnOrder.StopBody, PlaceBody
Entity.CurePoison = 0x80071a6c; // coined; docs/systems/magic.md: (entity, combatant, margin): removes Poison records whose margin byte is below it
Entity.WraithDrain = 0x80071b0c; // coined; docs/systems/magic.md: Wraith Touch: a random stat of 0, 1, 2, 4 lowered by 2d6, and its permanent record
Entity.SetLight = 0x80071bdc; // coined; docs/systems/magic.md: (entity, kind 29 or 54): removes the opposite spell from everyone, locks the part of the day at night or day
Battle.Dispel = 0x80071cd8; // Battle.Magic.cs: (entity, combatant, kind 42-45, margin): removes every record of the school if margin x count >= the sum of their margins
Entity.ZeroOnDeath = 0x80071e28; // coined; docs/systems/magic.md: a dead entity's Endurance, Stamina and Level modded to 0
Entity.CanAffordSpell = 0x800720f0; // coined; docs/systems/magic.md: the cost is within Stamina; no callers
Entity.AddStaminaEffect = 0x80072158; // coined; docs/systems/magic.md: (entity, kind, power, margin, timer, flag): a bare record and Stamina 2 x power (flag 0 current and modded to the base, flag 1 modded and magicMod); Wind on an ally, Tap Stamina's caster
Entity.ClampStatAdd = 0x800722a8; // coined; docs/systems/magic.md: AddStat's bound
Entity.ClampStatRemove = 0x8007234c; // coined; docs/systems/magic.md: SubStat's bound
Character.AddStat = 0x800723e8; // Character.Effects.cs: (entity, stat, amount): alive only; Endurance and Level kept at 1 or more; modded and magicMod
Character.SubStat = 0x80072450; // Character.Effects.cs: AddStat's reverse, bounded the same way
Character.RemoveEffect = 0x800724b8; // Character.Effects.cs: (entity, slot): UndoEffect, frees the visual and the record
Entity.IsWeakeningKind = 0x8007253c; // coined; docs/systems/magic.md: the record's kind is in 0x800d34b4
Entity.Aspect = 0x80072844; // coined; docs/systems/magic.md: 2 Solar if entity+0x14 struct flag bit 2, else 1 Lunar
Spell.Free = 0x800728d8; // coined; docs/systems/combat-actions.md: (spell): frees a spell struct's buffers at +0xC and +0x10 and zeroes them; Combatant.WeaponSpellProc frees its stack spell with it after every proc
Item.SetCharges = 0x80072d84; // coined; docs/systems/magic.md: (item, charges): its spell's charges ((item+0x10)+4), unless 0xFF
Inventory.Add = 0x80073574; // coined; docs/systems/magic.md: the party inventory's vtable +0x34: (id, count), Aspect potion to Healing
Inventory.Remove = 0x80073688; // coined; docs/systems/magic.md: vtable +0x3c: (id, count): true if the stack was there
Inventory.IndexOf = 0x8007370c; // coined; docs/systems/combat-parity.md: (inventory, id): the stack holding the id with a count, 0-251, or -1; vtable +0x54
Inventory.StackAt = 0x8007374c; // coined; (inventory, index): the stack (+4 + 0x18 index: the id at +0, the count at +0x14) if its count is over 0, else null; vtable +0x5C
Inventory.AddToStack = 0x80073788; // coined; (inventory, index, amount): the count changed, 99 at most, the stack emptied at 0; vtable +0x64
Inventory.LoadReserved = 0x80073af8; // coined; docs/systems/saves.md: (inventory, stream): 80 quantities of 8 bits into the slots from 0x80, the items from CodeTable.ReservedItems
Inventory.LoadKeyItems = 0x80073b74; // coined; docs/systems/saves.md: (inventory): each of the 31 key items whose flag is set, in the slots from 0xD0
Inventory.LoadKeyGear = 0x80073bf4; // coined; docs/systems/saves.md: (inventory, stream): the 13 slots from 239, each an item of quantity 1
Inventory.SaveReserved = 0x80073c78; // coined; docs/systems/saves.md: (inventory, stream): the 80 reserved slots' quantities, 8 bits each
Inventory.SaveKeyGear = 0x80073cdc; // coined; docs/systems/saves.md: (inventory, stream): the 13 slots from 239, an item each, 28 bits, null when the quantity is 0
Inventory.ReplaceOldPotion = 0x80073de4; // coined; docs/systems/saves.md: (inventory): item 0x100B, if held, becomes 0x1004 in the same quantity
GearList.Find = 0x80074678; // coined; docs/systems/magic.md: (gear list, item ID): the gear slot the item is worn in
Party.SetMemberFlags = 0x800747c8; // coined; docs/systems/combat.md: (party, entity id, mode, value): mode 0 sets the died flag from CodeTable.PartyDeathFlags; else the joined flag = value and the left flag = value ^ 1 from CodeTable.PartyFlags
Party.SyncMemberFlags = 0x80074a4c; // coined
Party.Add = 0x80074ac4; // Party.cs
Party.FindMember = 0x80074c5c; // coined; the party member with an id, or 0
Party.Remove = 0x80074dcc; // Party.cs
Party.AfterBattle = 0x80074ee8; // coined; combat.md: syncs member flags, removes the dead, compacts the slots
Party.Compact = 0x80074f78; // coined; closes the gaps in the four party slots
Party.StripMember = 0x80074fe4; // coined after characters.md; (party, slot, all): the 12 gear slots into the inventory and, with all, the held item, the weapon, the armor and shield
Party.RemoveMember = 0x80075080; // coined
Party.HasMember = 0x800750fc; // coined; returns 0 for null, 1 otherwise (its not-found path returns 1 too)
Party.AverageLevel = 0x80075134; // coined; the sum of the members' modified levels over the party size
Party.StowHeldItem = 0x800763b0; // coined; docs/systems/combat.md: Combatant.EndTurn puts a flask still in hand back in the inventory
Party.BattleAmbushRoll = 0x80076c60; // coined; docs/systems/combat.md: the Ranger's roll for the party's spawn set in an ambush: 2 none, 0 failed, else the step
Camping.Ambushed = 0x800788cc; // Camping.cs
Item.CampRecharge = 0x80078b14; // coined; docs/systems/magic.md: (item, fraction): the item's Stamina bonus byte up by that share of its DB amount, to it
Party.CampHeal = 0x80078ba4; // Party.cs
TrekLoop.Camp = 0x80078d14; // TrekLoop.cs
Party.RechargeItems = 0x80078d5c; // coined; docs/systems/magic.md: (party, mode, amount): an empty function in 1.0, called from TickClock, EndRound and Party.CampHeal
PotionRecord.Init = 0x80079da0; // coined; docs/systems/magic.md: (rec, kind, power, timer): the 0xC potion record, visual 0xFFFF
PotionRecord.FreeVisual = 0x80079db8; // coined; docs/systems/magic.md
PotionRecord.Age = 0x80079df4; // coined; docs/systems/magic.md: EffectRecord.Age for a potion's timer at +4
Skills.Save = 0x80079fd4; // coined; docs/systems/saves.md: (skills, stream): skills 0 to 11, 15, 16, 17, 20, 21 and 23, 4 bits each
Skills.LoadOne = 0x8007a120; // coined; docs/systems/saves.md: (skills, stream, current): 4 bits, or -1 if the current level is negative
Skills.Load = 0x8007a16c; // coined; docs/systems/saves.md: (skills, stream): the 18 skills PakSave.WriteSheet writes, each into its base and modified level
Skills.AddModified = 0x8007a584; // coined; (base array, modified array, index, amount): modified += amount if the base is >= 0
Skills.AddBase = 0x8007a5b4; // coined; (base array, modified array, index, amount): up to the cap 10, then AddModified; nothing for a skill that can't be learnt (-1)
Skills.AddWeaponBase = 0x8007a688; // coined; docs/systems/combat.md: (skills, weapon class, amount): Skills.AddBase on the weapon skills' arrays
Skills.ClampLevel = 0x8007a7b8; // coined; (value, max): 0 for a negative value, max above it
Skills.Modified = 0x8007a85c; // Skills.Modified: (skills, skill) the modified level
Skills.WeaponModified = 0x8007a884; // coined; docs/systems/combat.md: (skills, weapon class): the weapon skill's modified level, 0..15 (modified[12 + class]; formerly WeaponBase)
Skills.ShieldBase = 0x8007a8ac; // coined; docs/systems/magic.md: the shield skill's byte at +0x2f
Spell.Init = 0x8007a910; // coined; docs/systems/magic.md: (spell, id, level): the 0x24 spell instance from the DB record of the id's kind
Spell.Reagent = 0x8007aa50; // coined; docs/systems/magic.md: the reagent's item ID (0x0111-0x0113)
Spell.AddsEffect = 0x8007aab4; // coined; docs/systems/magic.md: the spell with a damage byte also adds a record or acts (kinds 0, 24, 26, 53, 57 among them), so ApplySpellEffect takes the effect path
EffectRecord.Init = 0x8007ab44; // coined; docs/systems/magic.md: (rec, kind, power, timer, margin, harmful): the 0x18 record, school from the spell DB, visual 0xFFFF
EffectRecord.FreeVisual = 0x8007ab9c; // coined; docs/systems/magic.md: in combat, CombatSpellFx.EndEffect on the record's handle (+0x14): its lasting scene, Darkness's and Light's time, a hold's pose; not the actors
ActiveEffect.Age = 0x8007abd8; // ActiveEffect.cs: (rec, unit, amount): permanent stays; 0 is expired; 600 a round in combat (unit 0), unit x amount in trek
SpellSlot.Init = 0x8007ac40; // coined; docs/systems/magic.md: (slot, position, charges, level): an item's spell slot: the spell instance and its charges
SpellSlot.Free = 0x8007acc0; // coined; docs/systems/magic.md
Spellbook.Add = 0x8007ad70; // coined; docs/systems/magic.md: a spell appended to a spellbook
Spellbook.Find = 0x8007aee0; // coined; docs/systems/magic.md: (book, id, &index): the index of a spell, or false
Stats.Save = 0x8007b0bc; // coined; docs/systems/saves.md: (stats, stream): Base then health, each in the order Stamina 8 bits, Endurance 6, Level 6, Willpower 5, Intelligence 5, Strength 5, Dexterity 5
Stats.Load = 0x8007b1c8; // coined; docs/systems/saves.md: (stats, stream): the same, then base and modified copied from them
Stats.AddTrained = 0x8007b358; // coined; docs/systems/magic.md: trained, magicMod, current and modded (training), bounded by the cap
Stats.AddCurrent = 0x8007b3bc; // coined; docs/systems/magic.md: (stats, stat, amount): current and modded; damage and healing
Stats.AddModified = 0x8007b408; // coined; docs/systems/magic.md: (stats, stat, amount): modded and magicMod; spells and potions
Stats.SubModified = 0x8007b450; // coined; docs/systems/magic.md: AddModified's reverse
Stats.AddModdedOnly = 0x8007b498; // coined; docs/systems/magic.md: modded only; equipment
Stats.SubModdedOnly = 0x8007b4b4; // coined; docs/systems/magic.md
Stats.Base = 0x8007b4d0; // coined; the base value of a stat
Stats.Modified = 0x8007b4fc; // Stats.Modified: (attributes, stat) the modified value
Stats.TrainCost = 0x8007b528; // coined; (stats, stat): the experience cost of raising it
Stats.AtCap = 0x8007b5a4; // coined; (stats, stat): nonzero when it can't be raised
Stats.Clamped = 0x8007b618; // coined; (stats, stat, value, cap table): the stat's value read through its cap (Stats.Base 0x800e2fe4, Stats.Modified 0x800e3000)
Weapon.AllowsMelee = 0x8007b730; // coined; docs/formats/code-tables.md: a ranged weapon may strike in melee: range 0, class Breath or Spit, or position 100 (Spikes)
World.Init = 0x8007b7a0; // coined; docs/systems/weather.md: the world (0x38 bytes): 72 ticks a tick and a new game's wind
World.GetTerrain = 0x8007b89c; // coined; docs/systems/weather.md: the world's +0x24
World.LockPartOfDay = 0x8007b8ec; // coined; docs/systems/weather.md: raises +0x5, for combat's Day and Night spells
World.UnlockPartOfDay = 0x8007b8fc; // coined; docs/systems/weather.md
World.SetDate = 0x8007b914; // coined; docs/systems/weather.md: sets the clock from a date, then World.Update
World.GetDate = 0x8007ba30; // coined; docs/systems/weather.md: season, week, day, hour, minute and second
Weather.DriftWind = 0x8007baa0; // Weather.cs
Weather.Restore = 0x8007bbfc; // coined; docs/systems/weather.md: writes a snapshot back into the world and the drawn weather
Weather.Snapshot = 0x8007bc4c; // coined; docs/systems/weather.md: what falls, intensity, fog and storm
World.UpdateMoonPhase = 0x8007bc70; // coined; docs/systems/weather.md: the world's +0x3, flags 2299-2300
World.UpdatePartOfDay = 0x8007bd3c; // coined; docs/systems/weather.md: the world's +0x2 by the hour (6, 9, 12, 18, 21), and whether it changed
Weather.Roll = 0x8007bdb0; // Weather.cs
World.Update = 0x8007bf5c; // coined; docs/systems/weather.md: the calendar, the part of the day and the roll, the wind, the flags
World.WrapYear = 0x8007bff0; // coined; docs/systems/weather.md: the clock within the year
World.AdvanceTurn = 0x8007c01c; // coined; docs/systems/weather.md: a combatant's turn, the clock + 600
GameClock.Step = 0x8007c054; // GameClock.cs: the clock + ticks x 72, then World.Update
GameState.Lapse = 0x8007c098; // GameState.cs
SaveMenu.Create = 0x8007cd48; // SaveMenu.cs; docs/systems/pause-menu.md: the save and load screen (title 0xF1 via 0x8007f0dc)
SaveMenu.Step = 0x8007cfc4; // SaveMenu.cs; docs/systems/pause-menu.md: steps its children the frame's delta times in the pause menu
PartyMenu.ListUp = 0x8007d358; // coined; docs/systems/audio.md: the lists widget, plays 0x073B
PartyMenu.ListDown = 0x8007d3c0; // coined; docs/systems/audio.md: the lists widget, plays 0x073B
SaveMenu.Left = 0x8007d428; // coined; in ./src/controllerpakdata.cpp; docs/systems/pause-menu.md#saving-and-loading: WidgetGroup.Previous, the actions rebuilt, and 0x073D, whether or not there's a save that way
SaveMenu.Right = 0x8007d498; // coined; the same with WidgetGroup.Next
SaveMenu.Input = 0x8007d508; // coined; docs/systems/pause-menu.md#saving-and-loading: a question's presses, or else none at all while WidgetGroup.Sliding, or the menu's
SaveMenu.ScanSlot = 0x8007d9a4; // coined; docs/systems/saves.md: (menu): a state of the load scan, a note a call: osPfsFileState, game code NAYE and company 78, a read of 0x1C00 bytes, PakSave.Verify, then SaveMenu.AddSlot, or SaveMenu.AddCorrupt
SaveMenu.AddCorrupt = 0x8007e320; // coined; docs/systems/saves.md: (menu, note number): the popup "The game saved in Note %d of the Controller Pak is corrupt." (Common 189) with Delete the corrupt game (190)
SaveMenu.AddSlot = 0x8007e504; // coined; a save's page, in the group's box from the title's corner, 219 x 192
SaveMenu.Actions = 0x8007e658; // SaveMenu.cs; docs/systems/pause-menu.md: the Load, Save, Delete and Exit list, its pulse over 15
SaveMenu.Open = 0x8007e910; // coined; docs/systems/saves.md: (menu, ...): SaveMenu.Create, then a 0x1C00-byte buffer at +0x2C4 filled by PakSave.Make, and -1 at +0x2C8
SaveMenu.CreateNote = 0x8007eb2c; // coined; docs/systems/saves.md: (menu): the free pages, the extensions A to P in use, the first free one, and Pak.AllocateFile with CHRONICLES, company 0x3738, game code 0x4E415945 and 0x1C00 bytes; no free note is 0x8007EF34, too few pages 0x8007EFF8
SaveMenu.WriteNote = 0x8007ee34; // coined; docs/systems/saves.md: (menu, file number): Pak.WriteFile of the whole 0x1C00 bytes at offset 0, tried twice on a bad-data error
SaveMenu.LoadSlot = 0x8007f220; // coined; docs/systems/saves.md: (menu, slot): Pak.Open, then PakSave.Load of the slot's buffer, menu state 5
Combat.Controls = 0x80083b00; // coined; docs/systems/combat.md: game mode 2's input: the C buttons' menus first (CombatMenu.Input), then Combat.ControlsByState for the first event; returns the frame's delta, 1 to 6
Combat.CancelToTurn = 0x80083c2c; // coined; docs/systems/combat.md: back to the turn (state 1) and the old action
Combat.ReturnToTurn = 0x80083c70; // coined; docs/systems/combat.md: state 1: the popups, target sets and camera reset
Combat.HandleCancelAndPause = 0x80083d34; // coined; docs/systems/combat.md: Start opens the pause (state 14); B, Z or L cancel to the turn
Combat.HandleStart = 0x80083de0; // coined; docs/systems/combat.md: Start in the states that only allow the pause
Combat.DismissPopup = 0x80083e30; // coined; docs/systems/combat.md: any button closes the message popup (cmb+0x4fb8) and ends the turn
Combat.SkipTurn = 0x80083e90; // coined; docs/systems/combat.md: ends the turn: Z or L in state 1
Combat.BeginSpellTargeting = 0x80083ecc; // coined; docs/systems/combat.md: state 10 (a spell with one target or caster-centred) or 11 (a placed area, flag 0x10)
Combat.ConfirmSpellTarget = 0x80083f58; // coined; docs/systems/combat.md: A in state 10: the camera to the selection, state 6 or the facing
Combat.ConfirmAttackTarget = 0x80084078; // coined; docs/systems/combat.md: A in state 9: the same for an attack
Combat.ConfirmAreaTarget = 0x80084184; // coined; docs/systems/combat.md: A in states 11 and 18
Combat.InputAttackTarget = 0x800842c4; // coined; docs/systems/combat.md: state 9: A confirms, the stick cycles targets
Combat.AimAtCursor = 0x80084334; // coined; docs/systems/combat.md: turns the body toward the cursor's target
Combat.StepAttackCursor = 0x80084420; // coined; docs/systems/combat.md: state 9's cursor step: stick/D-pad left (0x10200) -> +1, right (0x20100) -> -1 in set A, then Combat.AimAtCursor
Combat.InputSpellTarget = 0x800844bc; // coined; docs/systems/combat.md: state 10: A confirms, the stick moves the cursor
Combat.StickToArena = 0x80084570; // coined; docs/systems/combat.md: the stick turned by the camera's look, normalized (state 18's free cursor)
Combat.MoveAreaCursor = 0x8008465c; // coined; docs/systems/combat.md: moves a placed area's centre within range, by the stick
Combat.InputAreaTarget = 0x80084964; // coined; docs/systems/combat.md: state 11
Combat.StepThrownCursorFree = 0x80084a24; // coined; docs/systems/combat.md: state 18: select the candidate nearest the free cursor, within 1.0
Combat.InputThrownTarget = 0x80084ba0; // coined; docs/systems/combat.md: state 18
Combat.MovePlayerBody = 0x80084ce0; // coined; docs/systems/combat.md: the stick moves the body inside the field of influence
Combat.InputTurn = 0x80084db0; // coined; docs/systems/combat.md: state 1: Start (pause), the stick (move), A (attack: state 9, or 18 for a flask), Z or L (skip), the C buttons
Combat.InputMoving = 0x80084f98; // Battle.SkipWalk; docs/systems/combat.md: state 5: A (edge) puts a body walking a path at its last queued point at once (Body.GiveUp), whoever it is
Combat.InputFacing = 0x80085018; // coined; docs/systems/combat.md: state 6
Combat.InputHook = 0x80085084; // coined; docs/systems/combat.md: a stub returning 0, called first by Combat.ControlsByState
Combat.InputTroubadour = 0x8008508c; // coined; docs/systems/combat.md: state 25: A starts the performance
Combat.ControlsByState = 0x800850d4; // coined; docs/systems/combat.md: dispatches an event by the combat state
CombatMarkers.RingPoint = 0x80085240; // coined; docs/systems/combat.md: a point on the field ring, by angle, set down on the ground by a sweep
CombatMarkers.Init = 0x800854a8; // coined; docs/systems/combat.md: 0x230 bytes, 20 of 0x1c, each a copy of scene 0x794
CombatMarkers.Update = 0x80085548; // coined; docs/systems/combat.md: the field of influence's ring of markers around a combatant, by its radius
CombatMarkers.CountFor = 0x8008580c; // coined; docs/systems/combat.md: the teardrops a ring of radius R takes: 6 up to 3, 16 up to 7, else 20
CombatMarkers.Draw = 0x80085848; // coined; docs/systems/combat.md: every lit teardrop, from Combat.DrawFrame while Combat.ActionActive is 0
CombatMarkers.Show = 0x800858dc; // coined; docs/systems/combat.md: a teardrop's first frame: +0x10 = 1.0 and the delta in +0x14, which nothing reads
CombatMarkers.DrawOne = 0x80085924; // coined; docs/systems/combat.md: Scene.SetPosition, Zones.SetSceneColors(255), Scene.Draw
CombatMarkers.Free = 0x800859cc; // coined; docs/systems/combat.md
CombatGui.HpColour = 0x80085a80; // coined; docs/systems/combat.md: a bar's colour from hit points over the maximum
CombatGui.Create = 0x80085b80; // coined; docs/systems/combat.md: the portraits' widget tree, one per combatant (the party at x 270, the enemies at x 21), the placeholders, the log box and the radar
CombatGui.Free = 0x80085e50; // coined; docs/systems/combat.md
CombatGui.Draw = 0x80085f64; // coined; docs/systems/combat.md: steps the tweens and draws the widgets
CombatGui.AssignPortrait = 0x80085fc8; // coined; docs/systems/combat.md: (entity id, slot, enemy): a combatant's portrait goes into a free slot and tweens in
CombatGui.MarkDead = 0x80086208; // coined; docs/systems/ui.md: the skull (0x16d) fades in over a dead combatant's portrait
CombatGui.MarkFled = 0x80086230; // coined; docs/systems/ui.md: a fled enemy's portrait gets the skull (0x16d) and the fled flag
CombatGui.MarkGone = 0x80086258; // coined; docs/systems/ui.md: (id, slot, image, fled): the skull on the portrait in that slot; an enemy becomes state 4, a party member state 1 (CombatGui.MarkGone in the port)
CombatGui.MarkReserveFled = 0x80086338; // coined; docs/systems/combat.md: marks the portrait of a reserve that fled on arrival
CombatGui.StepTweens = 0x800863bc; // coined; docs/systems/ui.md: MenuTween.ListStep with the frame's delta
CombatGui.DrawAll = 0x800863e4; // coined; docs/systems/combat.md: the tint pass, the log box, the widgets, the bars
CombatGui.CreatePortrait = 0x80086464; // coined; docs/systems/ui.md: (entry, entity ID, slot, side): an image widget at (160, 120), state 0
CombatGui.CreateBars = 0x800864f4; // coined; docs/systems/ui.md: the frames: one per party member and two hidden spares, then one per enemy-list entry, the first four large and the rest small
CombatGui.CreateBar = 0x800867fc; // coined; docs/systems/ui.md: (index, parent, x, y, border, frame image, w, h, enemy side, bar offset, visible): a frame widget and its entry
CombatGui.CreateImage = 0x800868c8; // coined; docs/systems/ui.md: (parent, image, x, y, visible): an image widget (vtable 0x800d4400) added to the parent
CombatGui.FindFreeBar = 0x80086984; // coined; docs/systems/ui.md: (side): the first frame free and not blocked for that side, or 0xff
CombatGui.PlaceInBar = 0x800869f4; // coined; docs/systems/ui.md: (bar, entry): takes the frame and starts the four 60-tick tweens, linear x, ease-out y, sine in-out w and h
CombatGui.AssignBarsFirstDraw = 0x80086c84; // coined; docs/systems/ui.md: on the first Draw, every entry without a frame takes a free one of its side (the reserves)
CombatGui.ResetFrames = 0x80086d48; // coined; docs/systems/ui.md: every frame to (0, 0, 0, 200)
CombatGui.TintFled = 0x80086de8; // coined; docs/systems/ui.md: the frame of a fled portrait to (200, 164, 0, 255)
CombatGui.TintByState = 0x80086eb4; // coined; docs/systems/ui.md: the frame's colour: orange fleeing, dim green set A's candidate, dim red set B's, bright green A's selected in states 9 and 0x12, bright red B's in 10 and 11
CombatGui.TintAll = 0x8008713c; // coined; docs/systems/ui.md: ResetFrames, TintFled, TintByState (CombatGui.Tint in the port)
CombatGui.DrawHpBars = 0x80087168; // coined; docs/systems/combat.md: a 3-wide bar by each portrait, its length the hit points
CombatGui.AddSkull = 0x800873f0; // coined; docs/systems/ui.md: (entry, image 0x16d): a child image on the portrait, alpha 0 rising to 255 over 60 ticks
CombatGui.BarImageDestroy = 0x800874e8; // coined; docs/systems/ui.md: the frame and portrait widgets' destructor (vtable 0x800d4400 +0xc)
CombatGui.BarImageDraw = 0x80087504; // coined; docs/systems/ui.md: draws the image only if the widget's visible word (+0x7c) is set
Combat.IndexOfBody = 0x80087550; // coined; docs/systems/audio.md: the combatant a body belongs to, or -1 outside combat
Combat.WieldedWeaponId = 0x800875c0; // coined; docs/systems/audio.md: the item ID of the weapon the body's combatant wields, or 0
Combat.WornArmorId = 0x80087620; // coined; docs/systems/combat.md: the body's combatant's armor slot 0 item
Combat.WornShieldId = 0x80087684; // coined; docs/systems/combat.md: the body's combatant's armor slot 1 item
AudioKeys.WeaponSound = 0x800876e8; // coined; docs/systems/audio.md
CombatGui.CreateLogBox = 0x80087860; // coined; docs/systems/combat.md: makes the log box if there is none
CombatGui.FreeLogBox = 0x800878a4; // coined; docs/systems/ui.md: destroys the log box
CombatGui.DrawLogBox = 0x800878f0; // coined; docs/systems/combat.md: the box shows the current combatant's portrait and the log line
CombatGui.SetLogText = 0x80087a00; // coined; docs/systems/combat.md: the line shown
CombatGui.SetLogPortraitLocked = 0x80087a34; // coined; docs/systems/ui.md: (entity ID): the log box's portrait, then locked (TurnOrder.Defeat)
CombatGui.LogBoxCreate = 0x80087a78; // coined; docs/systems/ui.md: a TextBand (the cinematics' captions' class, with its own vtable at 0x800d46f0) at (0, 180) to (246, 240), the text at (76, 190), the border at (20, 174) and the portrait at (26, 180)
CombatGui.LogBoxDestroy = 0x80087b58; // coined; docs/systems/ui.md: the log box's destructor: its portrait, border and the TextBand
CombatGui.SetLogPortrait = 0x80087bac; // coined; docs/systems/ui.md: (box, image ID): the portrait widget's image and size, unless locked
CombatGui.LogBoxSetText = 0x80087c24; // coined; docs/systems/ui.md: vtable 0x800d46f0 +0xcc: TextBand.SetText unless locked
CombatGui.LockLogBox = 0x80087c4c; // coined; docs/systems/ui.md: sets the lock (+0xa4)
CombatMenu.Input = 0x80087c8c; // coined; docs/systems/combat.md: in the player's states: C-up opens the items menu, C-down the spells and skills
CombatMenu.InputSpells = 0x80087ce8; // coined; docs/systems/combat.md: state 22: the menu takes the event; closes when C-down is let go
CombatMenu.InputItems = 0x80087d48; // coined; docs/systems/combat.md: state 23
CombatMenu.OpenByButton = 0x80087ee4; // coined; docs/systems/combat.md: C-up (bit 8) or C-down (bit 4)
CombatMenu.OpenItems = 0x80087f2c; // coined; docs/systems/combat.md: state 23: the potions and item spells list; 'No potions or item spells available'
CombatMenu.OpenSpells = 0x80088028; // coined; docs/systems/combat.md: state 22: the spells, Troubadour, Lay On Hands and Heal With Herbs; 'No spells or skills available'
CombatMenu.Close = 0x80088118; // coined; docs/systems/combat.md: state 1, the menu freed
CombatMenu.ListPotions = 0x80088190; // coined; docs/systems/combat.md: the drinkable and throwable potions (items of type 0x10, index 4 and up but 0x10) in the party's inventory that the combatant can use; fills 17 slots
CombatMenu.ListItemSpells = 0x800882d0; // coined; docs/systems/combat.md: the spells of the worn armor, shield and weapon, and of the carried items, with charges left
CombatMenu.ListSkills = 0x800883e0; // coined; docs/systems/combat.md: Troubadour (skill 9), Lay On Hands and Heal With Herbs, when the combatant has them
CombatMenu.ListSpells = 0x80088498; // coined; docs/systems/combat.md: the learnt spells whose reagent the party has (not spell 0x2e at night)
CombatMenu.PickTroubadour = 0x800889b0; // coined; docs/systems/combat.md: state 25
CombatMenu.PickLayOnHands = 0x800889e8; // coined; docs/systems/combat.md: bit 0x100, state 9
CombatMenu.PickHealWithHerbs = 0x80088a58; // coined; docs/systems/combat.md: bit 0x200, state 9
CombatTargetMarks.Init = 0x80089780; // coined; docs/systems/combat.md: a table of 8 bytes a combatant
CombatTargetMarks.Draw = 0x80089830; // coined; docs/systems/combat.md: pulses the light of each combatant selected in set A (B in states 10, 11), |sin(n x 3 degrees)|
CombatTargetMarks.Free = 0x80089a68; // coined; docs/systems/combat.md
CombatAttackFx.Init = 0x80089ad0; // coined; docs/systems/combat.md: the pool of 8, dead code with Add
CombatAttackFx.Add = 0x80089b80; // coined; docs/systems/combat.md: an attack actor flying from the attacker to the target; dead code, no caller in 1.0 or the debug build
CombatAttackFx.Frame = 0x80089cd8; // coined; docs/systems/combat.md: steps and draws the pool each DrawFrame (always empty: Add has no caller)
CombatAttackFx.ClearBody = 0x80089eac; // coined; docs/systems/combat.md
CombatAttackFx.Free = 0x80089ef4; // coined; docs/systems/combat.md
GetAttackActor = 0x80089fc8; // the original's own name: debug string 'GetAttackActor(), Attack type %i is not defined!' (0x800e2124); attack type 0 Borg7 0x1CFD, 1 0x1BE3
CombatStatIndicator.Init = 0x8008a000; // coined; docs/systems/combat.md: the ten digit textures (Borg1 22,17,21,20,15,14,19,18,13,16) and the pool of 16
CombatStatIndicator.Add = 0x8008a128; // coined; docs/systems/combat.md: (body, kind, amount): a floating number that rises and fades over a body
CombatStatIndicator.Frame = 0x8008a630; // coined; docs/systems/combat.md: draws and ages the numbers, 120 ticks
CombatStatIndicator.Free = 0x8008a8d4; // coined; docs/systems/combat.md
CombatStatIndicator.StartPotion = 0x8008aa28; // coined; docs/systems/combat-parity.md: a wrapper of CombatSpellFx.StartPotion, which Combatant.AttachSpellVisual calls for a potion's visual on a body; the formula vectors stub it
CombatSpellFx.DrawCastScene = 0x8008aa90; // coined; docs/systems/combat.md: the aim cylinder's draw: unturned, placed, scaled, Zones.SetSceneColors(scene, alpha, 0, colour), Scene.Draw
CombatSpellFx.DrawNumber = 0x8008abd8; // coined; docs/systems/combat.md: (focus, r, colour): the translucent cylinder, scene 0x0797, set on the floor and scaled (r + 0.2, 2, r + 0.2) at alpha 64, as Combat.DrawTargetCounts uses
CombatSpellFx.Start = 0x8008c43c; // coined; docs/systems/combat.md: (caster body, target body, spell, result): a spell's visual; returns its handle, which Combatant.CastCurrentSpell files in the effect
CombatSpellFx.Frame = 0x8008c754; // coined; docs/systems/combat.md: every combat frame: ProcessSpellVisuals, StepGlow, Housekeeping, Draw
CombatSpellFx.ClearForBody = 0x8008c880; // coined; docs/systems/combat.md: marks a body's entry gone (from Combat.FreeBody, CreateBody, Leave): its visuals stay where they were and play on
CombatSpellFx.Free = 0x8008c8e4; // coined; docs/systems/combat.md: the battle's end: every visual freed, the bodies' glows cleared over 30, poses let go, Darkness's and Light's time offset back over a tick
CombatCamera.StartGlide = 0x8008d1f0; // coined; (caster body, target body) starts the spell glide
CombatCamera.Reset = 0x8008d210; // coined; docs/systems/combat.md
CombatCamera.PullBack = 0x8008d22c; // coined; point.y += 1.5, then 4 away from the other point
CombatCamera.KeepInArena = 0x8008d29c; // CombatCamera.cs: the eye a unit above the floor a 0.5 sphere finds from 2 above it to 2 below
CombatCamera.CastGlide = 0x8008d3c8; // coined; docs/systems/combat.md: a spell's cast, the eye and aim gliding to the caster and target while CombatCamera.GlidePhase (0x800e3258) is set
CombatCamera.NearestOpponent = 0x8008d698; // coined; the nearest active non-party body to a body, within 10000
CombatCamera.PlaceBehind = 0x8008d78c; // coined; the eye 8 behind a party body away from its nearest opponent, 1.5 up
ProcessCombatCamera = 0x8008d8bc; // the debug build's string 0x800d9050 (debug 0x8009707c, matched by tools/builds.py); docs/systems/combat.md: string 0x800d9050 in the debug build; camera mode 4, called by ProcessPlayers in game mode 2: the current combatant's body, or the target's in states 11 and 18, glided by Camera.Orient-style steps
CombatRadar.Create = 0x8008dd30; // coined; docs/systems/ui.md: the radar widget at (274, 199), alpha 164, with the ring image 0x1b at (245, 170)
CombatRadar.Destroy = 0x8008de20; // coined; docs/systems/ui.md: the radar widget's destructor
CombatRadar.Step = 0x8008de44; // coined; docs/systems/ui.md: once a frame: the pulse (+0x80, from 0 to -150 in steps of 4) and the ring's alpha := the radar's
CombatRadar.IsTarget = 0x8008deb4; // coined; docs/systems/ui.md: the body's combatant's set B selected flag
CombatRadar.Draw = 0x8008df04; // coined; docs/systems/ui.md: centred on the camera owner's body, turned by the camera's look (up = look), 0.5 px a unit held at 20, 2 x 2 dots: the owner yellow, the party green, the rest red, at alpha 164
CombatRadar.Nop = 0x8008e3b4; // coined; docs/systems/ui.md: empty (vtable 0x800d5170 +0x14)
strcpy = 0x8008ef30; // library: copies to NUL including terminator, returns dst (game-side libc)
strncpy = 0x8008ef58; // library: copies up to n bytes then zero-pads, returns dst (game-side libc)
strcat = 0x8008efb4; // library: seeks the end of dst then copies (game-side libc)
strncat = 0x8008f000; // library: seeks the end of dst then copies at most n (game-side libc)
strcmp = 0x8008f078; // library: returns -1/0/1 (game-side libc)
strncmp = 0x8008f114; // library: returns -1/0/1, at most n bytes (game-side libc)
stricmp = 0x8008f1cc; // library: case-insensitive strcmp, folds A-Z by +0x20 (game-side libc)
strnicmp = 0x8008f298; // library: case-insensitive strncmp (game-side libc)
memset = 0x8008f380; // library: (dst, byte, n): 8x unrolled byte fill (game-side libc)
memmove = 0x8008f404; // library: overlap-aware byte copy, backwards when dst > src (game-side libc)
memcmp = 0x8008f5b0; // library: byte compare of n bytes, returns difference (game-side libc)
strupr = 0x8008f608; // library: upper-cases a-z in place (game-side libc)
strlwr = 0x8008f644; // library: lower-cases A-Z in place (game-side libc)
Audio.Start = 0x8008f680; // coined; docs/systems/audio.md: starts the audio thread at 44100 Hz
Audio.RemovePlayers = 0x8008f714; // coined; docs/systems/audio.md
Audio.AddPlayer = 0x8008f754; // coined; docs/systems/audio.md: alSynAddPlayer for the sequencer
AudioEngine.StartVoice = 0x8008f778; // AudioEngine.cs
AudioEngine.SetVoicePitch = 0x8008f968; // AudioEngine.cs
AudioEngine.SetVoiceVolume = 0x8008f9d0; // AudioEngine.cs
AudioEngine.SetVoicePan = 0x8008fa40; // AudioEngine.cs
AudioEngine.StopVoice = 0x8008fab0; // AudioEngine.cs
Audio.VoiceState = 0x8008fb38; // coined; docs/systems/audio.md
Audio.VoiceStamp = 0x8008fb64; // coined; docs/systems/audio.md
Audio.VoicePosition = 0x8008fb90; // coined; docs/systems/audio.md
Audio.Thread = 0x8008fbbc; // coined; docs/systems/audio.md
AudioProcInit = 0x8008fcd0; // string in the debug build 0x800e2b60 (debug 0x80099750)
Audio.DmaNew = 0x80090010; // coined; docs/systems/audio.md: returns dmaProc for ALDMANew
dmaProc = 0x8009001c; // string in the debug build 0x800e2b90 (debug 0x80099aa8); widens 8-bit samples with b << 8
AudioEngine.UpdateVoices = 0x800900e4; // AudioEngine.cs: the voice manager, a synthesizer player called every 1000 us
CreateAudioList = 0x800904bc; // string in the debug build 0x800e2bcc (debug 0x80099f54)
Audio.BuildTask = 0x800905c4; // coined; docs/systems/audio.md
Dcm.Init = 0x800906a0; // coined after ./src/dcm.cpp, which it cites; docs/formats/audio.md
AudioEngine.Play = 0x800907a4; // AudioEngine.cs
AudioEngine.SetVolume = 0x80090898; // AudioEngine.cs
AudioEngine.SetPan = 0x80090958; // AudioEngine.cs
AudioEngine.SetDuration = 0x80090a7c; // AudioEngine.cs
AudioEngine.IsPlaying = 0x80090aec; // AudioEngine.cs: returns the player state, 2 playing
AudioEngine.Stop = 0x80090b18; // AudioEngine.cs
AudioEngine.StopAll = 0x80090bd8; // AudioEngine.cs
AudioEngine.StepPlayers = 0x80090c94; // AudioEngine.cs: the sequencer, a synthesizer player called every 1000 us
Dcm.ReadU8 = 0x80091260; // coined; docs/formats/audio.md
Dcm.ReadU16LE = 0x80091268; // coined; docs/formats/audio.md
Dcm.ReadU32LE = 0x8009127c; // coined; unused
Input.Init = 0x80091420; // coined; the pad queues (0x78 bytes a pad, 0x1A00 of events)
MenuStick.Track = 0x800915d8; // MenuStick.cs
Input.PopEvent = 0x80092a44; // coined; docs/systems/combat.md: the next pad event (stick, pressed, held), 0 with none; Combat.Controls reads up to the frame's ticks of them
Pak.FromText = 0x80092b18; // coined; docs/systems/saves.md: (ASCII out, pak codes, count): a string from the pak's character codes (Pak.CharCodes, * for a code past its 0x42)
Pak.ToText = 0x80092b70; // coined; docs/systems/saves.md: (codes out, ASCII, count): the pak's character codes for a string, 0xF for a character it hasn't, 0 past the string's end
Rng.Seed = 0x80093180; // coined; docs/formats/particles.md: sets a generator's seed
Rng.Next = 0x80093198; // Lcg.cs, RandomExtensions.cs: one step of the generator at gGlobals + 0
Rng.Below = 0x800931c0; // RandomExtensions.Below: (n * next) >> 32
Rng.Range = 0x80093214; // RandomExtensions.Range: inclusive, the bounds swapped if need be
Rng.BelowSigned = 0x8009328c; // coined; docs/systems/audio.md: Rng.Below for a signed count, 0 for 0
Rng.RangeOn = 0x80093384; // coined; docs/formats/actors.md: RandomExtensions.Range on the stream whose seed a0 points to, inclusive, the bounds swapped if need be, equal bounds drawing nothing; ActorStateMachine.Tick and Advance roll Range(0, 99) with it
Rng.Float0To1 = 0x800933d4; // coined; docs/systems/wanderers.md
RandomExtensions.Float = 0x80093428; // IRandom.cs
ParticleHead.FloatRange = 0x80093470; // ParticleHead.cs: between two numbers in either order, no draw when equal
ParticleHead.Direction2 = 0x800934dc; // ParticleHead.cs: a random level direction of a length, two draws in a square, normalised
ParticleHead.Direction = 0x8009358c; // ParticleHead.cs: a random direction of a length, three draws in a cube, normalised
Scene.LoadTextureOp = 0x800938b0; // coined; docs/formats/textures.md
LoadTextureImage = 0x80093cac; // string debug 0x800e2e64 (debug 0x8009d7d8)
Scene.SetTextureTiles = 0x80094104; // coined; docs/systems/rendering.md
Borg5Scene.PivotRotate = 0x8009497c; // Borg5Scene.cs Borg5Transform.PivotRotate: mtxOp 1, scale then guRotateRPYF order (roll +0x14, pitch +0x10, heading +0x18, degrees x DAT_800d538c straight to sinf/cosf, no wrap), the translation the position +0x1c less the pivot +0x34 turned and scaled; debug 0x8009e4c4
Borg5Transform.CameraMatrix = 0x80094d7c; // coined; Borg5Scene.cs Borg5Transform.LookAt: (eye, at, up) to a camera-to-world matrix, X = up x look, Y = look x X, Z = eye - at, the row 3 the eye; keeps the last X if up x look is under 1e-6 (unlike guLookAtReflectF); the w column 0
Borg5Transform.Direction = 0x80094f80; // Borg5Scene.cs Borg5Transform.Direction: mtxOp 3, only the Z row set (a light's direction)
Borg5Transform.LookAt = 0x8009505c; // Borg5Scene.cs Borg5Transform.LookAt: mtxOp 4, a camera from Position and the angles (two guRotateRPYF), through Borg5Transform.CameraMatrix
Borg5Transform.Build = 0x800951cc; // coined; Borg5Scene.cs Borg5Transform.LocalMatrix: switch on mtxOp (byte +2) to the five builders, (transform, out matrix)
Borg5Scene.StoreWorld = 0x80095254; // coined; a node's world matrix to its record's +0xc0 or +0x80: rows 0-2 times the w column (elements 3, 7, 11), the w column cleared, row 3 kept
Mtx.CopyWOne = 0x80095300; // coined; copies a 4x4 float matrix and sets its w column (elements 3, 7, 11) to 1.0
Borg5Scene.WorldMatrices = 0x80095350; // coined; Borg5Scene.cs Borg5Scene.WorldMatrix: a node's local matrix (Borg5Transform.Build) times its parent's (Mtx.ConcatNode), stored to its record, then each child; clears transform flag 0x2 and sets 0x10
Borg5Scene.Evaluate = 0x800953ec; // coined; docs/formats/scenes.md: the whole transform tree, from the scene matrix (+0x88 if scene flag 0x4, else identity), then sets scene +0x2ac so Scene.Draw does it once a frame
Borg5Scene.EvaluateNodes = 0x80095518; // coined; the camera (transform 0, unless scene flag 0x40; its world matrix is copied to scene +0xc8, whose row 3 at +0xf8 is the eye), the lights, then each root node (transform flag 0x100) through Borg5Scene.WorldMatrices
Actor.Create = 0x800960e0; // coined; docs/formats/particles.md: makes an actor and starts its emitters for its request
ActorStateMachine.Finished = 0x80096504; // ActorStateMachine.cs: the scene's frame has reached its animation's length
ActorStateMachine.SetRequest = 0x80096530; // ActorStateMachine.cs: takes a request only if the state has a branch for it
ActorStateMachine.Tick = 0x80096570; // ActorStateMachine.cs: one tick of the state machine, returns whether it entered a state
ActorStateMachine.Advance = 0x800967a4; // coined; docs/systems/ui.md: steps an actor n ticks, taking branches and keeping its root's motion; resets the request after each
ActorParticles.Entered = 0x80096a38; // ActorParticles.cs: starts the scene's emitters for the actor's request
Scene.DrawActor = 0x80096ae4; // coined; docs/systems/rendering.md
Borg6Player.Restart = 0x80096bb4; // Borg6Player.cs: a track back to its first key, keeping the state the key leaves out
Borg6Target.Apply = 0x80096c04; // coined; Borg6Player.cs: by target type, a transform target (type 1) to Borg6Target.ApplyTransform, the rest to Borg6Target.ApplyFields; (target, weight)
Borg6Target.ApplyFields = 0x80096c50; // coined; docs/formats/animation.md: target types 0, 2 and 3, each driven float += value x weight; no animation uses them
Borg6Target.ApplyTransform = 0x80096ca0; // coined; docs/formats/animation.md: a type 1 target, bit k of the channel mask adds track value x weight to the k-th float from transform +0x10 (Rotation XYZ, Position XYZ, Scale XYZ); the differences go to run-time vectors nothing reads
Borg6Target.Clear = 0x80096de0; // coined; docs/formats/animation.md: zeroes a type 1 target's 12 run-time floats (record +0x140) and each driven float, before Borg6Target.Apply
ActorStateMachine.Restart = 0x80096ea8; // coined; docs/systems/audio.md: sets the scene's frame to 1 and rewinds its tracks
Borg6Player.Tick = 0x80096f14; // Borg6Player.cs: one tick of one target's tracks
Scene.Advance = 0x80097098; // coined; docs/systems/audio.md: adds the scene's step to its frame
Scene.Draw = 0x80097244; // coined; docs/systems/rendering.md
Scene.InitDrawState = 0x80097300; // coined; docs/systems/rendering.md
SetStaticMode = 0x800973b8; // string debug 0x800e2fd8 (debug 0x800a0f18); 1.0 has no copy
Scene.SetRenderMode = 0x80097618; // coined; docs/systems/rendering.md
Scene.LoadCamera = 0x80097a00; // coined; docs/systems/rendering.md: a camera scene's G_MTX projection load and perspective-norm word, keeping its eye (scene +0xf8) in Scene.CameraEye for billboards
BorgAnimDrawSceneRaw = 0x80097a90; // the debug build's string 0x800e3034 (debug 0x800a15fc): draws a scene's instructions; for a Borg2 list with the environment-map flag it calls guLookAtReflect (eye = the scene's +0xf8, at = the node's world position, up = +Y) and G_MOVEMEMs the result to the RSP's look-at slots
Screen.FillRect = 0x8009cbe8; // coined; docs/systems/weather.md: a rectangle on the 320 x 240 screen, the lightning's flash
Borg12Sequence.Parse = 0x8009d230; // Borg12Sequence.cs: the Borg12 fixup, which loads its Borg11s
BorgDCMModule.Free = 0x8009d2ec; // coined after ./src/n64BorgDCMModule.cpp, which it cites
BorgDCMModule.Get = 0x8009d440; // coined; docs/formats/audio.md
BorgDCMModule.Release = 0x8009d46c; // coined; docs/formats/audio.md
Borg11Sample.Parse = 0x8009d580; // Borg11Sample.cs: the Borg11 fixup
BorgSample.Free = 0x8009d59c; // coined; docs/formats/audio.md
BorgSample.Get = 0x8009d648; // coined; docs/formats/audio.md
BorgSample.Release = 0x8009d674; // coined; docs/formats/audio.md
Scene.SetCamera = 0x8009dfb0; // coined; docs/systems/rendering.md: SceneSetCameraLookAt's body: stores the eye at scene +0xf8..+0x100 and builds the camera matrices; only the centre chunk's scene, the pause menu's and 0x8001bba8's are given one
SceneSetCameraLookAt = 0x8009e1b4; // the debug build's string 0x800d8c10 (debug 0x800a7d64): (scene, eye, at) with up (0, 1, 0), to Scene.SetCamera
Scene.SetClipPlanes = 0x8009e234; // coined; docs/systems/rendering.md: (scene, near, far) into its camera's Borg3 (+0x18, +0x1c), which Borg5Scene.EvaluateNodes's guPerspectiveF reads (x16); RenderZones gives the zone engine's camera 0.1 and 125 in a cut-scene, else 1 and 180
Scene.UseZoneCamera = 0x8009e444; // coined; docs/systems/rendering.md: sets scene flag 0x40, so Borg5Scene.EvaluateNodes skips the scene's own camera and the draw keeps the projection already loaded; Zones.SetSceneColors sets it on every scene it colours
Scene.UseOwnCamera = 0x8009e454; // coined; docs/systems/rendering.md: clears scene flag 0x40; RenderZones clears it on the zone engine's camera scene before loading its projection
Scene.SetStep = 0x8009e4e0; // coined; docs/systems/audio.md: how far the scene's frame advances each tick (0 holds it)
Scene.SetFogColor = 0x8009e5b4; // coined; docs/systems/rendering.md: (scene, r, g, b, a), each clamped to 0..255, into +0x214..+0x217, which Scene.SetRenderMode hands G_SETFOGCOLOR
Scene.SetFogRange = 0x8009e61c; // coined; docs/systems/rendering.md: (scene, min, max) on the 0..1000 scale, clamped, kept apart by one, into +0x20c and +0x210, which Scene.SetRenderMode turns into gSPFogPosition's 128000/(max-min) and (500-min)*256/(max-min)
Scene.SetTint = 0x8009e71c; // coined; docs/systems/rendering.md: the prim colour's floats at +0x1fc
Scene.ResetLights = 0x8009e778; // coined; docs/systems/rendering.md: room for 7, a white ambient, none yet, the engine-lit bit
SceneSetMaxDynamicDirLights = 0x8009e7d0; // the debug build's string 0x800e349c (debug 0x800a8380)
Scene.LightBrightness = 0x8009e800; // coined; docs/systems/rendering.md: r*r + g*g + b*b
SceneLights.Add = 0x8009e838; // SceneLights.Add
Scene.SetAmbient = 0x8009eaa4; // coined; docs/systems/rendering.md
Vec2.Length = 0x800a0f80; // coined; docs/systems/ui.md: the length of two floats
Vec2.Sub = 0x800a0fe4; // coined; (out, a, b)
Vec3.Sub = 0x800a1008; // coined; (out, a, b)
Vec3.Add = 0x800a10a4; // coined; (out, a, b)
Vec2.Distance = 0x800a10d8; // coined; |a - b| in x, z
Vec3.Distance = 0x800a1108; // coined; |a - b|
Vec3.Dot = 0x800a1158; // coined; 
Vec2.Normalize = 0x800a11ec; // coined; normalises an (x, z) pair, its length at least 1e-6
Vec3.Normalize = 0x800a125c; // coined; returns the length, floored at 1e-6
Facing.Turn = 0x800a13f8; // the port's (Facing.Turn); docs/systems/combat.md: (heading, goal, max angle): 1 and the goal when within sin(angle), else rotates by the angle toward the nearer side
Vec2.Rotate = 0x800a16f0; // coined; (v, sin, cos): (c x + s z, c z - s x)
Vec2.Copy = 0x800a17b8; // coined; (a, b)
Vec3.Copy = 0x800a17cc; // coined; (a, b)
Vec2.Scale = 0x800a1840; // coined; (v, s)
Vec3.Scale = 0x800a1860; // coined; (v, s)
Vec2.Set = 0x800a18c4; // coined; (v, x, z)
Vec3.Set = 0x800a18d0; // coined; (v, x, y, z)
Vec2.Cosine = 0x800a18f8; // coined; (position, aim point, target): the cosine of the angle between the aim and the target directions, (2 - |u - v|^2) / 2
Vec2.SignedSine = 0x800a19e0; // coined; the sine of that angle, signed by which rotation of the aim by +-sin lands nearer the target (TargetSet.OrderByAngle's key)
Mtx.ConcatNode = 0x800a2378; // coined; a child's world matrix: out = local x parent for the 3x3 and row 3, with the local row 3 scaled per axis by the parent's w column and added to the parent's row 3; out's w column the product of the two
Collision.SweepBlocked = 0x800a42e8; // coined; SpherePhysics.Sweep stands in: a sphere swept against a chunk's triangles, see-through ones skipped if asked
Camera.SetEye = 0x800a6470; // coined; the eye at +0 and +0x18
Camera.SetTarget = 0x800a64b4; // coined; the aim at +0xC and +0x24
Camera.Init = 0x800a64f8; // coined; clears the camera (0x11c bytes), LookXZ (1, 0)
FollowCamera.Orient = 0x800a6628; // FollowCamera.Orient (camera.cpp): +0x38 = target - eye, LookXZ (+0x30) its X and Z normalised, as camera objects and the script cameras move
FollowCamera.EaseToward = 0x800a6688; // coined; a -= (a - b) / rate on each axis, once
FollowCamera.Approach = 0x800a66d8; // FollowCamera.Approach
FollowCamera.Anchor = 0x800a67d4; // coined; the orbit's fixed point: (p.x, p.y + Height, p.z)
FollowCamera.StepInterior = 0x800a69d8; // FollowCamera.Interior.cs: Camera::Mode1 with its ten numbers and two flags (combat passes its own)
FollowCamera.Step = 0x800a6e64; // FollowCamera.cs: Camera::Mode0, the outdoor follow
FollowCamera.Orbiting = 0x800a72bc; // FollowCamera.cs: the R orbit, which Mode0 and Mode1 both call (the decomp's FUN_800b0fac)
Camera.SetMode = 0x800a7664; // coined; camera.cpp: the mode at +0x46, the last at +0x44; ProcessVoxelCamera sets 2, which does nothing
FollowCamera.Frame = 0x800a77b4; // FollowCamera.cs
Particle.Reset = 0x800a7a90; // Particle.cs
Particles.InitParticlePool = 0x800a7af0; // coined; docs/formats/particles.md
Particles.ResetEmitter = 0x800a7b88; // coined; docs/formats/particles.md
Particles.InitEmitterPool = 0x800a7c38; // coined; docs/formats/particles.md
Particles.LoadTextures = 0x800a7cbc; // coined; docs/formats/particles.md: the particle textures (partTextInds)
Particles.FreeTextures = 0x800a7d94; // coined; docs/formats/particles.md
Particles.FreeHead = 0x800a7f40; // coined; docs/formats/particles.md: FreeZoneEngine's
ParticleHead.ApplyVector = 0x800a7fa0; // ParticleHead.cs: a particle's vector added to its target or its whole list
ParticleHead.StepParticle = 0x800a82fc; // ParticleHead.cs: moves by the velocity, bounces, applies the vector
ProcessAndRenderParticleHead = 0x800a842c; // the debug build's string 0x800e3a54 (debug 0x800b216c): the pool's frame, ParticleHead.Frame in the port
ParticleHead.Link = 0x800a8864; // ParticleHead.cs: after the emitter's head; never the sentinel
ParticleHead.Unlink = 0x800a88f0; // ParticleHead.cs
ParticleHead.AllocSlot = 0x800a895c; // ParticleHead.cs: the sentinel when the pool is full
ParticleHead.AllocParticle = 0x800a8a00; // ParticleHead.cs
ParticleHead.AllocModifier = 0x800a8a50; // ParticleHead.cs: flags 0xC00A
ParticleHead.FreeParticle = 0x800a8ab0; // ParticleHead.cs
ParticleHead.MoveParticle = 0x800a8b14; // ParticleHead.cs: unlinks a particle and links it after another emitter's head, freeing it if that emitter has none
Particles.KillEmitter = 0x800a8dc0; // coined; docs/formats/particles.md: frees an emitter without waiting
ParticleHead.KillActive = 0x800a8e04; // ParticleHead.cs: TeleportPlayer's, every emitter with life left
Particles.InverseLife = 0x800a8e6c; // coined; docs/formats/particles.md: 1 / (a particle's life - 1), the explosion's burst's fade
Particles.SetColor = 0x800a8e8c; // coined; docs/formats/particles.md
Particles.SetPosition = 0x800a8ea4; // coined; docs/formats/particles.md
Particles.SetVelocity = 0x800a8eb4; // coined; docs/formats/particles.md
Particles.SetScale = 0x800a8ec4; // coined; docs/formats/particles.md
Particles.SetVector = 0x800a8ed0; // coined; docs/formats/particles.md
Particles.SetParticleFlags = 0x800a8ee8; // coined; docs/formats/particles.md
Particles.ClearParticleFlags = 0x800a8ef8; // coined; docs/formats/particles.md
Particles.SetEmitterFlags = 0x800a8f10; // coined; docs/formats/particles.md
Particles.ClearEmitterFlags = 0x800a8f20; // coined; docs/formats/particles.md
Particles.SetFloor = 0x800a8f38; // coined; docs/formats/particles.md: the bounce's height, with emitter flag 0x4000
Particles.ClearFloor = 0x800a8f58; // coined; docs/formats/particles.md
Particles.DrawPrologue = 0x800a8f74; // coined; docs/systems/weather.md: the camera-facing matrix (guAlign of the look) and the draw state
Particles.DrawMode = 0x800a91dc; // coined; docs/systems/weather.md: the geometry mode and depth source by pass
Particles.InitQuadVertex = 0x800a927c; // coined; docs/formats/particles.md
ParticleHead.Draw = 0x800a92fc; // ParticleHead.cs, ParticlesView.cs: a particle's square
Particles.AttachedScene = 0x800a9828; // coined; docs/formats/particles.md: an emitter's own scene or one attached at run time
ParticleHead.SpawnFromRecord = 0x800a99e8; // ParticleHead.cs: a particle from a Borg5 emitter
ParticleHead.Start = 0x800a9df8; // ParticleHead.cs: a Borg5 emitter on an actor
ParticleHead.Stop = 0x800aa17c; // ParticleHead.cs: every emitter of a scene, with its particles
Particles.SceneHasEmitters = 0x800aa210; // coined; docs/formats/particles.md
FontEngine.Init = 0x800aa2ec; // coined, in ./src/fontengine.cpp (debug string 0x800e3c20); the printer with its font table, colour 225, 225, 225, 255 and font 0
FontEngine.AddFont = 0x800aa474; // coined, in ./src/fontengine.cpp; (printer, Borg8, rows, columns): the cell size from the sheet's
Font.Select = 0x800aa5d4; // coined; (printer, Borg8): the font to print in, 0x1C main or 0x1D slim
Font.DrawString = 0x800aaa28; // coined; a glyph a cell, a newline back to x and down a line, in the printer's colour
Font.StringWidth = 0x800ab308; // coined; docs/systems/ui.md: the glyph advances × scale, no wrapping
Font.WrappedHeight = 0x800ab494; // coined; docs/systems/ui.md: lines × (line height × scale + 2) of a string wrapped between two x
WidgetManager.Update = 0x800ad10c; // coined, in widgethandler.cpp; docs/systems/pause-menu.md: runs each widget's state once a call, whatever the delta
WidgetManager.Input = 0x800ad2d4; // coined, in widgethandler.cpp; docs/systems/pause-menu.md: hands input to the top widget only while it's open (state 3)
WidgetManager.Add = 0x800ad320; // coined, in widgethandler.cpp; docs/systems/ui.md: adds a widget as the newest
WidgetManager.Remove = 0x800ad3e4; // coined, in widgethandler.cpp; docs/systems/ui.md: takes a widget out
WidgetManager.Draw = 0x800ad450; // coined, in widgethandler.cpp; docs/systems/ui.md: draws each widget but finished ones, with the screen's bounds
Widget.Init = 0x800ad510; // coined; docs/systems/ui.md
Widget.SetPosition = 0x800ad61c; // coined; x at +0x60 and y at +0x62
Widget.SetColor = 0x800ad648; // coined; red, green, blue and alpha at +0x58 to +0x5b
Widget.SetClip = 0x800ad6c8; // coined; (top, left, right, bottom) into +0x68, +0x64, +0x66 and +0x6a
MenuStick.Step = 0x800ad708; // MenuStick.cs
Widget.StepChildren = 0x800ada64; // coined; docs/systems/ui.md: calls each child's step (vtable +0x2c) once, children chained by +0x4c
Widget.Update = 0x800adab0; // coined; docs/systems/ui.md: a widget's step by its state, the fades among them
Widget.SetState = 0x800adc40; // coined; docs/systems/ui.md: state 3 is open, the only one that takes input
Widget.CallA = 0x800ade34; // coined; docs/systems/ui.md: calls the widget's A handler
Widget.CallB = 0x800ade68; // coined; docs/systems/ui.md: calls the widget's B handler
WidgetClipText.Create = 0x800ae040; // coined after ./src/widgetcliptext.cpp (debug string 0x800e40a0); a text widget: colour, scale 1.0, wrap range 0 to 320
WidgetClipText.Destroy = 0x800ae168; // coined
WidgetClipText.Draw = 0x800ae1e0; // coined; the string at its x and y in its colour times ScreenFade.Alpha, cut to its bounds
WidgetClipText.Width = 0x800ae4d0; // coined; Font.StringWidth, at most 320
WidgetClipText.Height = 0x800ae548; // coined; Font.WrappedHeight
WidgetShadowText.Create = 0x800ae690; // coined after ./src/widgetshadowtext.cpp, debug string 0x800e41f0 (debug 0x800b8580)
WidgetShadowText.Draw = 0x800ae858; // coined; docs/systems/ui.md: shadow pass if enabled, then the text at full alpha
WidgetShadowText.Height = 0x800aee40; // coined; docs/systems/ui.md
WidgetText.Create = 0x800aef90; // coined after ./src/widgettext.cpp, debug string 0x800e4310 (debug 0x800b8e80)
WidgetText.Draw = 0x800af108; // coined; docs/systems/ui.md
WidgetText.Height = 0x800af434; // coined; docs/systems/ui.md: wrapped height
WidgetImage.Create = 0x800af570; // coined; docs/systems/ui.md: the image widget's constructor
WidgetImage.Draw = 0x800af674; // coined; docs/systems/ui.md: cuts its image to the bounds it's given, its colour times the screen's fade
Widget.Create = 0x800afa70; // coined; docs/systems/ui.md
WidgetScrollMenu.Create = 0x800afb40; // coined after ./src/widgetscrollmenu.cpp, debug string 0x800e45c0 (debug 0x800b9a30)
WidgetScrollMenu.Destroy = 0x800afcc4; // coined; docs/systems/ui.md
WidgetScrollMenu.Draw = 0x800afda8; // coined; docs/systems/ui.md: draws each child, then the base
WidgetScrollMenu.Step = 0x800afe88; // coined; docs/systems/ui.md: the pulse and the rows' layout
WidgetScrollMenu.AddChild = 0x800b0324; // coined; docs/systems/ui.md: copies the menu's bounds to the child, appends it
WidgetScrollMenu.Up = 0x800b0480; // coined; docs/systems/ui.md: cursor to the previous child, wrapping first to last
WidgetScrollMenu.Down = 0x800b0548; // coined; docs/systems/ui.md: cursor to the next child, wrapping last to first
WidgetScrollMenu.Left = 0x800b061c; // coined; docs/systems/ui.md: returns 0
WidgetScrollMenu.Right = 0x800b0624; // coined; docs/systems/ui.md: returns 0
WidgetScrollMenu.Selected = 0x800b062c; // coined; docs/systems/ui.md: the child at the cursor, or 0
ScrollArrows.Create = 0x800b1640; // coined; docs/systems/ui.md: (widget, list, up image, down image, height): the arrows a scroll list shows, their fade step 20, both from alpha 0
ScrollArrows.Step = 0x800b1908; // coined; docs/systems/ui.md: fades the up arrow in while the list's first row is above its clip and the down arrow while its last row's foot is below it, 20 a step
WidgetText.GetBuffer = 0x800b1c00; // coined; docs/systems/ui.md: a text widget's string buffer
Widget.SetWrap = 0x800b1e18; // coined; docs/systems/ui.md: a text's wrap range (text types set their state's x range, others the bounds)
Widget.SetSpacing = 0x800b2098; // coined; docs/systems/ui.md: by the widget's kind, a scroll menu's gap under each row (kind 8, +0x40's +0x22), or a byte or short of kinds 9 and 11; the held menus' 3
WidgetScrollMenu.SetPulse = 0x800b22e4; // coined; docs/systems/ui.md: (from RGBA, to RGBA, frames) for the cursor's colour
WidgetScrollMenu.Clear = 0x800b24e4; // coined; docs/systems/ui.md: frees the children, count and cursor to 0; the y offset stays
Widget.SetAlpha = 0x800b2928; // coined; PopupFade.cs: one alpha set on a widget and all its children
Widget.Move = 0x800b2978; // coined; (dx, dy) to a widget's position, its clip box and a text's wrap range, and to every child
Widget.CreateImageAt = 0x800b3074; // coined; docs/systems/ui.md: (parent, image, x, y): an image widget added as a child
Widget.CreateImageBoxItem = 0x800b310c; // coined; docs/systems/ui.md: Widget.CreateImageAt sized to the rectangle, inclusive
WidgetScrollMenu.Build = 0x800b31a4; // coined; docs/systems/ui.md: Create plus position, bounds, colour and parent
qsort = 0x800b3b64; // library: (base, n, size, cmp): game-side quicksort with a temporary swap buffer, swaps when cmp returns 1
__udivdi3 = 0x800b3c30; // library: unsigned 64-bit divide on 32-bit halves with a leading-zero table (libgcc-style copy used by game code)
osAiGetLength = 0x800b41f0; // library: returns AI_LEN_REG (0xA4500004)
osAiSetFrequency = 0x800b4200; // library: writes AI_DACRATE/AI_BITRATE (0xA4500010/14) from the video clock, rejects dacRate < 132
osAiSetNextBuffer = 0x800b4320; // library: writes AI_DRAM_ADDR/AI_LEN, 0x2000 end-of-buffer workaround, checks AI busy
__osAiDeviceBusy = 0x800b43c0; // library: AI_STATUS (0xA450000C) full bit
guAlignF = 0x800b43e0; // library: a float matrix turning +Z to face away along a direction, rolled by an angle (its third row is the direction negated)
guAlign = 0x800b45ac; // library: guAlignF converted with guMtxF2L
bzero = 0x800b4780; // library: zeroes n bytes, word/32-byte unrolled loop
osContStartQuery = 0x800b4820; // library: packs a controller-status request (__osPackRequestData(0)), SI DMA write then read
osContGetQuery = 0x800b48a0; // library: calls __osContGetInitData(&pattern, status)
osContStartReadData = 0x800b48c0; // library: packs a read-buttons request (__osPackReadData), SI DMA
osContGetReadData = 0x800b4948; // library: unpacks button/stick bytes from the SI buffer (0x800e6bb0) into the pad array
__osPackReadData = 0x800b49e4; // library: fills the SI buffer with 0xff010401 command blocks (read buttons)
osContInit = 0x800b4aa0; // library: osGetTime vs 0.5 s, osSetTimer, __osPackRequestData, SI DMA, __osContGetInitData
__osContGetInitData = 0x800b4c3c; // library: unpacks status/pattern from the SI buffer
__osPackRequestData = 0x800b4cf0; // library: fills the SI buffer with 0xff0103<cmd> command blocks
osContSetCh = 0x800b4db0; // library: clamps the channel count to 4
cosf = 0x800b4e10; // library: libm cosf: range reduction by 2/pi, polynomial
osCreateMesgQueue = 0x800b4f60; // library: sets mtqueue/fullqueue to the empty-thread list, msgCount, msg buffer
osCreateThread = 0x800b4f90; // library: fills OSThread (id, priority, fp, entry, stack top, context), links into active queue
__osExceptionPreamble = 0x800b5060; // library: 4-word stub (lui/addiu/jr k0) copied to 0x80000000/80/100/180 by __osInitialize_common
__osException = 0x800b5134; // library: exception entry the preamble jumps to (reads Cause, saves k0/k1, tests PI, dispatches)
__osEnqueueAndYield = 0x800b5b64; // library: saves Status/regs/FPCSR into the running thread's context, enqueues, falls into dispatch
__osEnqueueThread = 0x800b5c6c; // library: priority-ordered insert into a thread queue
__osPopThread = 0x800b5cb4; // library: pops the head of a thread queue
__osDispatchThread = 0x800b5cc4; // library: loads next thread context, sets Status/EPC/MI mask
__osCleanupThread = 0x800b5e40; // library: calls osDestroyThread(NULL)
osPiRawWriteIo = 0x800b5ef0; // library: waits PI_STATUS (0xA4600010) idle, stores word
osPiRawReadIo = 0x800b5f24; // library: waits PI_STATUS idle, loads word
osDestroyThread = 0x800b85a0; // library: unlinks thread from the active list, removes from its queue, redispatches if running
__osContRamRead = 0x800b8880; // library: SI request cmd 3 (read) with address CRC and data CRC, retries on error
bcopy = 0x800b8a70; // library: overlap-safe byte/word copy (src, dst, len)
__osContRamWrite = 0x800b8d90; // library: SI request cmd 2 (write) with address CRC and data CRC
__osContAddressCrc = 0x800b8fa0; // library: 5-bit CRC, polynomial 0x15, of an 11-bit pak address
__osContDataCrc = 0x800b900c; // library: 8-bit CRC, polynomial 0x85, of 32 data bytes
osGetTime = 0x800b9140; // library: reads the 64-bit time base with interrupts off plus Count since last tick
osGetCount = 0x800b91d0; // library: mfc0 Count
alHeapDBAlloc = 0x800b91e0; // library: (file, line, heap, num, size) 16-byte aligned bump allocator on an audio heap
alHeapInit = 0x800b9230; // library: aligns base to 16, sets length, cur pointer
__osInitialize_common = 0x800b9270; // library: copies exception stubs, sets cache/TLB, reads osTvType (0x80000300) to pick the video clock, AI init
__osGetCause = 0x800b9670; // library: mfc0 Cause
__osGetSR = 0x800b9680; // library: mfc0 Status
__osDisableInt = 0x800b9710; // library: clears Status.IE, returns old IE
__osRestoreInt = 0x800b9780; // library: ORs the saved IE back into Status
osInvalDCache = 0x800b97a0; // library: cache ops 0x15/0x11 over the range, whole D-cache index invalidate when >= 0x2000
osInvalICache = 0x800b9850; // library: cache op 0x10 over the range, index invalidate when >= 0x4000
guLookAtReflectF = 0x800b9b90; // library: float lookat matrix plus 8-bit LookAt right/up vectors
guLookAtReflect = 0x800ba108; // library: guLookAtReflectF then guMtxF2L
osMapTLBRdb = 0x800ba180; // library: writes TLB entry 31 for 0xC0000000
__osMotorAccess = 0x800ba1e0; // library: writes 32 bytes of 0x80 or 0 to the pak motor block over SI
osMotorInit = 0x800ba324; // library: selects pak banks 0xFE/0x80, probes, sets status 8 (motor initialised)
guMtxCatF = 0x800ba570; // library: 4x4 float matrix multiply
guMtxXFMF = 0x800ba64c; // library: transforms a point by a float matrix
guMtxF2L = 0x800ba700; // library: float matrix to fixed-point Mtx (int part / frac part halves, *65536)
guMtxL2F = 0x800ba798; // library: fixed-point Mtx to float, *1/65536
guMtxIdentF = 0x800ba840; // library: float identity matrix
guMtxIdent = 0x800ba890; // library: identity, converted with the guMtxF2L loop
guNormalize = 0x800ba980; // library: divides (x,y,z) by sqrt of the sum of squares
guPerspectiveF = 0x800baa90; // library: float perspective matrix (fovy in degrees, aspect, near, far, scale) plus perspNorm
guPerspective = 0x800bac40; // library: guPerspectiveF then guMtxF2L
osPfsAllocateFile = 0x800bae10; // library: (pfs, company, game, name, ext, nbytes, &file_no): inode page allocation
__osPfsDeclearPage = 0x800bb11c; // library: links free inode pages for a new file
__osSumcalc = 0x800bb240; // library: 16-bit sum of bytes
__osIdCheckSum = 0x800bb274; // library: sum and inverted sum over 14 u16 words
__osRepairId = 0x800bb2b8; // library: rebuilds the pak id block, tests every bank
__osCheckId = 0x800bb5a4; // library: reads id copies 1/3/4/6, verifies checksums
__osGetId = 0x800bb708; // library: reads and validates the id block, fills pfs fields
__osCheckPackId = 0x800bb8d4; // library: compares stored id with pfs id (bcmp)
__osPfsRWInode = 0x800bb98c; // library: read/write one inode page with sum and backup copy, cached
bcmp = 0x800bbcd0; // library: word/byte compare of two buffers
osPfsDeleteFile = 0x800bbde0; // library: (pfs, company, game, name, ext): frees inode chain, clears directory entry
__osPfsReleasePages = 0x800bbf8c; // library: walks an inode chain marking pages free
osPfsFileState = 0x800bc000; // library: (pfs, file_no, state*): reads a directory entry
osPfsFreeBlocks = 0x800bc1a0; // library: counts free inode pages * 256
__osPfsGetStatus = 0x800bc2b0; // library: requests controller status, decodes pak/error bits into a PFS error
__osPfsRequestData = 0x800bc3a0; // library: fills the SI buffer with a 0xff0103<cmd> request
__osPfsGetInitData = 0x800bc434; // library: decodes the status reply
osPfsInitPak = 0x800bc4c0; // library: (mq, pfs, channel): status, id, inode and directory geometry, calls osPfsChecker
__osPfsCheckRamArea = 0x800bc6b8; // library: writes 0..31 to bank 0, reads back, bcmp
osPfsChecker = 0x800bc790; // library: rebuilds and repairs inode tables (uses corrupted_init, corrupted)
corrupted_init = 0x800bcbf0; // library: builds the page-use bitmap for osPfsChecker
corrupted = 0x800bcd48; // library: tests a directory entry's pages for a double claim
osPfsIsPlug = 0x800bceb0; // library: request status for all channels, returns the pak-present bit pattern
osPfsReadWriteFile = 0x800bd190; // library: (pfs, file_no, flag, offset, size, buf): 32-byte-block inode chain read/write
osPfsFindFile = 0x800bd630; // library: (pfs, company, game, name, ext, &file_no): scans directory
__osPfsSelectBank = 0x800bd7f0; // library: writes the bank byte over 32 bytes at pak address 0x400
osPiStartDma = 0x800bd860; // library: (mb, priority, dir, devAddr, dramAddr, size, mq): queues an OSIoMesg to the PI manager
osJamMesg = 0x800bd910; // library: (mq, msg, flag): inserts at the head of the queue
osPiGetCmdQueue = 0x800bda50; // library: returns the PI manager's command queue if started
osCreatePiManager = 0x800bda70; // library: creates the PI manager threads, sets up the access queue and DMA handlers
__osDevMgrMain = 0x800bdd20; // library: PI manager thread: dispatches OSIoMesg types 0xb/0xc (DMA), 0xf/0x10 (EPi DMA)
__osEPiRawStartDma = 0x800be0e0; // library: waits PI idle, programs domain latency/pulse regs, PI_DRAM_ADDR/CART_ADDR/RD_LEN or WR_LEN
__osEPiRawReadIo = 0x800be2d0; // library: programs domain regs, reads a word at devAddr|0xA0000000
__osEPiRawWriteIo = 0x800be440; // library: programs domain regs, writes a word at devAddr|0xA0000000
osGetThreadPri = 0x800be5b0; // library: returns thread priority, 0 means the running thread
__osPiCreateAccessQueue = 0x800be5d0; // library: 1-slot queue primed with one message
__osPiGetAccess = 0x800be624; // library: creates the queue if needed then osRecvMesg
__osPiRelAccess = 0x800be690; // library: osSendMesg back to the access queue
__osPiRawStartDma = 0x800be6c0; // library: PI_DRAM_ADDR/PI_CART_ADDR from osRomBase (0x80000308), RD_LEN or WR_LEN
osRecvMesg = 0x800be860; // library: (mq, msg, flags): dequeues, blocks via __osEnqueueAndYield, wakes a sender
__osResetGlobalIntMask = 0x800be990; // library: clears bits in the global interrupt mask with interrupts off
__osGetActiveQueue = 0x800bf5c0; // library: returns the active thread list head
guRotateRPYF = 0x800c1660; // library: roll/pitch/heading (degrees to radians) rotation matrix
guRotateRPY = 0x800c17e8; // library: guRotateRPYF then guMtxF2L
guScaleF = 0x800c1980; // library: float scale matrix
guScale = 0x800c19e0; // library: scale matrix then guMtxF2L
osScCreateScheduler = 0x800c1a60; // library: sched.c sample code: creates the scheduler thread and VI/RSP/RDP event queues
osScAddClient = 0x800c1ba8; // library: sched.c sample code: pushes a client on the scheduler's list with interrupts off
osScRemoveClient = 0x800c1c00; // library: sched.c sample code: unlinks a client from the scheduler's list
osScGetCmdQ = 0x800c1c90; // library: sched.c sample code: returns the scheduler's command queue
osSendMesg = 0x800c25c0; // library: (mq, msg, flags): enqueues, blocks when full, wakes a receiver
osSetEventMesg = 0x800c26f0; // library: stores (queue, msg) per event slot in the event table
__osSetFpcCsr = 0x800c27a0; // library: cfc1/ctc1 $31, returns old
__osSetGlobalIntMask = 0x800c27b0; // library: ORs bits into the global interrupt mask with interrupts off
osSetIntMask = 0x800c27f0; // library: updates Status IM bits and MI_INTR_MASK, returns the old mask
__osSetSR = 0x800c2890; // library: mtc0 Status
osSetThreadPri = 0x800c28a0; // library: changes priority, requeues, may yield
osSetTimer = 0x800c2970; // library: (timer, countdown, interval, mq, msg): inits OSTimer, __osInsertTimer
__osSiCreateAccessQueue = 0x800c2a10; // library: 1-slot queue primed with one message
__osSiGetAccess = 0x800c2a64; // library: creates the queue if needed then osRecvMesg
__osSiRelAccess = 0x800c2ad0; // library: osSendMesg back to the access queue
sinf = 0x800c2b00; // library: libm sinf: exponent test, polynomial
__osSiRawStartDma = 0x800c2ca0; // library: SI_DRAM_ADDR then SI_PIF_ADDR_WR64B/RD64B (0xA4800000/04/10), writes back cache first
__osSiRawReadIo = 0x800c2d50; // library: reads a word at addr|0xA0000000 when SI is idle
__osSiDeviceBusy = 0x800c2da0; // library: SI_STATUS (0xA4800018) & 3
__osSiRawWriteIo = 0x800c2dc0; // library: writes a word at addr|0xA0000000 when SI is idle
alInit = 0x800c2e10; // library
alClose = 0x800c2e3c; // library
alLink = 0x800c2e6c; // library: inserts an ALLink after another
alUnlink = 0x800c2e8c; // library: removes an ALLink from its list
__osSpRawReadIo = 0x800c2ec0; // library: reads a word at addr|0xA0000000 when SP is idle
__osSpDeviceBusy = 0x800c2f10; // library: SP_STATUS (0xA4040010) & 0x1c
__osSpRawWriteIo = 0x800c2f30; // library: writes a word at addr|0xA0000000 when SP is idle
sprintf = 0x800c2f80; // library: calls _Printf with proutSprintf, writes the terminating NUL
proutSprintf = 0x800c2fd8; // library: _Printf's sprintf output callback: copies the chunk, returns dst + n
__osSpSetPc = 0x800c3010; // library: writes SP_PC (0xA4080000) if the RSP is halted
osSpTaskLoad = 0x800c3040; // library: copies the OSTask to a local buffer, converts pointers to physical
osSpTaskStartGo = 0x800c324c; // library: waits SP idle then SP_STATUS = 0x125 (clear halt/broke/intr)
__osSpRawStartDma = 0x800c3280; // library: SP_MEM_ADDR/SP_DRAM_ADDR/RD_LEN or WR_LEN (0xA4040000..0C)
__osSpSetStatus = 0x800c3310; // library: writes SP_STATUS_REG
osSpTaskYield = 0x800c3320; // library: __osSpSetStatus(0x400), sets the yield signal
osSpTaskYielded = 0x800c3340; // library: reads SP_STATUS, tests the yielded bit, clears the signal
__osSpGetStatus = 0x800c3390; // library: returns SP_STATUS_REG
sqrtf = 0x800c33a0; // library: sqrt.s
osStartThread = 0x800c33b0; // library: moves a stopped thread to the run queue, may yield
osStopThread = 0x800c34d0; // library: removes a thread from its queue, state 4
strchr = 0x800c3590; // library: scans for a byte, returns pointer (also matches the terminator)
strlen = 0x800c35c8; // library: counts bytes to NUL
memcpy = 0x800c35ec; // library: forward byte copy, returns dest
alSynAddPlayer = 0x800c3620; // library: (drvr, client): pushes the client on drvr->head with interrupts masked, samplesLeft = curSamples
alSynAllocVoice = 0x800c3670; // library
alSynDelete = 0x800c3850; // library: clears drvr->head
alSynRemovePlayer = 0x800c3860; // library: (drvr, client): unlinks the client from drvr->head with interrupts masked
alSynSetPan = 0x800c3900; // library
alSynSetPitch = 0x800c3990; // library
alSynSetVol = 0x800c3a20; // library: (drvr, voice, vol, delta): posts a volume update, delta via _timeToSamples
alSynStartVoiceParams = 0x800c3ae0; // library: 8 args (voice, wave, pitch, vol, pan, fxmix clamped 0x7f, t): posts start with all params
alSynStopVoice = 0x800c3be0; // library
alSynNew = 0x800c3c60; // library: builds the synth: heap allocs, then bus/save filters and per-voice alLoadNew/alResampleNew/alEnvmixerNew
alAudioFrame = 0x800c3f2c; // library: (cmdList, &cmdLen, outBuf, outLen): runs the filter chain per frame, builds the RSP audio command list
__allocParam = 0x800c40dc; // library: pops an ALParam from the driver's free list
__freeParam = 0x800c4108; // library: pushes an ALParam back on the free list
_collectPVoices = 0x800c4120; // library: moves lame voices back to the free list (alUnlink/alLink)
_freePVoice = 0x800c4174; // library: alUnlink + alLink onto the free list
_timeToSamplesNoRound = 0x800c41b4; // library: usec * outputRate / 1e6 as a double, no round-down to 16
_timeToSamples = 0x800c41fc; // library: same, rounded down to a multiple of 16
__nextSampleTime = 0x800c4248; // library: scans the player list for the smallest samplesLeft
alAdpcmPull = 0x800c42a0; // library: emits A_LOADADPCM (0x0b000000) and A_ADPCM decode commands per frame
alRaw16Pull = 0x800c46b4; // library: DMA callback in bytes (samples*2), 16-bit PCM load path
alRaw8Pull = 0x800c4a34; // library, modified: an 8-bit copy of alRaw16Pull; not an SDK name
alLoadParam = 0x800c4dbc; // library: ADPCM/raw loader filter param handler (AL_FILTER_FREE_VOICE = 4 case)
alFxNew = 0x800c5314; // library: picks reverb tables by config type, alFilterNew(type 5), sets alFxPull/alFxParamHdl
alEnvmixerNew = 0x800c57ac; // library: alFilterNew(type 4), allocs 0x50 bytes (ENVMIX_STATE)
alLoadNew = 0x800c5864; // library: alFilterNew(type 0) with 2x0x20 heap blocks and a DMA callback
alResampleNew = 0x800c5914; // library: alFilterNew(type 1) with a 0x20-byte state block
alSaveNew = 0x800c5a58; // library: alFilterNew(type 3), dramout = 0, first = 1
alEnvmixerPull = 0x800c5aa0; // library: per-frame loop over the param update list, pulls its source filter
alEnvmixerParam = 0x800c5fa0; // library: AL_FILTER_ADD_UPDATE (3) appends to the update list
alFilterNew = 0x800c6750; // library: (filter, handler, setParam, type): clears next/source, stores the three fields
alResamplePull = 0x800c68e0; // library: resampler pull handler
alResampleParam = 0x800c6acc; // library: switch over filter param types 1..9 for the resampler
alFxPull = 0x800c6b90; // library: reverb pull handler
alFxParam = 0x800c6f04; // library: AL_FILTER_SET_SOURCE (1) stores the source
alFxParamHdl = 0x800c6f18; // library: reverb parameter switch (index / 8)
alSavePull = 0x800c7730; // library: calls the source's pull, then emits the save command
alSaveParam = 0x800c77d8; // library: stores param types 1 and 6
alSynAllocFX = 0x800c7800; // library: (drvr, bus, config, heap): alFxNew + hooks the effect into a bus
__osTimerServicesInit = 0x800c78e0; // library: zeroes the 64-bit current time, base counter, VI interrupt count, empties the timer list
__osTimerInterrupt = 0x800c7934; // library: pops expired timers from the sorted list and sends their messages
__osSetTimerIntr = 0x800c7b18; // library: writes Compare for the next timer from Count
__osInsertTimer = 0x800c7b78; // library: sorted 64-bit insert into the timer list
__osSetCompare = 0x800c7c80; // library: mtc0 Compare
guTranslateF = 0x800c7c90; // library: float translation matrix
guTranslate = 0x800c7ce4; // library: translation matrix then guMtxF2L
osUnmapTLBAll = 0x800c7d60; // library: loop writing 31 TLB entries with tlbwi
osViBlack = 0x800c7db0; // library: sets or clears the black flag (0x20) in the next VI context
__osViInit = 0x800c7e10; // library: bzero's the VI contexts, sets viCurr/viNext, tv-type mode, __osViSwapContext
osViGetCurrentFramebuffer = 0x800c7f20; // library: returns __osViCurr->buffer with interrupts off
osViGetNextFramebuffer = 0x800c7f60; // library: returns __osViNext->buffer with interrupts off
osCreateViManager = 0x800c7fa0; // library: creates the VI manager thread, queues, __osViInit, event handlers
__osViIntrHandler = 0x800c8140; // library: VI retrace: swaps context, counts retraces, posts the VI event
__osViGetCurrentContext = 0x800c82e0; // library: returns __osViCurr
osVirtualToPhysical = 0x800c82f0; // library: KSEG0/KSEG1 mask, else __osProbeTLB
__osProbeTLB = 0x800c8350; // library: tlbp/tlbr to translate a mapped address
osViSetEvent = 0x800c8410; // library: (mq, msg, retraceCount): stores them in the next VI context
osViSetMode = 0x800c8470; // library: stores the mode pointer, state = 1, copies its control word
osViSetSpecialFeatures = 0x800c84c0; // library: maps the OS_VI_* gamma/dither/divot feature bits onto the control word
osViSwapBuffer = 0x800c8630; // library: stores the frame buffer in the next VI context, flags a swap
__osViSwapContext = 0x800c8680; // library: latches the next VI context into the VI registers (0xA4400000 block)
osWritebackDCache = 0x800c8990; // library: cache op 0x19 over the range, full index writeback when >= 0x2000
osWritebackDCacheAll = 0x800c8a10; // library: index writeback of the whole D-cache
_Printf = 0x800c8a40; // library: (output callback, arg, fmt, va_list): the printf formatter, uses strchr over format flags
_Putfld = 0x800c8fb0; // library: converts one field by conversion code (switch on %c, d, i, u, o, x, X, e, f, g, s, p)
_Ldtob = 0x800c9470; // library: double to ASCII digits for e/f/g
_Ldunscale = 0x800c98b0; // library: splits a double's exponent and detects NaN/Inf
_Genld = 0x800c9948; // library: lays out the digits and exponent for e/f/g
ldiv = 0x800c9ef0; // library: 32-bit divide returning quotient and remainder with C rounding
lldiv = 0x800c9f74; // library: 64-bit divide returning quotient and remainder, via __ll_div
__ll_div = 0x800ca0b0; // library: signed 64-bit divide on 32-bit halves, negates operands then divides
_Litob = 0x800ca6a0; // library: integer to ASCII for %d/%u/%o/%x/%X, digit table "0123456789abcdef"
__ull_div = 0x800ca8f0; // library: unsigned 64-bit divide on 32-bit halves, normalised by a leading-zero table
osYieldThread = 0x800cadf0; // library: state = runnable, __osEnqueueAndYield on the active queue
MenuTween.ListCreate = 0x800cc330; // coined; docs/systems/pause-menu.md
MenuTween.ListFree = 0x800cc380; // coined; docs/systems/pause-menu.md: (list, flag): destroys a tween list
MenuTween.ListAdd = 0x800cc3cc; // coined; docs/systems/pause-menu.md
MenuTween.ListStep = 0x800cc428; // coined; docs/systems/pause-menu.md: steps each tween and drops the finished
MenuTween.LinearShortValue = 0x800cc5c0; // coined; docs/systems/pause-menu.md: trunc(start + (end - start) t) as a short
MenuTween.LinearByteValue = 0x800cc5ec; // coined; docs/systems/pause-menu.md: the same as a byte
MenuTween.LinearStep = 0x800cc648; // coined; docs/systems/pause-menu.md: elapsed += delta, clamped, then the value at elapsed / frames is applied
MenuTween.CreateShort = 0x800cc880; // coined; PartyMenu.Motion.cs: a short moved to an end over so many frames
MenuTween.Finish = 0x800cc900; // coined; PartyMenu.Motion.cs: writes the end value
MenuTween.Value = 0x800cc944; // PartyMenu.Motion.cs: the eased value, truncated to a short
MenuTween.CreateUShort = 0x800cc9d0; // coined; docs/systems/pause-menu.md: CreateShort for an unsigned short (a widget's width or height)
MenuTween.CreateByte = 0x800ccb88; // coined; PartyMenu.Motion.cs: the same for a byte, an alpha
MenuTween.ValueByte = 0x800ccc88; // coined; PartyMenu.Motion.cs: the eased value, truncated to a byte
MenuTween.Step = 0x800ccd70; // coined; PartyMenu.Motion.cs
BattleSetup.ArenaByTerrain = 0x800cd400; // coined; BattleSetup.ChooseArena's jump table by terrain
BattleSetup.LevelTrim = 0x800cd470; // coined; 0.3, 0.2, 0.1, 0.0: the share of each kind FillEnemies drops by party level / enemy level thirds
ChunkView.NeighbourTable = 0x800cd700; // coined; docs/systems/rendering.md: RenderZones's eight neighbours, a row and column each, whose order Borg9 byte 0x1B's bits follow
ChunkView.TransNeighbourTable = 0x800cd83c; // coined; docs/systems/rendering.md: RenderTransZones's, the same eight then the centre
CodeTable.ParticleTextures = 0x800cd860; // RomVersion.cs
MapObjectUse.ContainerSounds = 0x800cd9d0; // coined; docs/systems/audio.md
CharacterImporter.KeptMemberPositions = 0x800cdd88; // CharacterImporter.cs
CodeTable.SkyGradients = 0x800cdf50; // RomVersion.cs
CodeTable.GameOverScenes = 0x800ce1e0; // RomVersion.cs
TrekLoop.StateTable = 0x800ce218; // coined; docs/systems/ui.md: TrekLoop.Frame's jump table by TrekLoop.State, 26 entries
TrekLoop.NewJournalEntry = 0x800ce28c; // TrekLoop.cs
Combat.IntroStates = 0x800ce2f8; // coined; 8 bytes: state 31 picks byte 3 (1) for a combatant without AI, byte 7 (8) with
Zones.OverworldBgmListA = 0x800ce71c; // coined; docs/systems/audio.md
Zones.OverworldBgmListB = 0x800ce738; // coined; docs/systems/audio.md
Zones.JundarBgmList = 0x800ce768; // coined; docs/systems/audio.md: seven Borg5 scene indices ending in 0 (A01, I07, I09, K01, K05, K09, M01), 0x061C
Zones.BattleBgmWithPak = 0x800ce778; // coined; docs/systems/audio.md
Zones.BattleBgmNoPak = 0x800ce784; // coined; docs/systems/audio.md
Zones.SetMapSetTable = 0x800ce790; // coined; Zones.SetMapSet's jump table by map set (case 16 at 0x800269e8)
Credits.CardStarts = 0x800cf060; // coined; CreditsTable.cs, ROM 0xCFC60: 33 bytes, the first line of each card of the credits' string table
Credits.Vtable = 0x800cf0c0; // coined; the credits widget's vtable
PauseScroll.CameraHeight = 0x800cf2c0; // PauseScroll.cs: 27.0, the scroll's camera's height and System's x (0x800cf2c4 is World's -26.0)
CodeTable.PotionDescriptions = 0x800cf760; // RomVersion.cs
CodeTable.ItemDescriptions = 0x800cf7a0; // RomVersion.cs
CodeTable.SpellDescriptions = 0x800cf8ec; // RomVersion.cs
CodeTable.WorldMapTowns = 0x800d0b20; // RomVersion.cs
WorldMenu.OneLeft = 0x800d0b50; // WorldMenu.cs
Theatre.Dashes = 0x800d0ee0; // coined; the 16 dashes of a Theatre row that isn't seen
PauseMenu.StateTable = 0x800d11e0; // coined; docs/systems/pause-menu.md: PauseMenu.Frame's jump table by the menu's state
PauseMenu.ExitTable = 0x800d1240; // coined; docs/systems/pause-menu.md: PauseMenu.Exit's jump table for codes 1 to 5
CodeTable.RegionFlags = 0x800d126c; // RomVersion.cs
Audio.OneShotRadius = 0x800d1d14; // coined; docs/systems/audio.md: 1000.0, the radius a one-shot is given
ScriptRunner.SetupJumpTable = 0x800d1d80; // coined; docs/systems/cameras.md
ScriptRunner.EffectJumpTable = 0x800d1de8; // coined; docs/formats/dialogue.md
CodeTable.ScriptBattleFlags = 0x800d1e80; // RomVersion.cs
Combat.NoFleeEntities = 0x800d2688; // coined; docs/systems/combat.md: 12 entity indexes (the bosses) whose battles can't be fled; 0xFF ends
Combat.FleeRuleByFlag = 0x800d26a0; // coined; docs/systems/combat.md: encounter flag and flee byte: 978 no, 5250 yes, 3749 yes; 0xFFFF ends
Combat.DropWeaponClasses = 0x800d26c8; // coined; docs/systems/combat.md: 11 bytes by weapon class: 1 for Hafted, Missile, Pole, Sword and Thrown, which can drop
Combat.DirectionVectors = 0x800d27a8; // coined; docs/systems/combat.md: 8 pairs of signed bytes (dx, dz): N, NE, E, SE, S, SW, W, NW
Combat.AnimationByWeaponClass = 0x800d27e0; // coined; docs/systems/combat.md: pairs of weapon class and animation request; 0xFF ends
Combat.ResistBonusKinds = 0x800d2958; // coined; docs/systems/combat.md: pairs of effect kind and entity category for Combatant.ResistBonusFromEffects
Combat.DispelKinds = 0x800d29bc; // coined; docs/systems/combat.md: spell kinds that remove an effect
Combat.LimitedKinds = 0x800d29c4; // coined; docs/systems/combat.md: spell kinds 4, 16, 17, 27
Spell.ChanceByMoon = 0x800d29cc; // coined; docs/systems/magic.md: 0.5, 0.75, 1.25, 1.5: a Lunar caster's cast chance by the moon's phase
Spell.ChanceByTime = 0x800d29dc; // coined; docs/systems/magic.md: 0.75, 1.25, 1.25, 0.75, 0.75: any other caster's by the part of the day
Spell.ImproveFactor = 0x800d29f0; // coined; docs/systems/magic.md: 0.1: the improvement chance per point
Spell.ResistAspectFactors = 0x800d29f8; // coined; docs/systems/magic.md: 0.75 (same aspect), 1.25 (different)
Combat.KillFlagTable = 0x800d2b60; // coined; docs/systems/combat.md: SetKillFlags' jump table, 19 entries from entity place 0xa8
Combat.DirectionDx = 0x800d2bd0; // coined; docs/systems/combat.md: 8 signed bytes: 0, 1, 1, 1, 0, -1, -1, -1
Combat.DirectionDz = 0x800d2bd8; // coined; docs/systems/combat.md: 8 signed bytes: -1, -1, 0, 1, 1, 1, 0, -1
CutSceneActor.EyeBelowTop = 0x800d2cf0; // CutSceneActor.cs
EntityBody.DefaultStrike = 0x800d2cf8; // EntityBody.DefaultStrike (HBHT.Plugins); docs/systems/combat.md: 0.4f, EntityBody.Strike's for an entity without a row
EntityBody.ShotStrikeShare = 0x800d2cfc; // coined; docs/systems/combat.md: 0.4f, EntityBody.ShotStrike's
CodeTable.WeaponModels = 0x800d2f14; // RomVersion.cs
CodeTable.ItemModels = 0x800d2f9c; // RomVersion.cs
CodeTable.SpellSymbols = 0x800d3058; // RomVersion.cs
CodeTable.PotionNotNow = 0x800d3150; // RomVersion.cs
CodeTable.PotionNotInTrek = 0x800d3178; // RomVersion.cs
Entity.WraithStats = 0x800d34b0; // coined; docs/systems/magic.md: 0, 1, 2, 4: the stats Wraith Touch picks from
Entity.WeakeningKinds = 0x800d34b4; // coined; docs/systems/magic.md: 26, 5, 22, 31, 14, 52, 0xff
CodeTable.PartyFlags = 0x800d36c4; // RomVersion.cs
CodeTable.PartyDeathFlags = 0x800d3718; // RomVersion.cs
CodeTable.ScrollNoSpell = 0x800d375c; // RomVersion.cs
Party.CampHealTable = 0x800d386c; // coined; docs/systems/camping.md
CodeTable.SkillTrainingCosts = 0x800d38d0; // RomVersion.cs
CodeTable.WeaponTrainingCosts = 0x800d3900; // RomVersion.cs
CodeTable.StatTrainingCosts = 0x800d3a20; // RomVersion.cs
Combat.ControlsByStateTable = 0x800d4318; // coined; docs/systems/combat.md: Combat.ControlsByState's jump table, by combat state
CombatGui.TweenFrames = 0x800d43e4; // coined; docs/systems/ui.md: f32 60.0, the tweens' length in ticks (CombatGui.TweenTicks in the port)
CombatGui.BarOffsets = 0x800d43e8; // coined; docs/systems/ui.md: s16 {-4, 24}: an HP bar's x from the frame's portrait, party and enemy
CombatGui.BarImageVtable = 0x800d4400; // coined; docs/systems/ui.md: the frame and portrait image widgets
AudioKeys.WeaponSoundTable = 0x800d44d0; // coined; docs/systems/audio.md
CombatGui.LogBoxVtable = 0x800d46f0; // coined; docs/systems/ui.md: the log box (TextBand's with the locking setter at +0xcc)
CombatRadar.Scale = 0x800d5150; // coined; docs/systems/ui.md: f32 0.5, pixels per world unit (CombatRadar.Scale in the port)
CombatRadar.Radius = 0x800d5154; // coined; docs/systems/ui.md: f32 20.0, where a far dot is held (CombatRadar.Radius in the port)
CombatRadar.Vtable = 0x800d5170; // coined; docs/systems/ui.md
Scene.LightDirectionScale = 0x800d5488; // coined; docs/systems/rendering.md: 90.0, the factor on the third row of a light node's world matrix whose truncated bytes are the light's direction (F3DEX2 normalises it, so only the byte rounding depends on it)
Scene.LightColourScale = 0x800d548c; // coined; docs/systems/rendering.md: 255.0, the factor that turns a light's colour (its Borg4's times its transform's scale, each clamped to 0..1) into the light's colour bytes
Scene.NumLightsTable = 0x800d54b8; // coined; docs/systems/rendering.md: BorgAnimDrawSceneRaw's jump table by how many lights it wrote (1..7), to the code that moves the NUMLIGHT word, 0x18 times the directional lights, at least one
ScriptRunner.CommandCheckJumpTable = 0x800d5b08; // coined; docs/formats/dialogue.md
MenuTween.LinearByteClass = 0x800d6a38; // coined; docs/systems/pause-menu.md: a byte's linear tween (the skull's alpha)
MenuTween.LinearShortClass = 0x800d6a68; // coined; docs/systems/pause-menu.md: a short's linear tween (the portraits' x)
MenuTween.CurveUShortClass = 0x800d6b20; // coined; docs/systems/pause-menu.md: CreateUShort's
MenuTween.CurveShortClass = 0x800d6b50; // coined; docs/systems/pause-menu.md: CreateShort's
gspF3DEX2_fifoDataStart = 0x800d7520; // library: the RSP microcode's data (DMEM 0), 0x420 bytes to CodeTable.ArmorRecipes; its string 'RSP Gfx ucode F3DEX fifo 2.08' is at +0x138 (0x800d7658) and the linear texgen's polynomial (0xC000, 0x44D3, 0x6CB3) at +0x1d0
CodeTable.ArmorRecipes = 0x800d7940; // RomVersion.cs
CodeTable.PotionRecipes = 0x800d7960; // RomVersion.cs
CodeTable.CampDialogueFlags = 0x800d79f0; // RomVersion.cs
CodeTable.CampfireScenes = 0x800d7a04; // RomVersion.cs
Memory.HasExpansionPak = 0x800d7ea4; // coined; docs/systems/audio.md
gGlobals = 0x800d8088; // string 0x800d7ac0 (debug)
GameFrame.Counter = 0x800d8090; // coined; docs/systems/rendering.md: one more each frame, which lights move on once in
Game.Mode = 0x800d80c8; // coined; docs/systems/audio.md: the byte ScreenFade.Step switches on: 1 and 9 trek (0x8001FFD8), 2 (0x80022BA4), 3 and 5-8 the pause menu, shops and loot window (0x80048744), 0xC cut-scenes (0x8005039C), 0xE (0x80053934), 0xF the title (0x800551C0)
Player.Actor = 0x800d8134; // coined; docs/formats/code-tables.md: the trek player's Borg7, the literal 0x25F9 (0x800557c0), which the shape-changing cheats replace
TrekLoop.Restoring = 0x800d813e; // coined; u16, 1 after the first build: InitGameTrek puts the player on Zones.SavedPosition
TrekLoop.State = 0x800d8164; // coined; docs/systems/audio.md: 3 is trek running, 5 and 7 leave for a menu, 0xb a cut-scene cue
Collision.World = 0x800d81f4; // coined; docs/systems/combat.md: the loaded chunks' collision world (HasSight sweeps [0x800d81f4] + 8)
Zones.PlayerMap = 0x800d8288; // coined; docs/systems/rendering.md: the Borg9 data of the chunk the player is in
Camera.Listener = 0x800d829c; // coined; docs/systems/audio.md: the camera's eye at +0 and the point it looks at, the target, at +0xC (0x800A681C puts the eye behind the target); Audio.Attenuation measures to the target
FollowCamera.LookXZ = 0x800d82cc; // FollowCamera.cs: the camera's look in X and Z (Camera.Listener + 0x30), which the chunks' view, the clouds and the rain's centre read
Zones.Row = 0x800d83fa; // coined; docs/systems/audio.md: the player's chunk row
Zones.Column = 0x800d83fc; // coined; docs/systems/audio.md: the player's chunk column
Zones.CellSizeX = 0x800d8404; // coined; f32, 150 in the Battle arenas, 100 in the Overworld
Zones.CellSizeZ = 0x800d8408; // coined; f32
Zones.SpawnX = 0x800d840c; // coined; docs/formats/code-tables.md: the x Zones.SetMapSet gives a portal
Zones.SpawnZ = 0x800d8410; // coined; docs/formats/code-tables.md: the z Zones.SetMapSet gives a portal
Zones.MapSet = 0x800d8414; // coined; docs/systems/audio.md: the loaded map set
Zones.Chunk = 0x800d8416; // coined; u16, the second Zones.SetMapSet argument: the named start place of the map set, -1 none (set 0 place 0 the new game's at I08 (16, 62), set 6 place 0 Oriana's hut, set 16 the arena)
Weather.Data = 0x800d841c; // coined; docs/systems/weather.md: the drawn weather, gGlobals + 0x394 (0x24 bytes)
Weather.TerrainSky = 0x800d842c; // coined; docs/systems/weather.md: Weather.Data + 0x10, the terrain's sky GetMapTerrain sets, which the weather goes back to
Players.Handler = 0x800d8440; // coined; docs/systems/audio.md: count at +0, bodies of 0x780 bytes at +0xC, the load radius 50.0 at +0x68, the audio keys at +0x74
Camera.OwnerIndex = 0x800d8448; // coined; docs/systems/weather.md: the body GiveCameraToPlayer gives the camera to, -1 none
AudioKeys.Table = 0x800d84b4; // coined; docs/systems/audio.md
Particles.Head = 0x800d84b8; // coined; docs/systems/weather.md: the zone engine's particles, 16 emitters; docs/formats/particles.md: the zone engine's particle head
DynamicLights.Manager = 0x800d8900; // coined; docs/systems/rendering.md: 16 lights of 0x6c bytes, their headers at +0x6c0, the count at +0x760
Zones.PendingTeleport = 0x800d9064; // coined; docs/systems/audio.md: the teleport HandleZoneEngineFrame carries out
Zones.PendingShift = 0x800d9068; // coined; docs/systems/audio.md: the offset of a chunk crossing, 0 for a teleport
Zones.SavedPosition = 0x800d906c; // coined; the 0x2c record TrekLoop.Free saves and InitGameTrek restores: position, heading (+0xC, the body's +0x20, the original's reversed facing), camera eye, row, column, map set
Bgm.Borg = 0x800d9098; // coined; docs/systems/audio.md
Bgm.Generation = 0x800d909c; // coined; docs/systems/audio.md
Bgm.Slot = 0x800d90a0; // coined; docs/systems/audio.md
Bgm.Requested = 0x800d90a2; // coined; docs/systems/audio.md
Bgm.Playing = 0x800d90a4; // coined; docs/systems/audio.md
Zones.Mode = 0x800d90a6; // coined; docs/systems/audio.md: set by InitZoneEngine: 0 trek and cut-scenes, 1 combat (from 0x80022D1C), 2 the title screen's scenery (0x80054D70)
Zones.Breadcrumbs = 0x800d90e0; // coined; 15 records of 0x2c (SaveZoneEngine's), the last positions of the trek walk with their headings and the camera's eye; fleeing restores all three
Zones.BreadcrumbNext = 0x800d9374; // coined; u16, the next record to overwrite
Zones.Fled = 0x800d9376; // coined; u16, 1 once the party fled: trek's rebuild puts it at the farthest breadcrumb
Zones.BreadcrumbTimer = 0x800d9378; // coined; u16, ticks to the next record, 120
Audio.System = 0x800d9380; // coined; docs/systems/audio.md
Combat.State = 0x800d9454; // coined; docs/systems/combat.md: the combat state, 0 to 31; 0x800d9455 is NextState
Combat.NextState = 0x800d9455; // coined; docs/systems/combat.md: the state the next completion goes to
BattleSetup.Filled = 0x800d9456; // coined; docs/systems/combat.md: 1 when the block below was filled for this battle; 0 makes a random test battle
BattleSetup.Enemies = 0x800d9458; // coined; docs/systems/combat.md: 12 entity IDs, 0 ends; the first four are on the field
BattleSetup.BonusLoot = 0x800d9470; // coined; docs/systems/combat.md: an item or a chest (type 8) the victory adds
BattleSetup.EncounterFlag = 0x800d9472; // coined; docs/systems/combat.md: the battle's flag, keyed on by the special battles (978 is the Shadow's)
BattleSetup.RememberParty = 0x800d9474; // coined; docs/systems/combat.md: 1 if winning remembers the monster party's map object (the next four fields)
BattleSetup.PartyVoxel = 0x800d9476; // coined; docs/systems/combat.md: the monster party's map object index
BattleSetup.CollisionByte = 0x800d947e; // coined; docs/systems/combat.md: 0-2: how the party is placed
BattleSetup.Arena = 0x800d947f; // coined; docs/systems/combat.md: 0-27, the chunk of map set 16
BattleSetup.AniByte = 0x800d9480; // coined; docs/systems/combat.md: 0-3, the enemies' spawn set is 4 minus it
BattleSetup.CanFlee = 0x800d9481; // coined; combat.md
BattleSetup.PartyGateSlot = 0x800d9482; // coined; the monster party object's flag slot A (+0x1c), not its x
BattleSetup.PartyFlags = 0x800d9484; // coined; the object's flags (+0x14), not its z
Combat.Bodies = 0x800d9488; // coined; docs/systems/combat.md: 14 pointers to the combatants' bodies (0x780 bytes each), by slot
Combat.ShadowSlot = 0x800d94cc; // coined; docs/systems/combat.md: the Shadow's combatant index, 0xFF if none
Combat.AlaronSlot = 0x800d94cd; // coined; docs/systems/combat.md: Alaron's combatant index
Combat.ShadowTurnsLeft = 0x800d94ce; // coined; docs/systems/combat.md: 2 in the Shadow's fight, counted down by merging
PauseMenu.ExperiencePool = 0x800d94d0; // coined; u32, the battle's experience pool (not x 1.5), for state 5's "Each member earned" line
Combat.PausedState = 0x800d94d4; // coined; docs/systems/combat.md: the state the pause was asked in
Sky.BackgroundType = 0x800d94d8; // coined; docs/systems/weather.md: 3 an outdoor sky, 4 black with the sky's colours
SkyColors.Tint = 0x800d94f8; // SkyColors.cs: the scenery's tint, white as lightning flashes
SkyColors.Sky = 0x800d94fc; // SkyColors.cs: the sky colour, half of which is bodies' ambient; white as lightning flashes
SkyColors.Fog = 0x800d9500; // SkyColors.cs: the fog colour, which SetSceneColors gives the scenery
PauseMenu.State = 0x800d9550; // coined; docs/systems/audio.md: 3 the pause menu in trek, 4 to 7 shops and the like, 0xc closing
PauseMenu.Widget = 0x800d9558; // coined; docs/systems/audio.md: the BigAssMenu object
Theatre.Reopen = 0x800d955c; // coined; set by a Theatre row's A: the next System tab opens on the Theatre page (and clears it)
PauseMenu.Snapshot = 0x800d9560; // coined; docs/systems/pause-menu.md: the 320x240 image GetSnapShot fills
PauseMenu.BackdropTint = 0x800d9564; // coined; docs/systems/pause-menu.md: the RGBA the snapshot is drawn with, 0xff down to 0x80 and back
PauseMenu.ClipLeft = 0x800d9568; // coined; docs/systems/pause-menu.md: u16, the column the tabs are cut from while the scroll unrolls and rolls up
PauseMenu.ClipRight = 0x800d956a; // coined; docs/systems/pause-menu.md: u16, the column the tabs are cut to
PauseMenu.LootInventory = 0x800d9578; // coined; the loot window's pile, freed by BarterMenu.Destroy
PauseMenu.LootShopkeeper = 0x800d957c; // coined; s16, -1 for loot
PauseMenu.LootGold = 0x800d9580; // coined; the gold pool, "Found: n gold." (and the coin sound when nonzero)
Credits.Source = 0x800d9584; // coined; what started the credits: 0 the title, 1 the System tab's row, 2 the ending, which decides the mode after them (0xF, 9, 0)
Combat.PauseRequested = 0x800d9588; // coined; u32, 1 when the pause came from another state than a turn (state 27): System tab only
Minimap.Data = 0x800d9598; // coined; docs/systems/ui.md: the minimap Zones.SetMapSet loads with a map set and frees without one; its first word is nonzero while one is loaded, which keeps LoadGameBorgScenes from setting a world map region
Cinematic.Scene = 0x800d9654; // coined; the shot's scene (Borg5 instance)
Cinematic.Anim = 0x800d9658; // coined; the shot's Borg6 (its +0x20 data, whose +0xC is the length in ticks)
Cinematic.Music = 0x800d965c; // coined; the shot's Borg12
Cinematic.Flags = 0x800d9660; // coined; the cinematic's flag list: a caption list per shot (0xFFFF none), then the done flag
Cinematic.Planes = 0x800d9664; // coined; the cinematic's near and far planes, a pair of floats a shot
Cinematic.Animations = 0x800d9668; // coined; the cinematic's Borg6 list, ending in 0
Cinematic.Audio = 0x800d966c; // coined; the cinematic's Borg12 list
Cinematic.NextShot = 0x800d9670; // coined; the next shot's number from 0
Cinematic.StartPending = 0x800d9672; // coined; 1 when the next frame starts a shot
Cinematic.State = 0x800d9674; // coined; 1 playing, 0 stopping (skipped or out of shots), 2 stopped: ends next frame
Cinematic.Kind = 0x800d9676; // coined; Cinematic.Load's second argument, which picks what Cinematic.EndCase does
Cinematic.MusicGeneration = 0x800d9678; // coined; the shot's sequence's generation
Cinematic.ReturnMode = 0x800d967c; // coined; Cinematic.Load's third argument, the mode to go to after kinds 0, 3 and 4
Cinematic.MusicSlot = 0x800d9680; // coined; the shot's sequence's slot
GameState.Party = 0x800d9684; // AresCheckpoint.cs: a pointer to the party, its four members' sheets first and the count at +0x24
ScreenFade.Alpha = 0x800da0c8; // ScreenFade.Brightness; docs/systems/audio.md, rendering.md: the fade's level, 1 clear to 0 black, which scales the ambient and point lights
ScreenFade.Speed = 0x800da0d0; // coined; docs/systems/audio.md: per tick of the frame's delta
ScreenFade.State = 0x800da0d4; // coined; docs/systems/audio.md: 0 none, 1 out, 2 in, 3 out and in; Bgm.Update waits for 0
Combat.NonLethal = 0x800da0dc; // coined; docs/systems/combat.md: 1 for the Shadow's fight (flag 978)
Settings.SoundVolume = 0x800da0e0; // Settings.cs: a float, 1.0 in a new game
Settings.MusicVolume = 0x800da0e4; // Settings.cs: a float, 0.65 in a new game
CodeTable.FontFaces = 0x800da308; // RomVersion.cs
Combat.DegreeThresholds = 0x800da348; // coined; docs/systems/combat.md: 21 u16: the margin of a roll to its degree of success, 0 to 20 (0, 26, 46, 62, 81, 96, 111, then +11 to 266), read by the function at 0x80008654
VoxelObjects.GateTable = 0x800da458; // coined; docs/systems/audio.md: a function per object type that says whether its flag gate holds (type 3, sounds, is 0x80010DCC)
Party.KeptSheets = 0x800da4e0; // docs/systems/saves.md
PakSave.Thumbnail = 0x800da4f0; // coined; docs/systems/saves.md: pointer to the 0x1000-byte 64 x 32 RGBA5551 snapshot Weather.Pause makes and PakSave.CopyThumbnail copies
Sky.LightningFrame = 0x800daed4; // coined; docs/systems/weather.md: RenderSky's count of frames to 20
Weather.SkyOverridden = 0x800daee0; // coined; docs/systems/weather.md: set while rain or snow holds sky 2
Credits.Pending = 0x800daef3; // coined; byte, 1 at boot and after each run: Credits.Frame starts the credits when it's set
Credits.Widget = 0x800daef4; // coined; the credits widget while they run, else 0
GameState.Flags = 0x800daf00; // docs/formats/quests.md
TrekLoop.RebuildPending = 0x800db066; // coined; byte, set by that, makes the next TrekLoop.Frame call InitGameTrek
TrekLoop.FreeRequested = 0x800db067; // coined; byte, set by a state to have TrekLoop.Free run at the frame's end
Combat.Active = 0x800db0a0; // coined; docs/systems/combat.md: 1 from Combat.Init until Combat.Exit
Combat.InitPending = 0x800db0a4; // coined; docs/systems/combat.md: 1 until Combat.Init has run
Combat.ExitRequested = 0x800db0a8; // coined; docs/systems/combat.md: 1 asks Combat.Exit to tear down this frame
Combat.IdleFrames = 0x800db0ac; // coined; docs/systems/combat.md: frames spent in the waiting states
Combat.CastScene = 0x800db0c8; // coined; docs/systems/combat.md: the spell's scene while the cast camera glides, 0 otherwise
Combat.ActionActive = 0x800db0cc; // coined; docs/systems/combat.md: 1 while an action plays
Combat.RestTicks = 0x800db0d0; // coined; docs/systems/combat.md: state 24's countdown
Combat.StateTable = 0x800db0d4; // coined; docs/systems/combat.md: 32 pointers, the state's function; index Combat.State
Combat.ZoneFreed = 0x800db154; // coined; 1 from Combat.Exit until InitZoneEngine: PauseMenu.Leave doesn't reload the chunks
RomLayout.MapChunkLists = 0x800db190; // RomVersion.cs
Zones.ArenaChunks = 0x800dca74; // coined; docs/formats/code-tables.md: the battle arenas' (map set 16) chunks, 12-byte rows: u16 row, u16 column, scenes; portal n is row n
Zones.CellTable = 0x800dcbd0; // coined; docs/systems/audio.md: 6 bytes per cell at row * 0xB4 + column * 6: the chunk's scene, collision and see-through scene
CodeTable.LensFlare = 0x800ddb70; // RomVersion.cs
CodeTable.Clouds = 0x800ddc08; // RomVersion.cs
CodeTable.SkyObjects = 0x800de248; // RomVersion.cs
CombatGui.Root = 0x800de9a4; // coined; docs/systems/ui.md: the GUI's root widget (the radar, the frames, the portraits are its children)
Credits.EndShown = 0x800de9b0; // coined; set once "The End" has been added to the widget (state 3)
PauseMenu.SectionImages = 0x800de9c0; // coined; docs/systems/pause-menu.md: u16 a tab, the images 0x00D8, 0x00D9 and 0x00DA
PauseScroll.TabX = 0x800de9c8; // PauseScroll.cs: floats, the scroll's x for System, Party and World, 27, 0 and -26
PauseMenu.FadeToggle = 0x800de9e0; // coined; byte, OpenFade's flip: 1 after a finished fade makes the next one's first frame alpha 0
PauseMenu.Member = 0x800de9f0; // PauseMenu.cs: byte, the member every DollMenu opens on: set by Combat.StatePause (the current combatant's slot, 0x800226d0), PartyMenu.ChangeMember (0x800305c8, 0x800305f0) and DollMenu::InitMenu's fallback (0x80030128), and nothing else
CodeTable.InventoryOrder = 0x800dea00; // RomVersion.cs
CodeTable.EquipmentSlotImages = 0x800dea70; // RomVersion.cs
Theatre.Flags = 0x800dead0; // coined; four (u16 flag, u8 cinematic, pad) entries, 0 ends: 3 to 0, 569 to 1, 590 to 2, 601 to 3
CodeTable.MenuIcons = 0x800deb00; // RomVersion.cs
PauseMenu.NextState = 0x800df030; // coined; docs/systems/pause-menu.md: the state after closing (10 trek, 9 combat, 6 loot after the post-battle window)
PauseMenu.NextTrekState = 0x800df031; // coined; docs/systems/pause-menu.md: the trek state set as the menu closes
PauseMenu.LoadDone = 0x800df034; // coined; docs/systems/pause-menu.md: 1 once a save has loaded: ReadFrame then exits with code 4
PauseMenu.PendingOpen = 0x800df038; // coined; docs/systems/pause-menu.md: 1 until the backdrop has darkened and the menu is built
PauseMenu.NeedsCleanup = 0x800df039; // coined; docs/systems/pause-menu.md: set as the menu goes back to trek: frees the snapshot and runs Leave
CodeTable.WorldMapPieces = 0x800df040; // RomVersion.cs
CodeTable.MinimapSections = 0x800dfba4; // RomVersion.cs
CodeTable.MinimapFlagImages = 0x800dfbc8; // RomVersion.cs
Plane.DrawStateList = 0x800dfcc0; // coined; docs/systems/combat.md: the display list Plane.SetDrawState calls: one cycle, G_CC_MODULATERGBA, G_TF_BILERP
Dialogue.SoundTable = 0x800dfd60; // coined; docs/systems/audio.md
CutScene.ReturnMode = 0x800dfe10; // coined; the mode CutScene.ModeFrame returns when it ends (0 after a game over)
CutScene.Playing = 0x800dfe14; // coined; docs/systems/weather.md: set while a cut-scene plays, when the scenery's fog ignores the weather's
CodeTable.ScriptEndings = 0x800dfe1c; // RomVersion.cs
CutScene.EndingKind = 0x800dfe4c; // coined; docs/systems/combat.md: the script's CodeTable.ScriptEndings kind, read by CutScene.Free (2 game over, 1 ending, 3 Roog)
AudioKeys.FootstepEntries = 0x800dfe60; // coined; docs/systems/audio.md
AudioKeys.StepSets = 0x800dffe8; // coined; docs/systems/audio.md
Audio.StepSounds = 0x800e0128; // coined; docs/systems/audio.md
Audio.VoiceSounds = 0x800e02a8; // coined; docs/systems/audio.md
Audio.SpellSounds = 0x800e04a0; // coined; docs/systems/audio.md
CodeTable.Cinematics = 0x800e0780; // RomVersion.cs
Cinematic.BeginPending = 0x800e07c0; // coined; 1 until Cinematic.Begin runs (starts 1)
Cinematic.EndPending = 0x800e07c1; // coined; set a frame ahead of Cinematic.EndCase
CodeTable.CinematicFades = 0x800e0998; // RomVersion.cs
Cinematic.FadeNext = 0x800e09a8; // coined; the fade list's next 8-byte entry (shot, colour, start, length, hold)
Cinematic.FadeRed = 0x800e09ac; // coined; the overlay's colour, then FadeGreen, FadeBlue and FadeAlpha at +1, +2, +3
Cinematic.FadeRemaining = 0x800e09b0; // coined; ticks the overlay is still drawn (u16)
Cinematic.FadeProgress = 0x800e09b4; // coined; the overlay's alpha from 0 to 1 (float)
Cinematic.FadeRate = 0x800e09b8; // coined; its change a tick (float), 1 / (length x 2 - 4), or 1 / (length x 2) under 5; negative for a fade from the picture
Cinematic.ShotClock = 0x800e09bc; // coined; the fades' ticks since the shot began (u16)
Cinematic.ShotNumber = 0x800e09be; // coined; the fades' shot, from 1 (u16)
Cinematic.Captions = 0x800e09c0; // coined; the caption box record (0x21C bytes): +0 ticks left to show, +4 the box, +8 the caption index, +0xC the next caption's cursor, +0x10 lists, +0x12 captions in the list, +0x14 read, +0x16 the next's start, +0x18 its length, +0x1A its text, +0x11A the leader's name
Cinematic.CaptionClock = 0x800e09c4; // coined; the captions' ticks since their list began
MapObjectMemory.Chart = 0x800e0a74; // coined; docs/systems/saves.md
MapObjectMemory.Slots = 0x800e0b58; // coined; docs/systems/saves.md: 19 bytes: the entries' slot numbers, those in use first; Remember takes Slots[Count], Forget puts its slot back at Slots[Count - 1]
EnemyAI.SlotIndex = 0x800e0b70; // coined; docs/systems/combat.md: 8 bytes: the action slot's index in its list
EnemyAI.SlotKind = 0x800e0b78; // coined; docs/systems/combat.md: 8 bytes: the action slot's kind
EnemyAI.StyleTable = 0x800e0b80; // coined; docs/systems/combat.md: 11 member-function pointers (u16 delta 0, u16 index -1, the function) for an AI's style (+8)
Combat.Current = 0x800e0bf0; // coined; docs/systems/combat.md: the pointer to the combat struct (0x544c bytes) while a battle is up
Combat.BowKindWeapons = 0x800e0c08; // coined; docs/systems/combat.md: weapon indexes 53-60, 0xFF ends
Combat.ThrownKindWeapons = 0x800e0c14; // coined; docs/formats/code-tables.md: the thrown weapons, weapon DB positions 94-99, 101, 102, 0xFF ends
Combat.RadiusByDexterity = 0x800e0c20; // coined; docs/systems/combat.md: the modified Dexterity's thresholds: the index is the field of influence's radius (3 at 0-3, 4 at 4-7, ... 13)
Combat.StrengthTierThresholds = 0x800e0c30; // coined; docs/systems/combat.md: 8 bytes: 4, 9, 17, 24, 28, 32, 36, 39
Combat.ImmobilisingKinds = 0x800e0c38; // coined; docs/systems/combat.md: spell kinds 34, 53, 57; 0xFF ends
ArmorDb.Table = 0x800e0c40; // coined; pointer: records at +4, 0x34 each (+0x22 the experience bonus)
ChestDb.Table = 0x800e0ca0; // coined; pointer to the chest table: u8 count, records at +4, 0x3a each
CodeTable.DialogEntityList = 0x800e0d00; // RomVersion.cs
CodeTable.EntityModels = 0x800e0d30; // RomVersion.cs
CodeTable.DialogEntityModels = 0x800e2578; // RomVersion.cs
EntityDb.Table = 0x800e2830; // coined; pointer to the entity table: u8 count, and at +0x10 a pointer to the records, 0x80 each (+0x1c level, +0x7c experience, +0x7e chest byte)
CodeTable.EntityList = 0x800e2840; // RomVersion.cs
CodeTable.WeaponsWithModels = 0x800e2920; // RomVersion.cs
CodeTable.ItemsWithModels = 0x800e2964; // RomVersion.cs
ItemDb.Table = 0x800e2980; // coined; pointer to the general item table: records at +0x18, 0x30 each (+0x18 the experience value); ids in the list at 0x800e2990
ItemDb.ReagentIds = 0x800e2990; // coined; u16 item ids by general item place (30 Spice, 31 Herb, 32 Gemstone): the start of CodeTable.ItemList (RomVersion.cs), all 197 places
Spell.ReagentItems = 0x800e29cc; // coined; docs/systems/magic.md: u16 item IDs of Spice, Herb, Gemstone
CodeTable.SpellList = 0x800e2b40; // RomVersion.cs
CodeTable.WeaponList = 0x800e2b90; // RomVersion.cs
CodeTable.ArmorList = 0x800e0c50; // RomVersion.cs
WeaponDb.Table = 0x800e2b80; // coined; pointer: records at +0x18, 0x34 each (+0x18 class, +0x21 the experience modifier)
Spell.CastMessages = 0x800e2c00; // coined; docs/systems/combat.md: a pointer the string loader (0x80083620) sets to the Common strings' lines 258-270, the "cannot cast" lines (0 OK ... 12 "The Spell failed!")
CodeTable.LevelExp = 0x800e2c04; // RomVersion.cs
CodeTable.PotionPrices = 0x800e2cb0; // RomVersion.cs
CodeTable.MustTakeItems = 0x800e2ce0; // RomVersion.cs
CodeTable.ReservedItems = 0x800e2d10; // RomVersion.cs
CodeTable.KeyItemFlags = 0x800e2db0; // RomVersion.cs
CodeTable.KeyItems = 0x800e2df0; // RomVersion.cs
CodeTable.KeyItemRegionFlags = 0x800e2e30; // RomVersion.cs
CodeTable.KeyEquipment = 0x800e2e70; // RomVersion.cs
CodeTable.CampFactors = 0x800e2f38; // RomVersion.cs
CodeTable.StatCaps = 0x800e2fe4; // RomVersion.cs
GameClock.WorldPointer = 0x800e303c; // coined; docs/reference-rig.md
CodeTable.SeasonPrecipitation = 0x800e3040; // RomVersion.cs
CodeTable.TerrainPrecipitation = 0x800e3048; // RomVersion.cs
CodeTable.TerrainPrecipitationScale = 0x800e3064; // RomVersion.cs
Combat.InputSeen = 0x800e3120; // coined; docs/systems/combat.md: an input event came this frame
CombatMarkers.RingDirX = 0x800e3130; // coined; docs/systems/combat.md: f32, the ring's way round, never reset (from 0.0)
CombatMarkers.RingDirZ = 0x800e3134; // coined; f32 (from 1.0)
CombatMarkers.Pool = 0x800e3138; // coined; docs/systems/combat.md: the 20 teardrops
CombatMarkers.Ground = 0x800e313c; // coined; the collision the ring's sweeps use
CombatGui.Shown = 0x800e3140; // coined; docs/systems/ui.md: toggled by C-left (Combat.ControlsByState, 0x80085114) and read by nothing
CombatGui.PortraitCount = 0x800e3144; // coined; docs/systems/ui.md: u8, party size + 2 + the enemy list's count: the size of both the portrait and the frame arrays
CombatGui.Portraits = 0x800e3148; // coined; docs/systems/combat.md: 0x18-byte entries: widget, overlay widget, entity ID, slot, kind, bar
CombatGui.Bars = 0x800e314c; // coined; docs/systems/combat.md: 0x18-byte entries: widget, x, y, w, h, flags
CombatGui.Tweens = 0x800e3150; // coined; docs/systems/combat.md: the GUI's tween list
CombatGui.FirstDraw = 0x800e3154; // coined; docs/systems/ui.md: 1 from Create until the first Draw gives the reserves their frames
CombatGui.NextPortrait = 0x800e3158; // coined; docs/systems/ui.md: u8, Create's running index
CombatGui.LogBox = 0x800e3160; // coined; docs/systems/combat.md: the log box widget
CombatGui.LogPortrait = 0x800e3164; // coined; docs/systems/ui.md: the entity ID the log box's portrait was last set for (CombatGui.LogPortrait in the port)
CombatCamera.GlideFrom = 0x800e3250; // coined; the caster's body
CombatCamera.GlideTo = 0x800e3254; // coined; the target's body
CombatCamera.GlidePhase = 0x800e3258; // coined; u16, 0 none, 1 first frame, 2 gliding
CombatCamera.Placing = 0x800e325a; // coined; u16, 1 from Combat.Reset until the first frame places the camera behind a party member
CombatCamera.FloorTimer = 0x800e325c; // coined; u16, frames the remembered floor is kept
CombatCamera.FloorY = 0x800e3260; // coined; f32
CombatCamera.LastOwner = 0x800e3264; // coined; s16, the body ID the camera's goal was last placed for, -1 none
Pak.CharCodes = 0x800e4220; // coined; docs/systems/saves.md: the pak's character set as ASCII, 0x42 characters from code 0: NUL, space at 0xF, 0-9 from 0x10, A-Z from 0x1A
Pak.Ports = 0x800e4314; // coined; docs/systems/saves.md: pointer to the controllers' pak records, 0x78 bytes each, the OSPfs at +4
Pak.Lock = 0x800e4508; // coined; docs/systems/saves.md: the OSMesgQueue every Pak.* call holds
Scene.WhiteAmbientLight = 0x800e4738; // coined; docs/systems/rendering.md: a Light_t of white (255, 255, 255) in both colour copies, the ambient a scene with no lights gets (+0x288 of the scene is a copy of it for the engine-lit path)
Scene.BlackLight = 0x800e4748; // coined; docs/systems/rendering.md: a black Light_t, the directional light beside the ambient when a scene has none or only the ambient
Scene.StaticState = 0x800e4758; // coined; docs/systems/rendering.md: the display list Scene.InitDrawState calls (G_DL 0xDE) that resets every other-mode field, the default combine, and the geometry mode 0x220405
Scene.CameraEye = 0x800e47f8; // coined; docs/systems/rendering.md: three floats, the eye of the camera scene last loaded by Scene.LoadCamera
Borg.FixupTable = 0x800e4854; // coined; docs/formats/audio.md: per-type post-load fixups by Borg type
Borg.InitTable = 0x800e4890; // coined; docs/formats/audio.md
ParticleHead.Random = 0x800e4ab0; // ParticleHead.cs: the particles' generator, seeded from the clock
CodeTable.FontGlyphs = 0x800e4ac0; // RomVersion.cs
CodeTable.FontColors = 0x800e4b2c; // RomVersion.cs
eqpower = 0x800e5010; // library: the equal-power pan table
MenuTween.Ease = 0x800e6590; // PartyMenu.Motion.cs: the curve, 0.5 sin(pi t - pi/2) + 0.5
MenuTween.EaseOut = 0x800e65c0; // coined; docs/systems/ui.md: the curve sin(pi/2 t)
Combat.WalkLast = 0x800e6850; // coined; vec3, the walking body's position at the last check (StateMoving's stuck timer)
Combat.WalkNow = 0x800e6860; // coined; vec3
RandomStreams.Animation = 0x800e69c0; // IRandom.cs: the stream ActorStateMachine.Tick rolls bodies' branches on, one for every body; .bss, starting at 0, never seeded or saved (debug 0x800f5570)
ActorStateMachine.AdvanceRolls = 0x800e69c4; // coined; docs/formats/actors.md: the stream ActorStateMachine.Advance rolls map actors' and the pause menu's scroll's branches on; .bss, starting at 0 (debug 0x800f5574)
CombatSpellFx.Init = 0x8008ad60; // coined; docs/systems/combat.md: Combat.Init's allocation of the three pools (A 0x40 x 0x14, B 0x80 x 0x30, C 0x10 x 0x14) and their free-index arrays
CombatSpellFx.DimSky = 0x8008aecc; // coined; docs/systems/combat.md: a normal cast: SkyDimmed = 1, SkyTimer 150, Sky.FadeBrightness(0.5, 30.0), CastWindow 300
CombatSpellFx.Housekeeping = 0x8008af1c; // coined; docs/systems/combat.md: (delta): the sky timer, the cast window and aura fade ramp, frees finished visuals and the A entries all of whose handles are done
CombatSpellFx.FreeEntry = 0x8008b1bc; // coined; docs/systems/combat.md: (a): zeroes pool A's entry and returns its index
CombatSpellFx.AcquireBody = 0x8008b23c; // coined; docs/systems/combat.md: (body): the pool C index of the body's spell-visual player, made if missing (refs + 1), loading the body's actor if absent
CombatSpellFx.GlowBody = 0x8008b364; // coined; docs/systems/combat.md: (c): glow timer 150, Body.SetTint(body, 30.0, 1, 1, 1), the body's fog off
CombatSpellFx.HoldBody = 0x8008b3f0; // coined; docs/systems/combat.md: (c): hold count + 1 and body +0x70E = 1 (Wall of Bones, Frozen Doom, Web of Starlight: the body's idle pose is held)
CombatSpellFx.UnholdBody = 0x8008b440; // coined; docs/systems/combat.md: (c): hold count - 1, body +0x70E = 0 when it was 1
CombatSpellFx.QueueAura = 0x8008b498; // coined; docs/systems/combat.md: (c, aura): pending count and the body's pending auras + 1; starts the aura when it is the only one
CombatSpellFx.NextAura = 0x8008b510; // coined; docs/systems/combat.md: (c): the next aura in the round robin: the next body with pending auras, then its next aura by its cursor
CombatSpellFx.StepGlow = 0x8008b6ac; // coined; docs/systems/combat.md: (delta): each glowing body's timer; at 0 Body.ClearTint(body, 30.0), fog on
CombatSpellFx.ReleaseBody = 0x8008b780; // coined; docs/systems/combat.md: (c): refs - 1, the pool C entry freed at 0
CombatSpellFx.AddVisual = 0x8008b81c; // coined; docs/systems/combat.md: (c, kind, role): a B entry: the actor (roles 0-4) or the aura's id (5, 6) from the role's table, its place at the body's feet (+ height), its locator 3; -1 (0xFFFF) if none or the heap is short
CombatSpellFx.AttachScenes = 0x8008bb08; // coined; docs/formats/particles.md: (h, owner c, other c): the visual's scene +0x2A0 = &Particles.Head, +0x2A4 = the owner body's actor scene, +0x2A8 = the other's
CombatSpellFx.StopEmitters = 0x8008bbe8; // coined; docs/formats/particles.md: (h): ParticleHead.Stop on an actor visual's scene
CombatSpellFx.StartAura = 0x8008bc54; // coined; docs/systems/combat.md: (h): flag 0x20, AuraLength 125, AuraTime 0
CombatSpellFx.Draw = 0x8008c25c; // coined; docs/systems/combat.md: Scene.DrawActor for each live actor visual, Scene.Draw for each playing aura
CombatSpellFx.FreeVisual = 0x8008c310; // coined; docs/systems/combat.md: (h): stops emitters and queues the actor's free (roles 0-4), or queues the aura scene's, and returns the B entry
CombatSpellFx.StartPotion = 0x8008c664; // coined; docs/systems/combat.md: (body, kind): a potion's A entry: role 2 actor and role 6 aura on the body, attached to itself; no sky dim, no glow
CombatSpellFx.EndEffect = 0x8008c7a4; // coined; docs/systems/combat.md: (a): from EffectRecord.FreeVisual and PotionRecord.FreeVisual: Darkness/Light 0x200 and the time offset eased back, kinds 34/53/57 unhold, the aura asked to stop (0x100)
CombatSpellFx.CasterHeight = 0x8008cb38; // coined; docs/systems/combat.md: role 0's "lift by body height" flag: always 0
CombatSpellFx.CasterActor = 0x8008cb40; // coined; docs/systems/combat.md: (kind, &size): role 0's Borg7 by spell kind (26 kinds), jump table 0x800D4C98; -1 if none
CombatSpellFx.TargetAtHead = 0x8008cca8; // coined; docs/systems/combat.md: (kind): 1 for kinds 4, 5, 14, 16, 17, 22, 27, 28, 31, 52 (role 1's actor is lifted by the body's height), table 0x800D4D88
CombatSpellFx.TargetActor = 0x8008cce0; // coined; docs/systems/combat.md: (kind, &size): role 1's Borg7 (30 kinds), table 0x800D4E50
CombatSpellFx.AuraScene = 0x8008ce78; // coined; docs/systems/combat.md: (kind, &size): role 5's Borg5 (34 kinds), table 0x800D4F40; the size is zeroed by AddVisual
CombatSpellFx.PotionActor = 0x8008d038; // coined; docs/systems/combat.md: (kind, &size): role 2's Borg7 by potion kind (12 kinds), table 0x800D5030
CombatSpellFx.PotionAura = 0x8008d0fc; // coined; docs/systems/combat.md: (kind, &size): role 6's Borg5 (kinds 3, 9, 10, 15), table 0x800D5078
CombatSpellFx.Visuals = 0x800e3218; // coined; docs/systems/combat.md: pointer to pool A (0x40 x 0x14): a cast's kind, flags, the two C indices and three B handles
CombatSpellFx.Actors = 0x800e321c; // coined; docs/systems/combat.md: pointer to pool B (0x80 x 0x30): an actor or an aura scene with its place, flags, owner and role
CombatSpellFx.Players = 0x800e3220; // coined; docs/systems/combat.md: pointer to pool C (0x10 x 0x14): per body (the original's SPELLVISUAL "players"): body, flags, refs, glow timer, hold, pending auras, cursor
CombatSpellFx.CylinderScene = 0x800e3200; // coined; docs/systems/combat.md: the aim cylinder's scene 0x0797, loaded on first use
CombatSpellFx.CylinderY = 0x800e3204; // coined; docs/systems/combat.md: the floor height last found under the aim cylinder
CombatSpellFx.FadeRamp = 0x800e3210; // coined; docs/systems/combat.md: int 0..30, up while CastWindow runs and down after; AuraFade = cos(FadeRamp / 30 x 90 degrees)
CombatSpellFx.LoadDelay = 0x800e3214; // coined; docs/systems/combat.md: byte, frames to wait before the next aura scene loads (5 after a load)
CombatSpellFx.AuraFade = 0x800e3230; // coined; docs/systems/combat.md: f32, the aura alpha's factor
CombatSpellFx.AuraLength = 0x800e3234; // coined; docs/systems/combat.md: u16, 125 ticks: one aura's hump
CombatSpellFx.AuraTime = 0x800e3238; // coined; docs/systems/combat.md: u16, ticks into the playing aura's hump; advances only while CastWindow is 0
CombatSpellFx.CastWindow = 0x800e323c; // coined; docs/systems/combat.md: u16, 300 after every normal cast, counting down; auras are held back while it runs
CombatSpellFx.SkyTimer = 0x800e323e; // coined; docs/systems/combat.md: s16, 150 after a cast, then the sky brightens
CombatSpellFx.AuraCount = 0x800e3246; // coined; docs/systems/combat.md: u16, auras waiting or playing in the whole battle
CombatSpellFx.SkyDimmed = 0x800e3248; // coined; docs/systems/combat.md: byte
CombatSpellFx.FreeVisuals = 0x800e3224; // coined; docs/systems/combat.md: pool A's free-index array (u16 x 64), with the count at 0x800e3240
CombatSpellFx.FreeActors = 0x800e3228; // coined; docs/systems/combat.md: pool B's free-index array (u16 x 128), with the count at 0x800e3242
CombatSpellFx.FreePlayers = 0x800e322c; // coined; docs/systems/combat.md: pool C's free-index array (u16 x 16), with the count at 0x800e3244
Sky.FadeBrightness = 0x8001de88; // coined; docs/systems/rendering.md: (goal, ticks): Sky.BrightnessGoal = goal, Sky.BrightnessStep = (goal - brightness) / ticks
Sky.Brightness = 0x800d9518; // coined; docs/systems/rendering.md: f32, multiplied into all five sky colours (SkyColors.At) and the backdrop; 1.0, 0.5 while a spell's sky is dimmed
Sky.BrightnessGoal = 0x800d951c; // coined; docs/systems/rendering.md: f32
Sky.BrightnessStep = 0x800d9520; // coined; docs/systems/rendering.md: f32 per tick, 0 when settled; RenderSky steps Sky.Brightness by it
Sky.SunDirection = 0x800d9524; // coined; docs/systems/rendering.md: 3 f32, set by 0x80029f20 from the time of day (height 360 x tod - 90 degrees)
Sky.MoonDirection = 0x800d9538; // coined; docs/systems/rendering.md: 3 f32 (x, y, z) set by 0x8002a090; y > 0 means the moon is up and Bodies.SetLights adds its light
SkyObjects.UpdateDirections = 0x80029e84; // coined; docs/systems/rendering.md: for each sky object, the sun's (0x80029f20) or the moon's (0x8002a090) light direction
SkyObjects.UpdateSun = 0x80029f20; // coined; docs/systems/rendering.md: the sun's height 360 x tod - 90 and azimuth to Sky.SunDirection
SkyObjects.UpdateMoon = 0x8002a090; // coined; docs/systems/rendering.md: the moon's height 2 x (360 x tod + 90) and sway to Sky.MoonDirection, then its phase image
World.TimeOfDay = 0x8007c2c4; // coined; docs/systems/rendering.md: (world): ((world+0x20 % 0x4F1A00) / 5184000 + the offset at +0x28) wrapped into [0, 1)
World.StepTimeOffset = 0x8007c3b8; // coined; docs/systems/combat.md: (world): the time-of-day offset +0x28 moves toward its goal +0x2C by the rate +0x30
World.SetTimeOfDayGoal = 0x8007c450; // coined; docs/systems/combat.md: (world, tod, ticks, mode): holds the displayed time of day at tod (Darkness 1.0 midnight, Light 0.5 noon), easing over the ticks
World.ClearTimeOffset = 0x8007c5b8; // coined; docs/systems/combat.md: (world, ticks): the goal 0, easing the offset back
Body.IsHeld = 0x80012754; // coined; docs/systems/combat.md: (body): +0x70E set and requests +0x14, +0x16 both 0: ProcessPlayers then skips the idle animation tick; +0x16 is latched from the request at a state's animation frame 1, so a one-tick request freezes a held body mid-reaction (combat.md's lock on a hold)
Heap.LargestFree = 0x8008e9b0; // coined; docs/systems/combat.md: the largest free block of the heap, cached until the next allocation (0x800e3eb8)
Debug.RaiseError = 0x8008e4f4; // coined; docs/systems/combat.md: sets the error flag (0x800e3d88), copies two strings and posts to the error queue (0x800e3c6c): the asserts of SceneGetLocatorPos, AttachedScene and ProcessSpellVisuals
Heap.Alloc = 0x8008e6b0; // coined; docs/systems/magic.md: (size, file, line): first fit from the free list at 0x800E3D94; a failure raises the debug error
Heap.Free = 0x8008e7ec; // coined; docs/systems/magic.md: (pointer, file, line)
Debug.ErrorThread = 0x8008e460; // coined; docs/systems/combat.md: Debug.ErrorInit, then waits on the error queue (0x800e3c6c) and calls the handler at 0x800e3d8c
Debug.ErrorInit = 0x8008e4ac; // coined; docs/systems/combat.md: clears the manual-crash flag (0x800e3d88)
Heap.Alloc = 0x8008e6b0; // coined; (size, source file string, line): the smallest free block that fits (free list 0x800E3D94), Debug.RaiseError 0x182 without one; the effect records' and items' allocator
Heap.Free = 0x8008e7ec; // coined; Heap.Alloc's block back on the free list
Debug.ManualCrash = 0x800e3d88; // coined; docs/systems/combat.md: byte, set by Debug.RaiseError; CrashScreen.Draw shows "Manual Crash" and "Last gGlobals.text" while it's set
Debug.ErrorHandler = 0x800e3d8c; // coined; docs/systems/combat.md: the function Debug.ErrorThread calls, CrashScreen.Run
CrashScreen.Run = 0x80005138; // coined; docs/systems/combat.md: sets up the VI and controllers, draws CrashScreen.Draw, then loops for ever
CrashScreen.Draw = 0x80004e38; // coined; docs/systems/combat.md: "CRASH - <version>", then "Manual Crash" or the registers, then "Last gGlobals.text:"
CombatSpellFx.IsOneOf = 0x8008d160; // coined; no caller: tests a value against the list 0xCF, 0xD2, 0xCA, 0xD6, 0x76, 0x5A, 0x5B (0x800d50bc), 0 ends it; dead code
ProcessSpellVisuals = 0x8008bca0; // the original's own name, debug string 0x800e223c; docs/systems/combat.md: each live visual's frame: an actor's cast ticked to its length, a lasting scene's turn
Body.FreeAttachment = 0x80014b04; // coined; docs/systems/combat.md: one 12-byte attachment record (body +0x730): with both +0 and +4 set, queues the scene at +4 to be freed (Combat.FreeQueue) and zeroes +4
Body.FreeAllAttachments = 0x80014b48; // coined; docs/systems/combat.md: the three attachment records; FreePlayerActor's
Body.AttachmentDefaultLocators = 0x800cdc0c; // coined; docs/systems/combat.md: 3 u16, the locator each attachment slot starts on: 0, 2, 3 (Combatant.DefaultLocators)
Combat.FreeQueue = 0x800d96b0; // coined; docs/systems/combat.md: AllocFreeQueueItem's queue of scenes freed later
Scene.HasLocator = 0x8009eae8; // coined; docs/systems/combat.md: (scene, i): i < 8 and the scene's locator table (+0x1d4 + 4i) isn't -1; RenderPlayers skips an attachment without one
Scene.SetPosition = 0x8009d960; // coined; docs/systems/combat.md: scene +0xb8..+0xc0 = x, y, z
Scene.Translate = 0x8009d970; // coined; docs/systems/combat.md: adds x, y, z to scene +0xb8..+0xc0: the Troubadour's notes' +1.0 in Y (Combatant.NotesRaise)
Scene.SetMatrix = 0x8009f1c8; // coined; docs/systems/combat.md: copies a 4x4 into scene +0x88: an attachment's locator matrix
Scene.SetScale = 0x8009dbcc; // coined; docs/systems/combat.md: the scene's scalar (+0x1c8..+0x1d0, which billboards are sized by) and the matrix's rows renormalised and scaled by it: RenderPlayers' body scale
Scene.ScaleMatrix = 0x8009dc6c; // coined; docs/systems/combat.md: the scene's scalar and the matrix's rows scaled by it, not renormalised: RenderPlayers' doubled attachments
Scene.UseOwnMatrix = 0x8009e3b4; // coined; docs/systems/combat.md: scene flag 0x4 (+0x1f4), so Borg5Scene.Evaluate starts from the scene's +0x88 matrix: an attachment's
Scene.EnableFog = 0x8009e590; // coined; docs/systems/combat.md: scene flag 0x100 (+0x1f4), the fog Scene.SetRenderMode reads
Mtx.Multiply = 0x800a280c; // coined; docs/formats/scenes.md: (out, a, b): out = b x a, row vectors (SceneGetLocatorMtx's)
ItemTables.WeaponModels = 0x8006cdd4; // ItemTables.WeaponModels (HBHT.Rom); docs/formats/db.md: a weapon's table position to its Borg5 through CodeTable.WeaponsWithModels and WeaponModels, -1 for none
Combatant.UndrawnWeapons = 0x800d2a0c; // CombatRecord.UndrawnWeapons (HBHT.Plugins); docs/systems/combat.md: 8 entity list places, 0xff ends: Shamsuk, the Gorgon, the Chaos Lieutenant, the Harpy, the Marquis, the Minotaur, the Minotaur Lord, Niesen
Body.PressDown = 0x800cdb48; // Body.cs (PressDown); docs/systems/movement.md: f64 0.03, ProcessPlayers' push down a frame on a body on plain collision (surfaces 1, 2)
PlayerMotion.Falling = 0x800cdb60; // PlayerMotion.Falling (HBHT.Core); docs/systems/movement.md: f64 -0.048: falling at or past it, a body of Alaron's actor (+0x70B) doesn't steer or move by its animation
PlayerMotion.GroundRuleReach = 0x800cdb40; // coined; docs/systems/movement.md: f64 0.05, how far below the ground rule sweeps for ground other than plain collision
Body.FellBackSpeed = 0x800cdb68; // coined; docs/systems/movement.md: f64 -0.3: falling faster, ProcessPlayers puts Alaron back at Body.GroundBefore
Body.LastGround = 0x800e6810; // coined; docs/systems/movement.md: Alaron's last place touching the ground at least 1 from the one before (x, y, z, then the camera's 2 shorts at +0x18)
Body.GroundBefore = 0x800e681c; // coined; docs/systems/movement.md: the place Body.LastGround held before, where a fall faster than 0.3 puts him back
PakSave.WeatherSnapshot = 0x800e6830; // coined; docs/systems/saves.md: 16 bytes Weather.Pause fills from the world (floats from +8, +0xC and +0x10, and the byte at +6) and SaveBlock.Write saves x 1000
SpherePhysics.Ground = 0x800a4570; // SpherePhysics.Ground (HBHT.Core); docs/systems/movement.md: (grid, from, to, radius, hit, normal): a sphere swept through the cells, skipping surfaces 1 and 2; the ground rule's
Collision.SphereCells = 0x800a3fb4; // coined; docs/systems/movement.md: (grid, sphere, ...): the cells a sphere's box (speed across the ground + radius + 1) covers, clamped to the grid
Collision.SweepCells = 0x800a3e50; // coined; docs/systems/combat.md: (grid, from, delta, radius, &x0, &z0, &x1, &z1): the cells a sweep's box (its length across the ground + radius + 1) covers, clamped to the grid
SpherePhysics.Step = 0x800a47cc; // SpherePhysics.Step (HBHT.Core); docs/systems/movement.md: (sphere, ..., ticks): the ticks of gravity and velocity, then one collision with the cells around it; Bodies.Process calls it once a frame for each body
SpherePhysics.Inside = 0x800a4ac0; // SpherePhysics.Inside (HBHT.Core); docs/systems/movement.md: whether a point is inside a triangle seen along the axis its normal is nearest, the other two kept; MovingPlane hands it the sphere's centre off the plane
SpherePhysics.MovingPlane = 0x800a4da4; // SpherePhysics.MovingPlane (HBHT.Core); docs/systems/movement.md: a moving sphere against a triangle's plane, and how deep: none behind it by more than the radius, else the centre moved along the velocity by centre / (centre + depth) must be Inside
SpherePhysics.SweepPlane = 0x800a4f7c; // SpherePhysics.SweepPlane (HBHT.Core); docs/systems/movement.md: whether a sphere's front, moving by a delta, crosses a triangle
SpherePhysics.Edge = 0x800a5148; // SpherePhysics.Edge (HBHT.Core); docs/systems/movement.md#narrow-gaps: a sphere against an edge its triangle flags (each edge flagged on its first triangle): only where the edge passes the segment from the centre a radius along the velocity, measured to the point on the edge at the segment's share; none standing still
SpherePhysics.SweepPlane = 0x800a4f7c; // SpherePhysics.SweepPlane (HBHT.Core); docs/systems/movement.md: whether a sphere's front, moving by a delta, crosses a triangle
SpherePhysics.Edge = 0x800a5148; // SpherePhysics.Edge (HBHT.Core); docs/systems/movement.md: a sphere against an edge the triangle flags as open
SpherePhysics.Vertex = 0x800a53b0; // coined; docs/systems/movement.md: a sphere against a corner the triangle flags as open
SpherePhysics.SphereGap = 0x800a5480; // SpherePhysics.PushApart (HBHT.Core); docs/systems/wanderers.md: (sphere, r1, pos2, r2, &gap, &n, &point): n the flat way to the other over its length (at least 1e-6, a divide per axis), gap = length - r2, touching unless r1 < gap
Vec3.AddTo = 0x800a571c; // coined; docs/systems/movement.md: (a, b): a += b, as the collision adds gravity to velocity and velocity to place
SpherePhysics.Bounce = 0x800a5784; // SpherePhysics.Bounce (HBHT.Core); docs/systems/movement.md: turns velocity heading into a triangle away from it
Vec3.AddScaled = 0x800a5884; // coined; docs/systems/movement.md: (a, dir, scale): a += dir * scale, as a hit pushes the sphere out along the normal
SpherePhysics.Dampen = 0x800a58c8; // SpherePhysics.Dampen (HBHT.Core); docs/systems/movement.md: each axis of velocity times 1 - |normal's|, skipped for a normal within 20 degrees (0.9397, 0x800d57e0) of the pass's last contact; then times the surface's keep
SpherePhysics.Collide = 0x800a5b4c; // SpherePhysics.Collide (HBHT.Core); docs/systems/movement.md: one pass of a sphere over the triangles of its grid cells, counting contacts per cell
SpherePhysics.PushApart = 0x800a634c; // SpherePhysics.PushApart (HBHT.Core); docs/systems/wanderers.md: (self, scale, other, scale, &dist): SphereGap, then Bounce, pos += n * (gap - r1) to exactly touching, Dampen; sphere flag 1 on either touches without moving
SurfaceTable = 0x80362768; // coined; docs/systems/movement.md: 12 bytes a surface ID, an environment's and a property block's pointers; the keep at the block's +4, 1.0 for surfaces 1 and 2 and 0 for the rest
