{
  "project": "Castlevania Symphony of the Night Java / HTML5 reconstruction",
  "milestone": "0.19.0",
  "completeGameRebuilt": false,
  "runtime": "Editable Java compiled to ES2015 JavaScript by TeaVM 0.16.0; HTML5 Canvas renderer",
  "emulatorUsed": false,
  "referenceCommit": "0622fcfd37311fd21baf2938c6bd74cea63005ba",
  "systems": [
    {
      "system": "Original disc preservation",
      "status": "complete",
      "label": "VERIFIED COPY",
      "detail": "Both original files are preserved byte for byte. Source and archive SHA-256 hashes match. A complete ISO inventory records 296 files and 65 directories. This proves copy identity, not original pressing authenticity."
    },
    {
      "system": "Java binary tools",
      "status": "complete",
      "label": "IMPLEMENTED & TESTED",
      "detail": "Editable Java reads raw disc sectors, inventories ISO9660, extracts files and produces a static MIPS instruction listing. All 361 entries and 13 selected extracted files match an independent decoder. Instruction listings are evidence for reverse-engineering, not recovered game source."
    },
    {
      "system": "Original character and room art",
      "status": "complete",
      "label": "RECOVERED FROM THE DISC",
      "detail": "218 Alucard sprites, RGB555 palettes, frame pivots and animation tables are recovered from ARC_F.BIN, F_GAME.BIN and DRA.BIN. All 28 original Castle Entrance room entries have original texture layers, tilemaps and collision codes. The disc also supplies twelve bat frames, ten zombie frames in three palettes, two candle frames, small hearts, eleven large-heart frames, twenty-two gold frames,72 subweapon poses with160 parts, a white-flash atlas, the original exchange sparkle and eight small explosion frames. Original opaque and STP pixels are separated for rendering; Canvas color arithmetic approximates PSX blending. Remaining art and dynamic effects await recovery. The original axe texture is recovered with both alternating palettes and opaque/STP masks; raw RGB555 shade rows and exact sine words feed its trail. Original Holy Water bottle frame29 and eight flame UV slices are recovered; glass uses source colored triangles."
    },
    {
      "system": "Original object placements and enemies",
      "status": "partial",
      "label": "BATS & ZOMBIES PORTED",
      "detail": "Original room object tables retain their fields and binary offsets. Four bats in room 7 use original hanging, wake, drop and flight steps. Room 2 retains both zombie spawner records, which share one persistent slot. Java implements their alternating sides, randomized delays, eight-zombie pool and room-edge limits, plus emergence, walking and sinking. Original timing and three zombie palettes feed the renderer. Each enemy system has an isolated random stream; camera activation and room lifecycle remain test approximations. The manual spawning switch stands in for an unported opening event."
    },
    {
      "system": "Candles, rewards and subweapon exchange",
      "status": "partial",
      "label": "ORIGINAL OBJECT SUBSET",
      "detail": "All 40 original candles in nine rooms retain their placements, animation and reward IDs. Java implements hearts, all ten gold denominations and all nine subweapon pickup definitions. The three original dagger, holy-water and stopwatch candle branches are supported. Collecting a different subweapon equips it and tosses the old prize in the same slot; an already-equipped drop becomes a large heart. Source motion, field sensors, flash/cooldown, sparkle timing and expiry are preserved within the local collision/allocation proxy. Version 4 checkpoints save equipment and accept versions 2/3. The relic switch, 299-heart cap, starting-equipment chooser and room lifecycle remain test controls. The remaining cosmetic helpers, original sounds, full inventory and the complete stage loader are unfinished."
    },
    {
      "system": "Original dagger attack",
      "status": "partial",
      "label": "FIRST SUBWEAPON ATTACK",
      "detail": "The US dagger definition costs one heart and allows three active daggers in the original 16-slot pool. Java ports eight one-pixel flight probes, hitbox, exact recovered sine table, rotating wall bounce, RGB fade and enemy-hit lifetime. Original texture, palette and additive trail are rendered locally. Up/W plus Z/J throws an equipped dagger. Factory scheduling, primitive allocation, player pose, terrain/combat integration and base damage 5 are local test bridges; full stats/defense, wall-hit sparks, sounds and other subweapon attacks remain unfinished. Fresh scene selection or Restart clears currency, equipment and projectiles. Ordinary room seams clear projectiles while preserving carried currency and equipment. Checkpoints load saved values and clear projectiles."
    },
    {
      "system": "Original axe attack",
      "status": "partial",
      "label": "SECOND SUBWEAPON ATTACK",
      "detail": "AxeWorld.java restores the US base cost 4/chain 2, gravity-before-movement arc, spin, exact integer sine geometry, five primitive trail ring, raw RGB555 shade rows, two clock-alternating palettes and Y-only expiry. Axes pass through terrain. The original hitFlags2 deflection branch is independently tested, while the current local battle bridge does not generate that feedback. Axes and daggers share 16 logical slots and a bounded 256-primitive test budget. Base attack 10, factory admission, player pose and combat integration remain local proxies; full battle stats, Heart Broach equipment, audio and remaining cosmetic helpers remain pending. The manual room2 setup equips an axe and 20 hearts without saving. NO3 has no original axe candle. Canvas sampling/blending approximates the PSX pipeline; relative axe-below/dagger-above player priorities are restored."
    },
    {
      "system": "Original Holy Water attack",
      "status": "partial",
      "label": "THIRD SUBWEAPON ATTACK",
      "detail": "HolyWaterWorld.java restores the original cost 3/chain 3 bottle, supported floor/wall correction helpers, eight glass triangles, four timed green flames and their original rising green particles. Bottle and flames use separate source attack definitions (base 1/base 8), shared 32..47 slots, source trig/UV clock, RGB fade and intermittent hitboxes. Glass uses reverse 32..63 slots and original flat colors/movers. The verified BIOS random recurrence runs as new Java arithmetic with an authored seed/call phase in the shared selected Bible/Cross/HolyWater stream; no firmware is executed or read by the runtime. Next-tick factories, the bounded 256-primitive budget, player pose and once-per-target combat remain test bridges. Unsupported collision shapes, full battle stats, audio, inventory and remaining cosmetic helpers remain unfinished. The manual room2 setup equips Holy Water and 20 hearts without saving; the original room5 pickup remains available. Canvas preserves original per-channel RGB555 inputs and approximates rasterization/blending. The separate green-particles.json recovers eight untextured 1x1 tiles, RGB63/240/63, the zero-width draw-mode sentinel, player+4 priority, original random offsets/upward motion and twice-decremented timer. Canvas adds the RGB555 quarter-foreground contribution; no particle texture is invented. The bounded 256-primitive proxy admits the ordinary three-bottle effects while explicit lower-capacity failures remain tested."
    },
    {
      "system": "Original Cross attack",
      "status": "partial",
      "label": "FOURTH SUBWEAPON ATTACK",
      "detail": "CrossWorld.java restores the original100-heart/chain1 beam, six giant crosses emitted24 calls apart and45 blue particle births. CrossMath.java ports direct integer matrix/projection math using recovered mesh/UV data, the distinct4096 packed SDK trig words and translation sine table. Source backface culling, center-depth/player148 priority, screen anchoring, byte hitboxes, grayscale ramp and lifetimes are retained. The recovered asset set includes three original mesh palettes, blue textures and the direct RGB555 beam strip. Next-tick factories, bounded256 primitive allocation, the320-pixel viewport, local heart cap299, screen-to-world combat and base5/40 once-per-target damage are explicit bridges. Original dynamic heart upgrades, complete battle/player/global GPU/factory/RNG integration, audio and the full campaign remain unfinished. The manual200-heart hall fixture does not save and invents no NO3 Cross candle."
    },
    {
      "system": "Original Bible attack with explicit orbit correction",
      "status": "partial",
      "label": "FIFTH SUBWEAPON ATTACK",
      "detail": "BibleWorld.java ports the US cost5/chain1 book and BP79 trails, radius48 growth, counter300 accelerating exit, source screen bounds, captured screen positions, depth priority and seven gray levels. The US binary reads an uninitialized inherited register in the orbit; Java explicitly sets it to zero for each callback as an authored FIX_UB-style stabilization, not recovered US ABI state. The original16x24 book and16x16 trail texture/palette masks come from the disc. Its seven recovered Bible files reproduce in Java alongside the earlier assets. Shared selected RNG, bounded256 primitive allocation, next-tick factories, base8 damage, timer/player pose and camera-to-world combat retain documented bridges. Full original battle/global dispatch/GPU/audio and campaign remain unfinished. The manual20-heart room2 setup does not save or invent a Bible candle."
    },
    {
      "system": "Original Stopwatch and selective enemy freeze",
      "status": "partial",
      "label": "SIXTH SUBWEAPON ATTACK",
      "detail": "StopwatchWorld.java restores US cost20/chain1, three clock/digit quads,48-tick player animation184/185, source rise/settle/bounce/follow,81-callback countdown, white shrink,16 expanding ring quads and20 final tiles. StageUpdateGate.java freezes initialized normal bat/zombie callbacks while step0 initializes and immune spawners/candles/drops continue; flag100 immunity and flag200 every-fourth-call updates retain source rules. The disc supplies normal/white clock, digits and ring texture masks. All174 generated files reproduce; all170 prior generated files are unchanged. Source ring UV2==UV3 remains valid through destination barycentric rendering, with original per-vertex RGB gradient and ABR1. World-coordinate player/camera following, cutscene-pause test input, same-call local-stage gating, next-tick factories, shared256 allocation and sound counters are explicit bridges. Full player-lock/camera/shake compositor, main-loop scheduling, battle, audio and campaign remain unported. The60-heart manual room2 test does not overwrite saved checkpoints."
    },
    {
      "system": "Original Rebound Stone and radial bounce particles",
      "status": "partial",
      "label": "SEVENTH SUBWEAPON ATTACK",
      "detail": "ReboundWorld.java restores US cost2/chain3,16 untextured LINE_G2 records, source jitter and asymmetric bounce helpers, six Y-before-X virtual probes/four-pixel motion, source timers/gray fades/64-call tail and BP10 radial bursts. ReboundTerrain.java retains all256 original collision effect values with slopes, one-level neighbor recursion, special types and default-NONE, in isolation from earlier player/enemy physics. Each bounce emits three groups at period3; each has eight gray2x2 tiles, eight allocated-child RNG draws, six-unit fading and20th-call destruction. The recovered Rebound data remains unchanged among the current 174 generated files and 179 static hashes. World camera, next-tick factories, bounded256 resources, base8 once-per-target battle/player pose/RNG phase and sound counters remain explicit bridges. Canvas retains source colors and ABR1 while exact line rasterization/background/global OT remain incomplete. Manual20-heart hall and original room3 dagger-candle setups do not save or invent a Rebound reward. Full battle/audio/player/global dispatch and campaign remain unfinished."
    },
    {
      "system": "Original Vibhuti ash attack",
      "status": "partial",
      "label": "EIGHTH SUBWEAPON ATTACK",
      "detail": "VibhutiWorld.java restores US cost 3/chain 2/base 8, twelve opaque white particles plus a zero-width control, source angle/speed draws, side-stop probes, move-before-gravity and fractional-Y landing corrections. Landing grows each tile from 2×2 to 3×3 and stops it. Only the first eight rotate through the 4×4 hitbox; previous hit feedback hides the previously selected tile. Source timer 128 permits 127 live callbacks, then destroys; the final twelve callbacks hide tiles 11..0. VibhutiTerrain.java supplies isolated effects/upward corrections. Its recovered data remains unchanged among the current 174 generated outputs and 179 static hashes. World camera, next-tick BP26 factory, bounded 256 resources, base 8 once-per-target battle/player pose/RNG phase remain explicit bridges. Canvas draws original opaque colors. Manual 20-heart hall and original room3 dagger-candle setups do not save or invent a Vibhuti reward. Full battle/audio/global dispatch/GPU/campaign remain unfinished."
    },
    {
      "system": "Original Agunea bolt and lightning ribbon core",
      "status": "partial",
      "label": "NINTH BASIC SUBWEAPON ATTACK",
      "detail": "AguneaWorld/AguneaMath restore US base10/cost5/chain1, six-pixel gradient bolt, target attachment, held-input repeat, source5/2/1 Heart Broach admission/repeat costs, forty-strip ribbons, exact quarter-sine/ratan2 data and original steering/geometry defects. Source mode6 draws normal/white nonzero STP texels opaque; the hidden first strip, one-call white flash and RGB96 fade to floor16 are retained. Release uses the existing signed counter and threshold16. The previously recovered bolt/ribbon files remain unchanged. BP61/2 player outlines are now restored; the selected BP44/52 flash is restored. Stable target identity, camera, next-tick jobs, bounded256 resources and once-per-pulse base10 damage are explicit local bridges. The marked160HP target and Agunea-only accessory selector are authored local controls outside checkpoints. Full battle, original pointer reuse/global dispatch/GPU/RNG phase, inventory, audio and campaign remain unfinished."
    },
    {
      "system": "Original Agunea expanding player outlines",
      "status": "partial",
      "label": "SOURCE EFFECT RESTORED",
      "detail": "PlayerOutlineWorld restores BP61/param2: three original children five callbacks apart, initial brightness 192, eight-call hold, scale growth by eight and brightness decay by five. Thirty-eight growth calls survive; the thirty-ninth destroys before geometry. The live CLUT259 comes from original player palette operation0x16: index10 gray STP, other nonzero entries black STP. Raw indices, all218 sprites and263 frame records preserve that sparse texture. Current-frame/facing offsets, asymmetric left UV and signed16 scale truncation retain source behavior. The recovered outline files remain unchanged among the current 174 generated outputs and 179 static hashes. The local player scale/pivots, post-animation family phase, world camera, transparent neighboring padding/dynamic upload, bounded256 allocation and selected Canvas ordering remain explicit bridges. Afterimage suppression is counted; its original player system, other blink profiles, full battle/audio/GPU/campaign remain unfinished. The existing local Agunea setup tests this effect without saving checkpoints."
    },
    {
      "system": "Original Agunea initial player flash",
      "status": "partial",
      "label": "SELECTED SOURCE FLASH RESTORED",
      "detail": "PlayerBlinkWorld restores normal Alucard BP44/parameter0x5200 with eight original GT4 fans, white CLUT15F, per-vertex RGB and sequential sine phases. Twenty-six rise calls reach intensity256; the hold scans any primary Agunea entity17. Bolt loss immediately starts the fade with an unused residual19, then25 fade calls survive and the26th destroys. Without a bolt:53 drawable callbacks/54th destruction. Original duplicate scanning, critical factory retry, primitive retry, current-pose/facing/scale refresh and scalar-helper fan rewrites are tested. New raw-index white texture masks plus JSON bring174 generated outputs/179 static hashes; all170 previous outputs are unchanged. Selected next-tick/late-pose/camera/resource/upload-padding/afterimage-request/Canvas raster phases remain bridges. Other blink profiles, rotated/transformed player integration, full battle/audio/GPU and the complete campaign remain unfinished."
    },
    {
      "system": "Java player playtest",
      "status": "partial",
      "label": "FIRST PLAYABLE SUBSET",
      "detail": "New Java implements 16.16 fixed-point movement and data-driven animation timing. Walk speed 1.5 and initial jump speed -4.875 are confirmed in the original binary. Other reference motion values are documented. The full original player state machine is not yet ported."
    },
    {
      "system": "Terrain and combat",
      "status": "partial",
      "label": "TEST SYSTEMS",
      "detail": "Basic player terrain traversal and sword targets test the Java loop. Zombie landing, walking and selected heart/gold terrain probes use original ordering and correction for implemented floor shapes; remaining collision types are conservatively blocked. Player collision remains simplified. Sword hit windows, pickup overlap, damage response and contact immunity use authored test rules. Remaining death effects, sounds and the full battle system are unfinished."
    },
    {
      "system": "Castle Entrance room navigation",
      "status": "partial",
      "label": "LOCAL STAGE TEST",
      "detail": "Original inclusive screen bounds and collision grids feed a Java room registry. The test has ordinary adjoining-room transitions, a vertical camera and room-aware checkpoints. Scripted connector rooms 19/20 are deliberately blocked; four exits to other stages and original door/event/loading behavior await reconstruction. Body clearance and collision response are approximations."
    },
    {
      "system": "Browser build and editable source",
      "status": "complete",
      "label": "REBUILDABLE",
      "detail": "Java runs natively on the JVM and compiles to an HTML5 module with source maps. The local package includes a pinned JDK, Maven and dependencies for offline rebuilding. Runtime assets use local paths; no sign-in is required."
    },
    {
      "system": "Enemies, items and progression",
      "status": "pending",
      "label": "AWAITING JAVA PORT",
      "detail": "Remaining enemy behavior, boss fights, remaining subweapon attacks and remaining item behavior, inventory, equipment, spells, transformations, leveling, map exploration, external-stage transitions, save rooms, scripted events and endings still need reconstruction and validation."
    },
    {
      "system": "Audio and full campaign parity",
      "status": "pending",
      "label": "AWAITING JAVA PORT",
      "detail": "Original music, sound effects, dialogue, cutscenes, opening Richter sequence, menus and full castle campaign are not implemented. Full fidelity requires a function-by-function port and gameplay comparison against the preserved release."
    }
  ],
  "localOnly": true
}
