{
  "title": "Norman The Necromancer",
  "repository": "https://github.com/danprince/norman-the-necromancer",
  "commit": "5db8ca88c8038b3d0888addaa521a16db3c259a8",
  "license": "Unlicense",
  "author": "Dan Prince (danprince)",
  "localModifications": [
    "Responsive iframe layout and canvas scaling using the available stage area.",
    "Canvas-scoped pointer input; touch aim on pointerdown, cast on release.",
    "Touch buttons for resurrection, pause, all shop navigation and purchase/continue, restart, and mute.",
    "Web Audio output gain mute, audio resume on gesture, and trusted same-origin parent gamehub:setMuted bridge.",
    "Only persistent setting is gamehub:norman:muted; original game has no save/progress storage.",
    "Bilingual outer controls, visible provenance link, noindex meta; original English narrative, levels, rituals, sprites, music, and rules retained.",
    "Disable property-name mangling in port build for inspectability; original unmodified Vite build retained separately."
  ],
  "archives": {
    "upstream": "upstream-5db8ca88c8038b3d0888addaa521a16db3c259a8.tar.gz",
    "adapted": "port-source.tar.gz",
    "originalBuild": "upstream-build/",
    "licenses": "licenses/manifest.json"
  },
  "runtimeDependencies": [],
  "assetLicenseEvidence": "Upstream LICENSE.md dedicates the repository to the public domain. Sprites, Aseprite source, bitmap font metadata and synthesized music are in upstream src/. README and DEVLOG declare no separately licensed runtime assets; no external runtime URLs were found.",
  "controls": {
    "zh": "点按画布开始；鼠标/手指瞄准，松开施法；Space/复活按钮召唤尸体；P/暂停按钮；商店↑↓选择、Enter购买或继续；重开与静音按钮。",
    "en": "Tap the canvas to start; aim with mouse/finger and release to cast; Space/Resurrect raises corpses; P/Pause pauses; shop arrows select and Enter buys/continues; Restart and Mute buttons."
  },
  "description": {
    "zh": "操纵死灵法师诺曼，用弹道法术抵御村民，将尸体复活成骷髅军团；赚取灵魂并购买仪式，挑战十个关卡与国王首领。",
    "en": "Defend Norman with arcing spells, raise fallen villagers as a skeleton army, spend souls on rituals, and survive ten levels ending in a king boss fight."
  },
  "limitations": [
    "Original game has ten levels and no persistent progress; player death restarts the page as upstream intended.",
    "Original narrative and ritual descriptions remain English.",
    "Automated gameplay verifies first-level combat, resurrection, shop Continue and second-level entry; later levels and final victory are not claimed tested."
  ],
  "sha256": {
    "upstream-5db8ca88c8038b3d0888addaa521a16db3c259a8.tar.gz": "2e0197c43904d71963ae634d20b5c4ce99de5cb5c444222c89f09bc4994c64c8",
    "port-source.tar.gz": "a5990a8cde3a92f51b106ec1c91adfefd5eaf3212f7d0574dac141ac8998a987"
  },
  "verification": {
    "report": "verification/results.json",
    "screenshots": [
      "verification/1280x900.png",
      "verification/390x844.png",
      "verification/844x390.png"
    ],
    "inputMethod": "Real pointer/touch input; DOM buttons translate into the original keyboard controls. Audio instrumentation only reads retained native GainNode references.",
    "archiveRebuild": "npm ci --ignore-scripts --offline --no-audit --no-fund; npx tsc; npx vite build; index.html and sprites.png byte-identical to published artifacts.",
    "scope": "First-level combat, earned souls, corpse resurrection, shop navigation and Continue to level two, pause, restart, namespaced mute persistence and trusted parent audio bridge. Later levels and final victory unverified."
  }
}
