ORIGINAL OPENING SPRITES AND SOURCE COORDINATES

Input is the supplied USA revision0 ROM, normalized SHA256
4c15013131351e694e05f22e38bb1b3e4031dedac77ec75abecebe8520d82d5f.
No emulator or invented artwork is used. The exporter reads the ROM only.

randi-standing.png: 64x32, four16x32 cells: down, up, right, left.
entity-8a-standing.png: same64x32 arrangement, original opening special
Randi graphic. entity-c0-standing.png and entity-c1-standing.png:128x33,
four32x33 cells. All PNGs retain original indexed pixels/palette and index0
transparency. Each cell is aligned around the original actor origin.
Use opening-actors.json sourceRect and anchor fields, rather than trimming
transparent bounds or introducing a feet offset. Companion sheet anchors
are16,18; their unpadded front frame anchors are16,17. The extra row preserves
the original back/side pose bounds without moving the actor origin.

Standing entries0(front),1(back),2(side) come from the original pointer table.
The source direction loader at C0:DEE0-DEEF maps right to2 and left to82,
where the high bit supplies horizontal reflection. Original entry2 is
reflected for the left cell; no intermediate artwork is manufactured.
Frame payload format is established by original code C0:F63B-F781,
record loading C1:DFD3-E01D, and palette loading C1:E022-E06D.

Map256 actual object slots:
  slot0 / event actor4: entity8A, tile14,8, origin228,132, facing left.
       visible while event flag0C is0; interaction event0A6.
  slot1 / event actor5: entityC0, tile4,8, origin68,132, facing right.
       visibility flag00 range0..15; interaction event1A8.
  slot2 / event actor6: entityC1, tile5,8, origin84,132, facing right.
       visibility flag00 range0..15; interaction event1A9.
C0/Elliott and C1/Timothy name assignments are an explicitly labeled inference
from original event106 dialogue order and corresponding actor5/6 turns.
Actual entity IDs, slots, poses, bytes, and positions are exact original data.
No assertion that the full original opening cutscene is reproduced follows
from standing-pose export alone.

Coordinates differ between NPC records and the hero's door entrance:
  NPC C0:DE9F-DEBA performs ASL,SEC,ROL,ASL,ASL => tile*16+4 both axes.
  Hero C0:CA10-CA22 computes tile*16-0x78 camera X; C1:E0B9-E0C5
       adds0x80 => tile*16+8 actor X.
  Hero C0:CA3F-CA53 computes tile*16-0x68 camera Y; C1:E0C9-E0D5
       adds0x72 => tile*16+10 actor Y.
Thus original Door0 at tile9,8 gives Randi origin152,138, and his16x32
frame draws at144,122 using anchor8,16. Actor origins are not feet.
Coordinates wrap to original map dimensions at runtime; initial values here
are inside their map and require no wrap.

Walking frame order and timing remain UNKNOWN. Animation loader code at
C0:F50E-F63B selects script entries in bankD1; Randi record word at
100805 points to its table1137CC. Original pointers and parser locations are
preserved in the JSON for further work. Adjacent frame entries do not verify
a walking sequence. These runtime assets deliberately supply standing poses
only. The render helper does not create a guessed walking animation.

WORLD EXTENSION

world-standing.json covers the12 original species on maps128..131 plus
Randi and the opening entity8A, for14 total runtime entities. It retains
every actual object slot, visibility range, source bytes and coordinates on
all five maps. Ten humanoid sheets preserve original front/back/side poses;
four creature/prop sheets preserve original static frame0 only:
  00: Rabite. Entries0..2 are bounce poses, NOT standing facings.
  D7: original prop/state frame. Directional/state mapping unverified.
  D8: original sword. Directional/state mapping unverified.
  DB: original water graphic. Directional/state mapping unverified.
For these four, all four direction names select the SAME original frame0,
without reflection or fabricated direction states. JSON explicitly marks
directionalMappingVerified=false and staticOnlySpecies. No replacement
art is substituted for an unsupported frame.

Minimal rendering API in original-sprites.js:
  drawStanding(ctx, loadedImage, sheetMetadata, direction, originX, originY)
  originalActorVisible(actorMetadata, Uint8Array(256) eventFlags)
  drawOpeningActors(ctx, imagesByEntityId, metadata, eventFlags)
  drawOriginalMapActors(ctx, imagesByEntityId, worldMetadata, mapId, eventFlags)
The helper reads source crop/anchor metadata, disables smoothing, and draws
at native size. Original map layer priority and animation scheduling are
separate work. This helper is a reviewable reference API; the Java runtime
may consume the same metadata directly.

Reproduce with Python3 and Pillow:
  python export_opening_sprites.py --rom game.sfc --output runtime
Include other opening-map species using verified original object metadata:
  python export_opening_sprites.py --rom game.sfc --output runtime --collision-dir path/to/opening-collision
The exporter verifies every supplied object's original bytes against the
same ROM hash before selecting species. sprite-verification.json documents
pixel comparisons with an independent Java ROM decoder.

Research references (format evidence, not replacement game content):
https://github.com/Moppu/SecretOfManaRandomizer/blob/1404b7bd8552677399f24632c1e37cba37d491ef/SoMRandomizer/processing/common/structure/MapObject.cs
https://wiki.superfamicom.org/seiken-densetsu-2

Exported frame metadata records exact source pointers, original 16x16 OAM
part coordinates, tile byte offsets, palette words, original frame bytes,
and SHA256. The map metadata includes exact eight-byte object records.
