Continue the Hwanse Chwihojeon web-port goal in docs/GOAL.md until resource extraction, viewer/rendering, runtime loading, movement/input, normal progression, event/dialogue/battle systems, and completion gates are backed by concrete artifacts and verifiers.
FalseFalseblockedFalse| id | status | requirement | artifacts | gaps |
|---|---|---|---|---|
| inventory | complete | File inventory analysis for the original archives, executable, save folders, tools, and docs. | docs/INVENTORY.md (ok)docs/GOAL.md (ok) | - |
| binary-formats | partial | Binary/container format reconstruction for FLD/WLK/MLK/CNS and known runtime data surfaces. | docs/FORMATS.md (ok)docs/CNS_FORMAT.md (ok)out/event_vm_semantics_gap.html (ok) | Full event/object VM instruction length, operand layout, route dispatch, and story mutation proof remain open. |
| resource-extraction | complete | Resource extractors for original archives and browser-ready assets. | tools/extract_wlk.py (ok)tools/extract_mlk.py (ok)tools/decode_cns.py (ok)tools/build_web_assets.py (ok)web/cns_rect_review.html (ok)web/audio_review.html (ok)web/monster_review.html (ok)out/audio_archive_manifest.html (ok)out/audio_title_provenance.html (ok) | - |
| title-and-map-rendering | partial | First screen or at least one map rendered in the browser with reviewed map rendering. | extract_fld/title.cns (ok)out/title_start_browser_summary.json (ok)out/home_landing_browser_smoke.json (ok)out/maps_runtime_chunks/map1_02b.js (ok)out/maps_runtime_chunks/map1_01a.js (ok)web/index.html (ok)web/map_review.html (ok) | Expected all field maps to be covered by direct accepted rows with no family-default or fallback render rows. |
| runtime-loading | complete | Runtime loading of maps, text, battle backgrounds, dialogue blocks, and save samples. | out/maps_runtime.js (ok)out/text_tables.js (ok)out/battle_backgrounds.js (ok)out/event_dialogue_blocks_runtime.js (ok)tools/verify_runtime_http.py (ok) | - |
| movement-input | partial | Input, walking, collision, projection, mobile controls, party trail, and movement feedback. | out/runtime_movement.html (ok)out/movement_candidate_review_summary.json (ok)tools/verify_candidate_movement_browser.py (ok)tools/verify_mobile_runtime_controls.py (ok) | Original frame timing, input masks, 16px tile/camera projection, draw-prep/projected-coordinate consumption, input-driven actor tile mutation, party actor draw projection from tile/trail entries, +0x28 sprite frame selector/source-rect/offset consumer, opcode 0x21 script/timer frame selector path, party actor +0x68-to-+0x64 frame-script descriptor tables for cara_at1/cara_rs1/cara_sm1, descriptor table rows 0..2 vs 3..11 classification, save-load active descriptor materialization through 0x00432323, web source-rect selector mapping, exact 8-command selector cadence, browser 48ms sub-tile interpolation, original collision flag tests, directional latch fallback cases, actor-overlap collision response, CNS layer1 collision flag grid, default web original layer1 collision mode, original companion tile/direction trail ring with initial cursors 0,4,1 and post-mutation leader-tile write timing, default web party actor-overlap collision, and 7-slot web party-trail cursor history are now identified. The original actor position model is tile-field snap plus fixed-point draw projection, while browser interpolation is classified as a visual overlay and not original proof; original actor interpolation timing remains unproven, and current selector 2:0 active order plus scripted behavior for non-player descriptors are still inferred. |
| normal-progression | partial | Confirmed normal-route progression, map transitions, strict hotspots, and route promotion. | out/route_promotion_gate.html (ok)out/route_blocker_evidence_matrix.html (ok)out/runtime_trace_execution_probe.json (ok)out/strict_source_hotspot_external_review_packet.html (ok)out/savedata_slot_scan.html (not generated) | 1 confirmed-route blocker(s) remain. The current route stops at map1_01a because no strict source coordinate has been found for map1_01a -> map2_02d. routeAssist is a trial/debug route continuation, not confirmed normal-route evidence. The current VM has Wine tooling installed, but qemu-i386/WineDbg control probes fail even for notepad, so the Hwanse2.exe runtime trace cannot be captured here yet. A non-debugger /proc memory snapshot can read Hwanse2.exe globals, but the latest idle sample is not route-path proof. Embedded execution-probe binfmt view: registered=True, enabled=True; summary view enabled=True. The qemu-i386 binfmt state is consistent with the child/debugger trace availability check. Direct qemu-i386 can run both the Wine loader smoke (wine-9.0 (Ubuntu 9.0~repack-4build3)) and CLI child exec smoke (Microsoft Windows 10.0.19043); the remaining blocker is the WineDbg/runtime trace path. A bounded X/input-buffer probe confirms Wine DirectInput can see held synthetic keydowns, but ordinary X key events did not move the idle selected pointer. Direct cached-key-buffer pokes moved the selected pointer only to non-route selector 50:0, not current selector 2:0. This remains input-path diagnostic evidence, not route proof. A bounded direct key-buffer sequence probe covered 28 sequence(s) after 14.0s startup wait and reached route selector 2:0=False; it remains non-promoting diagnostic evidence. A supplemental input-path prelude key-buffer probe covered 3 sequence(s), observed selectors=8:0,50:0, and reached route selector 2:0=False; it is diagnostic-only. A non-debugger selected-pointer poll covered 1550 sample(s) across 8 direct key-buffer sequence(s), observed selectors=8:0, and reached route selector 2:0=False; it still does not replace a watchpoint trace. A supplemental input-path selected-pointer poll covered 491 sample(s) across 3 direct key-buffer sequence(s), observed selectors=8:0,50:0, and reached route selector 2:0=False; it is also diagnostic-only. A supplemental long selected-pointer poll covered 1928 sample(s) across 5 custom key-buffer sequence(s), observed selectors=8:0,50:0, and reached route selector 2:0=False; it is also diagnostic-only. A supplemental late-start selected-pointer poll waited 45.0s, covered 1122 sample(s) across 1 key-buffer sequence(s), observed selectors=8:0,50:0, and reached route selector 2:0=False; it is also diagnostic-only. A supplemental route watch-value poll covered 1123 sample(s) across 1 key-buffer sequence(s), observed selectors=8:0,50:0, watchValues=opcode24CurrentObjectIndex=0x00x1123; opcode24Mode1Source=0x00x1123; opcode24RuntimeFlag=0x00x783,0x01x340, and reached route selector 2:0=False; it is also diagnostic-only. A supplemental standalone synthetic selector 2:0 poll staged a save-shaped file under SaveData\savedat1.dat, ran the input-path prelude with case aliases, and covered 374 sample(s) across 2 load-menu candidate sequence(s), inputQuality=pid=2/2 base=2/2 keyWrites=2/2 pressedSeq=2/2 pressedEvents=18 offsets=28,208, stagedSelectors=2:0, observed selectors=8:0, observedStaged=False, and reached route selector 2:0=False; this keeps standalone synthetic selector 2:0 non-promoting. A supplemental patched public-base selector 2:0 diagnostic poll staged a public save with only selector/position bytes patched under SaveData\savedat1.dat, ran the input-path prelude with case aliases, and covered 375 sample(s) across 2 load-menu candidate sequence(s), inputQuality=pid=2/2 base=2/2 keyWrites=2/2 pressedSeq=2/2 pressedEvents=138 offsets=28,208, stagedSelectors=2:0, observed selectors=2:0,10:0, observedStaged=True, and reached route selector 2:0=True; this proves the load path can select a constructed 2:0 save-shaped diagnostic, but it is not a captured gameplay save. A supplemental SaveData file-I/O trace probe (winedebug) placed a public save under SaveData/savedat1.dat but inputTraceUsable=False (pidRuns=0/1, keyWriteRuns=0/1); absent savedat lines remain backend-feasibility evidence, not load-menu proof. A supplemental SaveData file-I/O trace probe (strace) placed a public save under SaveData/savedat1.dat but inputTraceUsable=False (pidRuns=0/1, keyWriteRuns=0/1); absent savedat lines remain backend-feasibility evidence, not load-menu proof. A supplemental attached SaveData file-I/O trace probe (strace-attach) placed a public save under SaveData/savedat1.dat and had inputTraceUsable=True (pidRuns=1/1, keyWriteRuns=1/1, matchedFileIoLines=0, savedat1Access=False); this rules out savedat file access only for the bounded attached load-menu candidate window, not the full load-menu path. A broader attached SaveData file-I/O trace probe (strace-attach) placed a public save under SaveData/savedat1.dat and had inputTraceUsable=True (pidRuns=8/8, keyWriteRuns=8/8, matchedFileIoLines=0, savedat1Access=False); this rules out savedat file access across the covered bounded load-menu candidate windows, not the full load-menu path. A case-alias attached SaveData file-I/O trace probe (strace-attach) placed a public save under SaveData/savedat1.dat with temporary resource archive aliases and had inputTraceUsable=True (pidRuns=8/8, keyWriteRuns=8/8, matchedFileIoLines=0, savedat1Access=False); aliases reduce archive lookup noise but still do not prove full load-menu reachability. |
| event-dialogue-battle | partial | Dialogue, event, save-point, object, party, item, shop, equipment, and battle gameplay systems. | out/event_vm_semantics_gap.html (ok)web/battle_analysis.html (ok)web/battle_formula_calculator.html (ok)out/dialogue_candidate_review_summary.json (ok)web/battle_simulator.html (ok) | Dialogue playback is still candidate/debug playback rather than confirmed event VM execution. Save-point candidate review is still candidate/debug playback rather than original inn/statue/recovery NPC save-point event execution. Linked event object previews are still candidate/prototype surfaces rather than original object/NPC descriptor execution. out/event_vm_semantics_gap.* keeps instruction-length decoding, operand layout, route-linked event VM execution, full browser event VM implementation, and story dialogue route proof outside the completed surface; browser opcode trace replay is partial and non-promoting. out/event_vm_semantics_gap.* promotion gate keeps browserReplayPromotesOriginalEventVm=False until route-linked dispatch, full instruction/operand decode, scene dialogue binding, original story flag mutation, full browser VM execution, and event-driven battle entry are proven. out/event_battle_gap_audit.* keeps route-linked event VM execution, event-driven battle entry, original enemy data/formulas/rewards, equipment offsets, status flag offsets, and story flag mutation outside the completed surface. EXE battle resource descriptors are grounded resource-load rows, not enemy rows, formations, encounter dispatch, reward tables, combat formulas, or battle-entry event execution. Battle enemy sprite candidate visuals are EXE-proximity visual evidence, not enemy row/stat/formation/reward/formula proof. |
| completion-gate | partial | Playable web-version completion gate and final objective status. | out/completion_audit.html (ok)out/completion_candidate_review_summary.json (ok)out/completion_candidate_review_summary.html (ok) | Confirmed normal route coverage is far below full-game progression. The playable completion gate is browser-local routeAssist completion, not the original full-game ending, normal-route promotion, or story flag completion. Major original game systems beyond map walking, reviewed map transitions, and candidate/prototype gameplay surfaces are not implemented. |
out/audio_archive_manifest.json + out/audio_title_provenance.json; audioExeIdNumberingUnified=True, wlkProbeRequired=Falseverified, WLK 54/54, MLK 20/20, active refs use EXE idsPCMDATA.WLK title storage absent, embedded 0, browser cue provenance 0, EXE id entries 54MIDDATA.MLK title storage standard MIDI track-name meta events, embedded 16, fallback 4completion_audit.json is achieved=false and the route hard gates still require strict hotspot, real selector 2:0 savedata, selected-root execution, and runtime trace/equivalent proof.