{
  "version": 1,
  "kind": "hwanse-battle-end-reward-review",
  "source": "tools/build_battle_end_reward_review.py",
  "status": "battle-end-exp-gold-grounded-item-drop-handler-grounded-inactive",
  "summary": [
    "전투 종료 보상은 KO된 enemy actor 기준으로 돌아간다. +0x62 bit 0x40이 KO 플래그다.",
    "경험치는 KO enemy마다 살아있는 player actor에게 fan-out된다. +0x62 bit 0x80 actor는 보상 fan-out에서 제외된다.",
    "경험치 공식은 enemy actor EXP base(+0x14), player/enemy actor level(+0x06) 차이, 장비/아이템 class penalty를 사용하며 최종 보상은 1 미만으로 떨어지지 않는다. enemy actor +0x14는 enemy stat actual +0x0c byte(HP-view +0x04)에서 materialize된다.",
    "레벨업 후 잔여 EXP는 단순 carry가 아니라 (current EXP - required EXP) * 3 / 4로 축소된다. battle-exp-level-gold 캡처의 88 + 원숭이 22 = 110, 요구치 100, 잔여 10 → 7과 일치한다.",
    "levelup-reward 캡처에서 EXP 표시/후보 주소 0x004870ca가 88→100→0→7로 진행되고, player level 후보 0x00457756이 1→2로 바뀌는 것을 확인했다. 같은 프레임에서 0x004217df/0x0042183b/... → 0x00427730 RNG 호출도 잡혀 레벨업 스탯 증가 루틴과 연결된다.",
    "골드는 enemy actor +0x44에서 읽어 global money 0x4576e0에 더하고 999999로 cap한다.",
    "global money 0x4576e0은 PE .data 파일 오프셋 0x000556e0의 dword이며 초기값은 200이다. 주소 직접 참조는 12개이고 0x4576e2 직접 참조는 0개라 32-bit money dword로 본다.",
    "아이템 드롭 핸들러는 enemy actor +0x40 item id와 +0x41 확률/분모를 사용해 성공 시 0x422093으로 1개 추가한다.",
    "다만 현재 80개 연속 몬스터 stat row의 source HP-view +0x2a/+0x2b는 모두 0이다. 따라서 일반 몬스터 보상은 EXP/골드만 있고 아이템 드롭은 비활성으로 본다.",
    "회복/부활은 별도 흐름이다. 리프레시 워터/마수석은 기절 actor의 0x40/0x80을 해제하고, 다른 회복류는 기절하지 않은 actor의 HP/MP 회복으로 분리된다.",
    "레벨업/스탯 상승/승리 UI 연출은 이 보상 루프 뒤쪽의 별도 화면 흐름이다. 여관/세이브포인트/전투 밖 메뉴 회복도 map/menu event 쪽 흐름이므로 이 보고서 범위에서 제외한다."
  ],
  "flowRows": [
    {
      "step": "defeated actor scan",
      "va": 4251576,
      "meaning": "target range helper(0x433c99/0x433dc0)로 전투 대상 범위를 돌며 actor kind +0x04가 enemy 쪽이고 +0x62 bit 0x40(KO)인 actor만 보상 대상으로 처리한다.",
      "status": "확정",
      "vaHex": "0x0040dfb8"
    },
    {
      "step": "EXP fan-out to live players",
      "va": 4251688,
      "meaning": "player actor slot 0x4576e8 범위를 돌며 +0x62 bit 0x80 비활성/기절 제외 actor에게만 0x42157b 경험치 공식을 적용하고 player +0x14 current EXP에 더한다.",
      "status": "확정",
      "vaHex": "0x0040e028"
    },
    {
      "step": "EXP formula",
      "va": 4330875,
      "meaning": "player/enemy actor +0x06 level 차이를 최대 10으로 clamp하고, enemy actor +0x14 EXP base를 기준으로 보정한다. enemy actor +0x14는 enemy stat row actual +0x0c byte(HP-view +0x04)에서 온다.",
      "status": "확정",
      "vaHex": "0x0042157b"
    },
    {
      "step": "equipment EXP penalty",
      "va": 4331161,
      "meaning": "player/equipment class table 0x457798 == 0x1d 또는 0x457799 in (0x0b, 0x17)이면 EXP를 절반으로 줄이되 1 미만으로 내리지 않는다.",
      "status": "확정",
      "vaHex": "0x00421699"
    },
    {
      "step": "gold reward",
      "va": 4413238,
      "meaning": "defeated actor +0x44 gold를 global money 0x4576e0에 더하고 0x000f423f(999999)로 cap한다.",
      "status": "확정",
      "vaHex": "0x00435736"
    },
    {
      "step": "global money initial value",
      "va": 4552416,
      "meaning": "PE .data의 0x004576e0 dword 초기값이 200이다. 새 프로세스/처음부터 시작의 기본 소지금 200과 일치하며, 같은 주소가 보상/상점 흐름에서 읽고 쓰인다.",
      "status": "확정",
      "vaHex": "0x004576e0"
    },
    {
      "step": "level-up carryover",
      "va": 4331391,
      "meaning": "레벨업 처리 후 player actor +0x14 current EXP는 (current EXP - required EXP actor +0x16) * 3 / 4로 축소되어 다음 레벨 잔여 경험치가 된다.",
      "status": "확정",
      "vaHex": "0x0042177f"
    },
    {
      "step": "item-drop handler",
      "va": 4413308,
      "meaning": "defeated actor +0x40 item id가 0이 아니면 +0x41 확률/분모로 random(0x427730)을 돌린다. 성공 시 0x422093(item id, 1)로 소지품을 1개 추가한다.",
      "status": "확정",
      "vaHex": "0x0043577c"
    }
  ],
  "formula": {
    "exp": "enemyExpBase = enemy actor +0x14 = enemy stat actual +0x0c byte(HP-view +0x04). diff = min(abs(enemy.level - player.level), 10). enemy lower: max(enemyExpBase - enemyExpBase*diff*12/100, 1). enemy same/higher: enemyExpBase + enemyExpBase*diff*diff/100. Equipment class penalties halve with min 1.",
    "levelUpCarryover": "if currentExp(+0x14) reaches requiredExp(+0x16): level++, then currentExp = (currentExp - requiredExp) * 3 / 4. Example: 88 + 22 = 110, required 100, carry 10*3/4 = 7.",
    "gold": "money global dword = 0x004576e0. PE initial value = 200. Reward: money = min(999999, money + defeatedActor.gold(+0x44)). Shop/VM helpers also add/subtract this same address.",
    "itemDrop": "if itemId(+0x40) != 0 and random(dropRate +0x41) == 0: add itemId x1 via 0x422093. Current continuous enemy stat table sets all itemId/dropRate pairs to 0."
  },
  "moneyGlobal": {
    "address": 4552416,
    "addressHex": "0x004576e0",
    "section": ".data",
    "fileOffset": 349920,
    "fileOffsetHex": "0x000556e0",
    "initialDword": 200,
    "cap": 999999,
    "directAddressRefCount": 12,
    "plusTwoAddressRefCount": 0,
    "initialBytes": "c8 00 00 00 00 00 00 00 00 00 00 00 03 03 00 00",
    "conclusion": "global money dword; PE initial value is 200 and reward/shop handlers read or mutate the same address"
  },
  "expReadable": {
    "title": "EXP 획득 계산",
    "formulaSummary": [
      "몬스터별 EXP 기준값은 enemy stat HP-view +0x04에서 온다. 전투 actor에서는 enemy actor +0x14로 materialize된다.",
      "몬스터 레벨은 실제 stat row prefix +0x06에서 온다. HP-view export 기준으로는 -0x02이며, 전투 actor +0x06으로 복사되어 EXP 공식이 소비한다.",
      "HP-view +0x36은 다음 실제 row prefix +0x06을 읽는 값이므로 한 행 밀린 다음 몬스터 레벨이다.",
      "레벨 차이는 최대 10까지만 반영된다.",
      "몬스터 레벨이 주인공보다 낮으면 EXP가 감소하고, 그래도 최소 1은 획득한다.",
      "몬스터 레벨이 같거나 높으면 EXP 기준값 이상을 획득한다.",
      "일부 장비/상태 페널티가 걸리면 계산된 EXP를 절반으로 줄이되 최소 1은 유지한다."
    ],
    "steps": [
      "enemyExpBase = 몬스터 EXP 기준값(+0x04)",
      "diff = min(abs(enemyLevel - playerLevel), 10)",
      "enemyLevel < playerLevel 이면 max(enemyExpBase - enemyExpBase * diff * 12 / 100, 1)",
      "enemyLevel >= playerLevel 이면 enemyExpBase + enemyExpBase * diff * diff / 100",
      "EXP 페널티 장비/상태가 있으면 max(result / 2, 1)"
    ],
    "example": {
      "monster": "원숭이",
      "enemyExpBase": 22,
      "enemyLevel": 2,
      "enemyLevelSource": "actual row +0x06 / HP-view -0x02",
      "rows": [
        {
          "playerLevel": 1,
          "enemyLevel": 2,
          "diff": 1,
          "reward": 22
        },
        {
          "playerLevel": 2,
          "enemyLevel": 2,
          "diff": 0,
          "reward": 22
        },
        {
          "playerLevel": 3,
          "enemyLevel": 2,
          "diff": 1,
          "reward": 20
        },
        {
          "playerLevel": 4,
          "enemyLevel": 2,
          "diff": 2,
          "reward": 17
        },
        {
          "playerLevel": 5,
          "enemyLevel": 2,
          "diff": 3,
          "reward": 15
        },
        {
          "playerLevel": 6,
          "enemyLevel": 2,
          "diff": 4,
          "reward": 12
        },
        {
          "playerLevel": 7,
          "enemyLevel": 2,
          "diff": 5,
          "reward": 9
        },
        {
          "playerLevel": 8,
          "enemyLevel": 2,
          "diff": 6,
          "reward": 7
        },
        {
          "playerLevel": 9,
          "enemyLevel": 2,
          "diff": 7,
          "reward": 4
        },
        {
          "playerLevel": 10,
          "enemyLevel": 2,
          "diff": 8,
          "reward": 1
        },
        {
          "playerLevel": 11,
          "enemyLevel": 2,
          "diff": 9,
          "reward": 1
        },
        {
          "playerLevel": 12,
          "enemyLevel": 2,
          "diff": 10,
          "reward": 1
        }
      ]
    },
    "monsterOptions": [
      {
        "index": 0,
        "name": "원숭이",
        "expBase": 22,
        "hp": 15,
        "gold": 3,
        "enemyLevel": 2,
        "nextRowLevelAtHpView36": 3,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 1,
        "name": "취한원숭이",
        "expBase": 24,
        "hp": 18,
        "gold": 8,
        "enemyLevel": 3,
        "nextRowLevelAtHpView36": 19,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 2,
        "name": "견원이",
        "expBase": 23,
        "hp": 76,
        "gold": 32,
        "enemyLevel": 19,
        "nextRowLevelAtHpView36": 21,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 3,
        "name": "언원이",
        "expBase": 24,
        "hp": 88,
        "gold": 30,
        "enemyLevel": 21,
        "nextRowLevelAtHpView36": 20,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 4,
        "name": "문원이",
        "expBase": 22,
        "hp": 82,
        "gold": 35,
        "enemyLevel": 20,
        "nextRowLevelAtHpView36": 3,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 5,
        "name": "멧돼지",
        "expBase": 31,
        "hp": 22,
        "gold": 4,
        "enemyLevel": 3,
        "nextRowLevelAtHpView36": 14,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 6,
        "name": "구멍멧돼지",
        "expBase": 31,
        "hp": 63,
        "gold": 12,
        "enemyLevel": 14,
        "nextRowLevelAtHpView36": 19,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 7,
        "name": "돌기멧돼지",
        "expBase": 31,
        "hp": 85,
        "gold": 14,
        "enemyLevel": 19,
        "nextRowLevelAtHpView36": 26,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 8,
        "name": "외뿔멧돼지",
        "expBase": 31,
        "hp": 146,
        "gold": 18,
        "enemyLevel": 26,
        "nextRowLevelAtHpView36": 4,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 9,
        "name": "슬라임",
        "expBase": 27,
        "hp": 20,
        "gold": 1,
        "enemyLevel": 4,
        "nextRowLevelAtHpView36": 18,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 10,
        "name": "바위슬라임",
        "expBase": 33,
        "hp": 120,
        "gold": 3,
        "enemyLevel": 18,
        "nextRowLevelAtHpView36": 17,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 11,
        "name": "불꽃슬라임",
        "expBase": 32,
        "hp": 106,
        "gold": 3,
        "enemyLevel": 17,
        "nextRowLevelAtHpView36": 17,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 12,
        "name": "물슬라임",
        "expBase": 32,
        "hp": 100,
        "gold": 3,
        "enemyLevel": 17,
        "nextRowLevelAtHpView36": 17,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 13,
        "name": "벼락슬라임",
        "expBase": 32,
        "hp": 111,
        "gold": 3,
        "enemyLevel": 17,
        "nextRowLevelAtHpView36": 27,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 14,
        "name": "마왕슬라임",
        "expBase": 33,
        "hp": 150,
        "gold": 13,
        "enemyLevel": 27,
        "nextRowLevelAtHpView36": 5,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 15,
        "name": "독사",
        "expBase": 28,
        "hp": 32,
        "gold": 8,
        "enemyLevel": 5,
        "nextRowLevelAtHpView36": 11,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 16,
        "name": "구렁이",
        "expBase": 28,
        "hp": 45,
        "gold": 12,
        "enemyLevel": 11,
        "nextRowLevelAtHpView36": 18,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 17,
        "name": "화사",
        "expBase": 28,
        "hp": 76,
        "gold": 9,
        "enemyLevel": 18,
        "nextRowLevelAtHpView36": 18,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 18,
        "name": "수사",
        "expBase": 28,
        "hp": 82,
        "gold": 9,
        "enemyLevel": 18,
        "nextRowLevelAtHpView36": 18,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 19,
        "name": "뢰사",
        "expBase": 28,
        "hp": 90,
        "gold": 9,
        "enemyLevel": 18,
        "nextRowLevelAtHpView36": 6,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 20,
        "name": "박쥐",
        "expBase": 25,
        "hp": 8,
        "gold": 5,
        "enemyLevel": 6,
        "nextRowLevelAtHpView36": 18,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 21,
        "name": "큰박쥐",
        "expBase": 25,
        "hp": 45,
        "gold": 8,
        "enemyLevel": 18,
        "nextRowLevelAtHpView36": 24,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 22,
        "name": "흡혈박쥐",
        "expBase": 25,
        "hp": 61,
        "gold": 12,
        "enemyLevel": 24,
        "nextRowLevelAtHpView36": 32,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 23,
        "name": "마왕박쥐",
        "expBase": 25,
        "hp": 72,
        "gold": 25,
        "enemyLevel": 32,
        "nextRowLevelAtHpView36": 22,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 24,
        "name": "동작석상",
        "expBase": 111,
        "hp": 500,
        "gold": 500,
        "enemyLevel": 22,
        "nextRowLevelAtHpView36": 11,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 25,
        "name": "파워",
        "expBase": 99,
        "hp": 300,
        "gold": 1000,
        "enemyLevel": 11,
        "nextRowLevelAtHpView36": 11,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 26,
        "name": "스피드",
        "expBase": 99,
        "hp": 300,
        "gold": 1000,
        "enemyLevel": 11,
        "nextRowLevelAtHpView36": 25,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 27,
        "name": "맹호권사범",
        "expBase": 100,
        "hp": 108,
        "gold": 0,
        "enemyLevel": 25,
        "nextRowLevelAtHpView36": 15,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 28,
        "name": "숙련주작권사",
        "expBase": 37,
        "hp": 124,
        "gold": 50,
        "enemyLevel": 15,
        "nextRowLevelAtHpView36": 15,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 29,
        "name": "숙련창룡권사",
        "expBase": 37,
        "hp": 116,
        "gold": 50,
        "enemyLevel": 15,
        "nextRowLevelAtHpView36": 15,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 30,
        "name": "숙련현무권사",
        "expBase": 37,
        "hp": 120,
        "gold": 50,
        "enemyLevel": 15,
        "nextRowLevelAtHpView36": 25,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 31,
        "name": "백호권사범",
        "expBase": 120,
        "hp": 135,
        "gold": 0,
        "enemyLevel": 25,
        "nextRowLevelAtHpView36": 24,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 32,
        "name": "귀갑권사",
        "expBase": 40,
        "hp": 140,
        "gold": 0,
        "enemyLevel": 24,
        "nextRowLevelAtHpView36": 8,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 33,
        "name": "근육맨１호",
        "expBase": 50,
        "hp": 90,
        "gold": 250,
        "enemyLevel": 8,
        "nextRowLevelAtHpView36": 8,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 34,
        "name": "근육맨２호",
        "expBase": 50,
        "hp": 96,
        "gold": 250,
        "enemyLevel": 8,
        "nextRowLevelAtHpView36": 14,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 35,
        "name": "근육맨",
        "expBase": 34,
        "hp": 140,
        "gold": 40,
        "enemyLevel": 14,
        "nextRowLevelAtHpView36": 14,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 36,
        "name": "근육맨",
        "expBase": 34,
        "hp": 140,
        "gold": 40,
        "enemyLevel": 14,
        "nextRowLevelAtHpView36": 3,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 37,
        "name": "핀푸",
        "expBase": 50,
        "hp": 24,
        "gold": 30,
        "enemyLevel": 3,
        "nextRowLevelAtHpView36": 19,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 38,
        "name": "핀푸",
        "expBase": 50,
        "hp": 141,
        "gold": 30,
        "enemyLevel": 19,
        "nextRowLevelAtHpView36": 19,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 39,
        "name": "탕",
        "expBase": 50,
        "hp": 86,
        "gold": 30,
        "enemyLevel": 19,
        "nextRowLevelAtHpView36": 24,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 40,
        "name": "탕",
        "expBase": 50,
        "hp": 135,
        "gold": 30,
        "enemyLevel": 24,
        "nextRowLevelAtHpView36": 5,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 41,
        "name": "치호",
        "expBase": 80,
        "hp": 43,
        "gold": 100,
        "enemyLevel": 5,
        "nextRowLevelAtHpView36": 22,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 42,
        "name": "치호",
        "expBase": 80,
        "hp": 125,
        "gold": 100,
        "enemyLevel": 22,
        "nextRowLevelAtHpView36": 26,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 43,
        "name": "치호",
        "expBase": 80,
        "hp": 160,
        "gold": 100,
        "enemyLevel": 26,
        "nextRowLevelAtHpView36": 25,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 44,
        "name": "론",
        "expBase": 80,
        "hp": 152,
        "gold": 0,
        "enemyLevel": 25,
        "nextRowLevelAtHpView36": 12,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 45,
        "name": "주작권사",
        "expBase": 30,
        "hp": 82,
        "gold": 20,
        "enemyLevel": 12,
        "nextRowLevelAtHpView36": 12,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 46,
        "name": "창룡권사",
        "expBase": 30,
        "hp": 75,
        "gold": 20,
        "enemyLevel": 12,
        "nextRowLevelAtHpView36": 12,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 47,
        "name": "현무권사",
        "expBase": 30,
        "hp": 89,
        "gold": 20,
        "enemyLevel": 12,
        "nextRowLevelAtHpView36": 9,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 48,
        "name": "권법가",
        "expBase": 28,
        "hp": 50,
        "gold": 15,
        "enemyLevel": 9,
        "nextRowLevelAtHpView36": 9,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 49,
        "name": "무투가",
        "expBase": 28,
        "hp": 63,
        "gold": 15,
        "enemyLevel": 9,
        "nextRowLevelAtHpView36": 9,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 50,
        "name": "격투가",
        "expBase": 28,
        "hp": 56,
        "gold": 15,
        "enemyLevel": 9,
        "nextRowLevelAtHpView36": 19,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 51,
        "name": "초류권사",
        "expBase": 35,
        "hp": 138,
        "gold": 0,
        "enemyLevel": 19,
        "nextRowLevelAtHpView36": 21,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 52,
        "name": "비룡권사",
        "expBase": 40,
        "hp": 144,
        "gold": 0,
        "enemyLevel": 21,
        "nextRowLevelAtHpView36": 25,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 53,
        "name": "린샹",
        "expBase": 63,
        "hp": 121,
        "gold": 0,
        "enemyLevel": 25,
        "nextRowLevelAtHpView36": 14,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 54,
        "name": "해골",
        "expBase": 27,
        "hp": 65,
        "gold": 30,
        "enemyLevel": 14,
        "nextRowLevelAtHpView36": 24,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 55,
        "name": "해골전사",
        "expBase": 27,
        "hp": 113,
        "gold": 50,
        "enemyLevel": 24,
        "nextRowLevelAtHpView36": 39,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 56,
        "name": "스컬나이트",
        "expBase": 27,
        "hp": 169,
        "gold": 100,
        "enemyLevel": 39,
        "nextRowLevelAtHpView36": 18,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 57,
        "name": "주작성령",
        "expBase": 39,
        "hp": 178,
        "gold": 0,
        "enemyLevel": 18,
        "nextRowLevelAtHpView36": 18,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 58,
        "name": "창룡성령",
        "expBase": 39,
        "hp": 189,
        "gold": 0,
        "enemyLevel": 18,
        "nextRowLevelAtHpView36": 18,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 59,
        "name": "현무성령",
        "expBase": 39,
        "hp": 200,
        "gold": 0,
        "enemyLevel": 18,
        "nextRowLevelAtHpView36": 25,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 60,
        "name": "유령",
        "expBase": 37,
        "hp": 30,
        "gold": 88,
        "enemyLevel": 25,
        "nextRowLevelAtHpView36": 45,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 61,
        "name": "리치",
        "expBase": 37,
        "hp": 50,
        "gold": 144,
        "enemyLevel": 45,
        "nextRowLevelAtHpView36": 22,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 62,
        "name": "나찰",
        "expBase": 99,
        "hp": 700,
        "gold": 100,
        "enemyLevel": 22,
        "nextRowLevelAtHpView36": 44,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 63,
        "name": "야차",
        "expBase": 42,
        "hp": 700,
        "gold": 79,
        "enemyLevel": 44,
        "nextRowLevelAtHpView36": 32,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 64,
        "name": "암각권총통",
        "expBase": 99,
        "hp": 1000,
        "gold": 200,
        "enemyLevel": 32,
        "nextRowLevelAtHpView36": 35,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 65,
        "name": "폭호",
        "expBase": 100,
        "hp": 1500,
        "gold": 1000,
        "enemyLevel": 35,
        "nextRowLevelAtHpView36": 46,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 66,
        "name": "지옥의마인",
        "expBase": 70,
        "hp": 400,
        "gold": 100,
        "enemyLevel": 46,
        "nextRowLevelAtHpView36": 44,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 67,
        "name": "바니－Ａ",
        "expBase": 50,
        "hp": 200,
        "gold": 100,
        "enemyLevel": 44,
        "nextRowLevelAtHpView36": 44,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 68,
        "name": "바니－Ｒ",
        "expBase": 50,
        "hp": 166,
        "gold": 100,
        "enemyLevel": 44,
        "nextRowLevelAtHpView36": 44,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 69,
        "name": "바니－Ｓ",
        "expBase": 50,
        "hp": 202,
        "gold": 100,
        "enemyLevel": 44,
        "nextRowLevelAtHpView36": 48,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 70,
        "name": "화룡",
        "expBase": 40,
        "hp": 750,
        "gold": 600,
        "enemyLevel": 48,
        "nextRowLevelAtHpView36": 48,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 71,
        "name": "빙룡",
        "expBase": 40,
        "hp": 750,
        "gold": 600,
        "enemyLevel": 48,
        "nextRowLevelAtHpView36": 48,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 72,
        "name": "뇌룡",
        "expBase": 40,
        "hp": 750,
        "gold": 600,
        "enemyLevel": 48,
        "nextRowLevelAtHpView36": 49,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 73,
        "name": "데드드래곤",
        "expBase": 88,
        "hp": 1250,
        "gold": 600,
        "enemyLevel": 49,
        "nextRowLevelAtHpView36": 50,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 74,
        "name": "두개골",
        "expBase": 200,
        "hp": 3333,
        "gold": 3333,
        "enemyLevel": 50,
        "nextRowLevelAtHpView36": 20,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 75,
        "name": "권법가",
        "expBase": 30,
        "hp": 170,
        "gold": 20,
        "enemyLevel": 20,
        "nextRowLevelAtHpView36": 20,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 76,
        "name": "권법가",
        "expBase": 30,
        "hp": 85,
        "gold": 20,
        "enemyLevel": 20,
        "nextRowLevelAtHpView36": 40,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 77,
        "name": "론",
        "expBase": 100,
        "hp": 177,
        "gold": 0,
        "enemyLevel": 40,
        "nextRowLevelAtHpView36": 50,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 78,
        "name": "론",
        "expBase": 100,
        "hp": 200,
        "gold": 0,
        "enemyLevel": 50,
        "nextRowLevelAtHpView36": 32,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      },
      {
        "index": 79,
        "name": "투귀",
        "expBase": 50,
        "hp": 300,
        "gold": 100,
        "enemyLevel": 32,
        "nextRowLevelAtHpView36": 35,
        "levelSource": "actual stat row +0x06 / exported HP-view -0x02; copied to actor +0x06 and consumed by EXP formula 0x0042157b"
      }
    ]
  },
  "itemDropSourceRows": [],
  "itemDropSourceConclusion": {
    "source": "enemy_stat_table HP-view +0x2a/+0x2b -> actor +0x40/+0x41",
    "nonZeroRows": 0,
    "conclusion": "continuous enemy stat table has no active item drops; monster rewards are EXP/gold only"
  },
  "runtimeBridge": {
    "observation": "levelup-reward runtime: 전투 중 캡처에서 EXP 88→100→0→7, level 1→2, HP 30→35, MP 18→21이 정적 레벨업 구간 근처에서 잡힘. battle-exp-level-gold 관찰치의 gold 212→215도 원숭이 gold 3과 일치.",
    "staticRewardCheck": {
      "enemy": "원숭이",
      "enemyHpViewOffset04ExpBase": 22,
      "enemyActorExpBase": 22,
      "enemyGold": 3,
      "playerLevelBefore": 1,
      "playerExpBefore": 88,
      "levelRequirement": 100,
      "expAfterRewardBeforeLevelUp": 110,
      "carryBeforeScale": 10,
      "carryoverFormula": "(currentExp - requiredExp) * 3 / 4",
      "playerExpAfterLevelUp": 7,
      "playerLevelAfter": 2,
      "goldBefore": 212,
      "goldAfter": 215,
      "matchesUserObservation": true,
      "statSourceNote": "enemy_stat_table rows are HP-view rows. EXE materializer uses actual stat row +0x0c byte for enemy actor +0x14 EXP base; in HP-view export this is +0x04."
    },
    "runtimeTrace": {
      "traceId": "levelup-reward",
      "manifest": "hwanse-runtime-trace-2026-07-09T04-25-54-466Z-levelup-reward.manifest.json",
      "jsonl": "hwanse-runtime-trace-2026-07-09T04-25-54-466Z-levelup-reward.jsonl",
      "profiles": [
        "vm-core",
        "selected-root",
        "descriptor-stack",
        "field",
        "resource",
        "probe:battle-stats",
        "value-probe:level-exp-gold"
      ],
      "frameRange": [
        903,
        989
      ],
      "eventCount": 8773,
      "topEventCounts": [
        [
          "draw-surface",
          3152
        ],
        [
          "function-enter",
          1075
        ],
        [
          "trace-trigger",
          950
        ],
        [
          "vm-op",
          896
        ],
        [
          "vm-op-transition",
          895
        ],
        [
          "object-stream-change",
          778
        ],
        [
          "probe-draw-stat",
          669
        ],
        [
          "mem-write",
          172
        ],
        [
          "probe-value-change",
          77
        ],
        [
          "sound-api",
          62
        ],
        [
          "surface-snapshot",
          17
        ],
        [
          "resource-surface-label",
          14
        ]
      ],
      "textDraws": [],
      "resourceLabels": [
        [
          "map_b1.cns",
          2119
        ],
        [
          "01234567.cns",
          397
        ],
        [
          "status.cns",
          306
        ],
        [
          "btl_at.cns",
          88
        ],
        [
          "btl_etc.cns",
          85
        ],
        [
          "zsa_saru.cns",
          28
        ],
        [
          "map_b2.cns",
          2
        ],
        [
          "btl_efc.cns",
          2
        ],
        [
          "frame.cns",
          2
        ],
        [
          "icon.cns",
          2
        ],
        [
          "item.cns",
          2
        ],
        [
          "icon_s.cns",
          2
        ],
        [
          "num.cns",
          2
        ],
        [
          "window.cns",
          2
        ]
      ],
      "memWriteNames": [
        [
          "0x0059E312",
          172
        ]
      ],
      "probeValueChanges": [
        {
          "frame": 912,
          "pc": "0x00420690",
          "address": "0x004870B4",
          "label": "animated/display level-or-state candidate",
          "old": "1",
          "new": "0",
          "cpuEip": "0x00420693",
          "cpuEax": "0x004870C0",
          "cpuEcx": "0x00000000",
          "cpuEdx": "0x00000000"
        },
        {
          "frame": 962,
          "pc": "0x00420695",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "88",
          "new": "90",
          "cpuEip": "0x00420698",
          "cpuEax": "0x00000000",
          "cpuEcx": "0x00000002",
          "cpuEdx": "0x00000058"
        },
        {
          "frame": 963,
          "pc": "0x00420690",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "90",
          "new": "92",
          "cpuEip": "0x00420693",
          "cpuEax": "0x004870CC",
          "cpuEcx": "0x00000001",
          "cpuEdx": "0x0000005A"
        },
        {
          "frame": 964,
          "pc": "0x0042068B",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "92",
          "new": "94",
          "cpuEip": "0x0042068E",
          "cpuEax": "0x004870FC",
          "cpuEcx": "0x00000002",
          "cpuEdx": "0x0000005C"
        },
        {
          "frame": 965,
          "pc": "0x00420682",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "94",
          "new": "96",
          "cpuEip": "0x00420685",
          "cpuEax": "0x00487144",
          "cpuEcx": "0x00000004",
          "cpuEdx": "0x0000005E"
        },
        {
          "frame": 966,
          "pc": "0x00420690",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "96",
          "new": "97",
          "cpuEip": "0x00420693",
          "cpuEax": "0x004870E4",
          "cpuEcx": "0x00000001",
          "cpuEdx": "0x00000060"
        },
        {
          "frame": 967,
          "pc": "0x00420695",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "97",
          "new": "98",
          "cpuEip": "0x00420698",
          "cpuEax": "0x00000000",
          "cpuEcx": "0x00000003",
          "cpuEdx": "0x00000061"
        },
        {
          "frame": 968,
          "pc": "0x00420674",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "98",
          "new": "99",
          "cpuEip": "0x00420678",
          "cpuEax": "0x00000000",
          "cpuEcx": "0x00000001",
          "cpuEdx": "0x00000062"
        },
        {
          "frame": 969,
          "pc": "0x00421802",
          "address": "0x00457756",
          "label": "player level",
          "old": "1",
          "new": "2",
          "cpuEip": "0x00421807",
          "cpuEax": "0x00000005",
          "cpuEcx": "0x0000001E",
          "cpuEdx": "0x00000003"
        },
        {
          "frame": 969,
          "pc": "0x00421802",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "99",
          "new": "100",
          "cpuEip": "0x00421807",
          "cpuEax": "0x00000005",
          "cpuEcx": "0x0000001E",
          "cpuEdx": "0x00000003"
        },
        {
          "frame": 969,
          "pc": "0x00427763",
          "address": "0x0045775A",
          "label": "player max HP candidate",
          "old": "30",
          "new": "35",
          "cpuEip": "0x00427769",
          "cpuEax": "0x000012EF",
          "cpuEcx": "0x00000002",
          "cpuEdx": "0x00000003"
        },
        {
          "frame": 969,
          "pc": "0x00427763",
          "address": "0x0045775C",
          "label": "player current HP candidate",
          "old": "30",
          "new": "35",
          "cpuEip": "0x00427769",
          "cpuEax": "0x000012EF",
          "cpuEcx": "0x00000002",
          "cpuEdx": "0x00000003"
        },
        {
          "frame": 969,
          "pc": "0x00427763",
          "address": "0x00457760",
          "label": "player max MP candidate",
          "old": "18",
          "new": "21",
          "cpuEip": "0x00427769",
          "cpuEax": "0x000012EF",
          "cpuEcx": "0x00000002",
          "cpuEdx": "0x00000003"
        },
        {
          "frame": 969,
          "pc": "0x00427763",
          "address": "0x00457762",
          "label": "player current MP candidate",
          "old": "18",
          "new": "21",
          "cpuEip": "0x00427769",
          "cpuEax": "0x000012EF",
          "cpuEcx": "0x00000002",
          "cpuEdx": "0x00000003"
        },
        {
          "frame": 969,
          "pc": "0x00420678",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "100",
          "new": "0",
          "cpuEip": "0x0042067D",
          "cpuEax": "0x004870A8",
          "cpuEcx": "0x00000004",
          "cpuEdx": "0x00000000"
        },
        {
          "frame": 970,
          "pc": "0x00420835",
          "address": "0x004870B2",
          "label": "animated/display HP candidate",
          "old": "30",
          "new": "31",
          "cpuEip": "0x00420839",
          "cpuEax": "0x004870B4",
          "cpuEcx": "0x00000001",
          "cpuEdx": "0x00000008"
        },
        {
          "frame": 970,
          "pc": "0x00420851",
          "address": "0x004870B4",
          "label": "animated/display level-or-state candidate",
          "old": "0",
          "new": "1",
          "cpuEip": "0x00420853",
          "cpuEax": "0x004870C0",
          "cpuEcx": "0x00000000",
          "cpuEdx": "0x00000000"
        },
        {
          "frame": 970,
          "pc": "0x00420698",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "0",
          "new": "1",
          "cpuEip": "0x0042069A",
          "cpuEax": "0x00000000",
          "cpuEcx": "0x00000004",
          "cpuEdx": "0x00000000"
        },
        {
          "frame": 971,
          "pc": "0x004207C9",
          "address": "0x004870B2",
          "label": "animated/display HP candidate",
          "old": "31",
          "new": "32",
          "cpuEip": "0x004207CC",
          "cpuEax": "0x00000015",
          "cpuEcx": "0x004870B4",
          "cpuEdx": "0x0000001F"
        },
        {
          "frame": 971,
          "pc": "0x00420685",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "1",
          "new": "2",
          "cpuEip": "0x0042068B",
          "cpuEax": "0x00487144",
          "cpuEcx": "0x00000002",
          "cpuEdx": "0x00000001"
        },
        {
          "frame": 972,
          "pc": "0x0042085A",
          "address": "0x004870B2",
          "label": "animated/display HP candidate",
          "old": "32",
          "new": "33",
          "cpuEip": "0x00420874",
          "cpuEax": "0x004870B4",
          "cpuEcx": "0x0000000A",
          "cpuEdx": "0x0000000A"
        },
        {
          "frame": 972,
          "pc": "0x00420693",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "2",
          "new": "3",
          "cpuEip": "0x00420695",
          "cpuEax": "0x00000000",
          "cpuEcx": "0x00000005",
          "cpuEdx": "0x00000002"
        },
        {
          "frame": 973,
          "pc": "0x00420690",
          "address": "0x004870B2",
          "label": "animated/display HP candidate",
          "old": "33",
          "new": "34",
          "cpuEip": "0x00420693",
          "cpuEax": "0x004870B4",
          "cpuEcx": "0x00000000",
          "cpuEdx": "0x00000021"
        },
        {
          "frame": 973,
          "pc": "0x00420678",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "3",
          "new": "4",
          "cpuEip": "0x0042067D",
          "cpuEax": "0x004870A8",
          "cpuEcx": "0x00000001",
          "cpuEdx": "0x00000003"
        },
        {
          "frame": 974,
          "pc": "0x004207B9",
          "address": "0x004870B2",
          "label": "animated/display HP candidate",
          "old": "34",
          "new": "35",
          "cpuEip": "0x004207BD",
          "cpuEax": "0x004870B4",
          "cpuEcx": "0x0000000C",
          "cpuEdx": "0x00000022"
        },
        {
          "frame": 974,
          "pc": "0x00420674",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "4",
          "new": "5",
          "cpuEip": "0x00420678",
          "cpuEax": "0x00000000",
          "cpuEcx": "0x00000002",
          "cpuEdx": "0x00000004"
        },
        {
          "frame": 975,
          "pc": "0x00420693",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "5",
          "new": "6",
          "cpuEip": "0x00420695",
          "cpuEax": "0x00000000",
          "cpuEcx": "0x00000001",
          "cpuEdx": "0x00000005"
        },
        {
          "frame": 976,
          "pc": "0x00420685",
          "address": "0x004870CA",
          "label": "animated/display EXP candidate",
          "old": "6",
          "new": "7",
          "cpuEip": "0x0042068B",
          "cpuEax": "0x00487144",
          "cpuEcx": "0x00000002",
          "cpuEdx": "0x00000006"
        },
        {
          "frame": 983,
          "pc": "0x004206A3",
          "address": "0x004870B4",
          "label": "animated/display level-or-state candidate",
          "old": "1",
          "new": "0",
          "cpuEip": "0x004206A5",
          "cpuEax": "0x004870C0",
          "cpuEcx": "0x00000000",
          "cpuEdx": "0x00000000"
        }
      ],
      "staticAddressHits": [
        {
          "frame": 969,
          "pc": "0x00427730",
          "caller": "0x004217DF",
          "function": "rng",
          "meaning": "level-up HP increase RNG call",
          "args": [
            "0x00450003",
            "0x00000000",
            "0x10001017",
            "0x00000065"
          ]
        },
        {
          "frame": 969,
          "pc": "0x00427730",
          "caller": "0x0042183B",
          "function": "rng",
          "meaning": "level-up stat RNG call",
          "args": [
            "0x00450002",
            "0x00000000",
            "0x10001017",
            "0x00000065"
          ]
        },
        {
          "frame": 969,
          "pc": "0x00427730",
          "caller": "0x00421897",
          "function": "rng",
          "meaning": "level-up stat RNG call",
          "args": [
            "0x00450002",
            "0x00000000",
            "0x10001017",
            "0x00000065"
          ]
        },
        {
          "frame": 969,
          "pc": "0x00427730",
          "caller": "0x004218DF",
          "function": "rng",
          "meaning": "level-up stat RNG call",
          "args": [
            "0x00450002",
            "0x00000000",
            "0x10001017",
            "0x00000065"
          ]
        },
        {
          "frame": 969,
          "pc": "0x00427730",
          "caller": "0x00421927",
          "function": "rng",
          "meaning": "level-up stat RNG call",
          "args": [
            "0x00450003",
            "0x00000000",
            "0x10001017",
            "0x00000065"
          ]
        },
        {
          "frame": 969,
          "pc": "0x00427730",
          "caller": "0x0042196F",
          "function": "rng",
          "meaning": "level-up stat RNG call",
          "args": [
            "0x00450003",
            "0x00000000",
            "0x10001017",
            "0x00000065"
          ]
        },
        {
          "frame": 969,
          "pc": "0x00427730",
          "caller": "0x004219AD",
          "function": "rng",
          "meaning": "level-up luck/random branch call",
          "args": [
            "0x00000064",
            "0x00000000",
            "0x10001017",
            "0x00000065"
          ]
        }
      ],
      "vmTail": [
        {
          "frame": 988,
          "pc": "0x00402321",
          "stream": "0x004F8F00",
          "opcode": "0x03",
          "raw": "03 00 00 00 f8 8e 4f 00 21 00 01 00"
        },
        {
          "frame": 988,
          "pc": "0x00402321",
          "stream": "0x004D61E8",
          "opcode": "0x21",
          "raw": "21 00 02 00 03 00 11 00 21 00 02 00"
        },
        {
          "frame": 988,
          "pc": "0x00402321",
          "stream": "0x00502328",
          "opcode": "0x03",
          "raw": "03 00 00 00 20 23 50 00 21 00 01 00"
        },
        {
          "frame": 989,
          "pc": "0x00402321",
          "stream": "0x0047E894",
          "opcode": "0xA8",
          "raw": "a8 00 00 00 a8 01 00 00 b3 00 00 00"
        },
        {
          "frame": 989,
          "pc": "0x00402321",
          "stream": "0x0047E754",
          "opcode": "0x03",
          "raw": "03 00 00 00 50 e7 47 00 4d 00 00 00"
        },
        {
          "frame": 989,
          "pc": "0x00402321",
          "stream": "0x004DEDCC",
          "opcode": "0x03",
          "raw": "03 00 00 00 c8 ed 4d 00 08 00 00 00"
        },
        {
          "frame": 989,
          "pc": "0x00402321",
          "stream": "0x004DEE10",
          "opcode": "0x03",
          "raw": "03 00 00 00 0c ee 4d 00 08 00 00 00"
        },
        {
          "frame": 989,
          "pc": "0x00402321",
          "stream": "0x0047E764",
          "opcode": "0x03",
          "raw": "03 00 00 00 5c e7 47 00 9c 00 00 00"
        },
        {
          "frame": 989,
          "pc": "0x00402321",
          "stream": "0x004D22F4",
          "opcode": "0x13",
          "raw": "13 c0 5b 01 f0 22 4d 00 10 c0 5b 00"
        },
        {
          "frame": 989,
          "pc": "0x00402321",
          "stream": "0x004D5DAC",
          "opcode": "0x13",
          "raw": "13 c0 5b 01 a8 5d 4d 00 10 c0 5b 00"
        },
        {
          "frame": 989,
          "pc": "0x00402321",
          "stream": "0x004F8F00",
          "opcode": "0x03",
          "raw": "03 00 00 00 f8 8e 4f 00 21 00 01 00"
        },
        {
          "frame": 989,
          "pc": "0x00402321",
          "stream": "0x00502328",
          "opcode": "0x03",
          "raw": "03 00 00 00 20 23 50 00 21 00 01 00"
        }
      ],
      "objectStreamTail": [
        {
          "frame": 988,
          "object": "0x0055D5D4",
          "old": "64 e7 47 00",
          "new": "5c e7 47 00"
        },
        {
          "frame": 988,
          "object": "0x0055D5D4",
          "old": "5c e7 47 00",
          "new": "60 e7 47 00"
        },
        {
          "frame": 988,
          "object": "0x0055D5D4",
          "old": "60 e7 47 00",
          "new": "64 e7 47 00"
        },
        {
          "frame": 989,
          "object": "0x0055D2F8",
          "old": "54 e7 47 00",
          "new": "50 e7 47 00"
        },
        {
          "frame": 989,
          "object": "0x0055D2F8",
          "old": "50 e7 47 00",
          "new": "54 e7 47 00"
        },
        {
          "frame": 989,
          "object": "0x0055D3EC",
          "old": "cc ed 4d 00",
          "new": "c8 ed 4d 00"
        },
        {
          "frame": 989,
          "object": "0x0055D3EC",
          "old": "c8 ed 4d 00",
          "new": "cc ed 4d 00"
        },
        {
          "frame": 989,
          "object": "0x0055D4E0",
          "old": "10 ee 4d 00",
          "new": "0c ee 4d 00"
        },
        {
          "frame": 989,
          "object": "0x0055D4E0",
          "old": "0c ee 4d 00",
          "new": "10 ee 4d 00"
        },
        {
          "frame": 989,
          "object": "0x0055D5D4",
          "old": "64 e7 47 00",
          "new": "5c e7 47 00"
        },
        {
          "frame": 989,
          "object": "0x0055D5D4",
          "old": "5c e7 47 00",
          "new": "60 e7 47 00"
        },
        {
          "frame": 989,
          "object": "0x0055D5D4",
          "old": "60 e7 47 00",
          "new": "64 e7 47 00"
        }
      ],
      "directRewardWriteCaptured": true,
      "directLevelupCaptured": true,
      "expRolloverCaptured": true,
      "statGrowthCaptured": true,
      "note": "levelup-reward 캡처는 value-probe로 EXP 88→100→0→7, level 1→2, HP/MP 성장 후보를 정적 level-up 주소 근처에서 직접 잡는다."
    },
    "runtimeTraces": [
      {
        "traceId": "levelup-reward",
        "manifest": "hwanse-runtime-trace-2026-07-09T04-25-54-466Z-levelup-reward.manifest.json",
        "jsonl": "hwanse-runtime-trace-2026-07-09T04-25-54-466Z-levelup-reward.jsonl",
        "profiles": [
          "vm-core",
          "selected-root",
          "descriptor-stack",
          "field",
          "resource",
          "probe:battle-stats",
          "value-probe:level-exp-gold"
        ],
        "frameRange": [
          903,
          989
        ],
        "eventCount": 8773,
        "topEventCounts": [
          [
            "draw-surface",
            3152
          ],
          [
            "function-enter",
            1075
          ],
          [
            "trace-trigger",
            950
          ],
          [
            "vm-op",
            896
          ],
          [
            "vm-op-transition",
            895
          ],
          [
            "object-stream-change",
            778
          ],
          [
            "probe-draw-stat",
            669
          ],
          [
            "mem-write",
            172
          ],
          [
            "probe-value-change",
            77
          ],
          [
            "sound-api",
            62
          ],
          [
            "surface-snapshot",
            17
          ],
          [
            "resource-surface-label",
            14
          ]
        ],
        "textDraws": [],
        "resourceLabels": [
          [
            "map_b1.cns",
            2119
          ],
          [
            "01234567.cns",
            397
          ],
          [
            "status.cns",
            306
          ],
          [
            "btl_at.cns",
            88
          ],
          [
            "btl_etc.cns",
            85
          ],
          [
            "zsa_saru.cns",
            28
          ],
          [
            "map_b2.cns",
            2
          ],
          [
            "btl_efc.cns",
            2
          ],
          [
            "frame.cns",
            2
          ],
          [
            "icon.cns",
            2
          ],
          [
            "item.cns",
            2
          ],
          [
            "icon_s.cns",
            2
          ],
          [
            "num.cns",
            2
          ],
          [
            "window.cns",
            2
          ]
        ],
        "memWriteNames": [
          [
            "0x0059E312",
            172
          ]
        ],
        "probeValueChanges": [
          {
            "frame": 912,
            "pc": "0x00420690",
            "address": "0x004870B4",
            "label": "animated/display level-or-state candidate",
            "old": "1",
            "new": "0",
            "cpuEip": "0x00420693",
            "cpuEax": "0x004870C0",
            "cpuEcx": "0x00000000",
            "cpuEdx": "0x00000000"
          },
          {
            "frame": 962,
            "pc": "0x00420695",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "88",
            "new": "90",
            "cpuEip": "0x00420698",
            "cpuEax": "0x00000000",
            "cpuEcx": "0x00000002",
            "cpuEdx": "0x00000058"
          },
          {
            "frame": 963,
            "pc": "0x00420690",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "90",
            "new": "92",
            "cpuEip": "0x00420693",
            "cpuEax": "0x004870CC",
            "cpuEcx": "0x00000001",
            "cpuEdx": "0x0000005A"
          },
          {
            "frame": 964,
            "pc": "0x0042068B",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "92",
            "new": "94",
            "cpuEip": "0x0042068E",
            "cpuEax": "0x004870FC",
            "cpuEcx": "0x00000002",
            "cpuEdx": "0x0000005C"
          },
          {
            "frame": 965,
            "pc": "0x00420682",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "94",
            "new": "96",
            "cpuEip": "0x00420685",
            "cpuEax": "0x00487144",
            "cpuEcx": "0x00000004",
            "cpuEdx": "0x0000005E"
          },
          {
            "frame": 966,
            "pc": "0x00420690",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "96",
            "new": "97",
            "cpuEip": "0x00420693",
            "cpuEax": "0x004870E4",
            "cpuEcx": "0x00000001",
            "cpuEdx": "0x00000060"
          },
          {
            "frame": 967,
            "pc": "0x00420695",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "97",
            "new": "98",
            "cpuEip": "0x00420698",
            "cpuEax": "0x00000000",
            "cpuEcx": "0x00000003",
            "cpuEdx": "0x00000061"
          },
          {
            "frame": 968,
            "pc": "0x00420674",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "98",
            "new": "99",
            "cpuEip": "0x00420678",
            "cpuEax": "0x00000000",
            "cpuEcx": "0x00000001",
            "cpuEdx": "0x00000062"
          },
          {
            "frame": 969,
            "pc": "0x00421802",
            "address": "0x00457756",
            "label": "player level",
            "old": "1",
            "new": "2",
            "cpuEip": "0x00421807",
            "cpuEax": "0x00000005",
            "cpuEcx": "0x0000001E",
            "cpuEdx": "0x00000003"
          },
          {
            "frame": 969,
            "pc": "0x00421802",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "99",
            "new": "100",
            "cpuEip": "0x00421807",
            "cpuEax": "0x00000005",
            "cpuEcx": "0x0000001E",
            "cpuEdx": "0x00000003"
          },
          {
            "frame": 969,
            "pc": "0x00427763",
            "address": "0x0045775A",
            "label": "player max HP candidate",
            "old": "30",
            "new": "35",
            "cpuEip": "0x00427769",
            "cpuEax": "0x000012EF",
            "cpuEcx": "0x00000002",
            "cpuEdx": "0x00000003"
          },
          {
            "frame": 969,
            "pc": "0x00427763",
            "address": "0x0045775C",
            "label": "player current HP candidate",
            "old": "30",
            "new": "35",
            "cpuEip": "0x00427769",
            "cpuEax": "0x000012EF",
            "cpuEcx": "0x00000002",
            "cpuEdx": "0x00000003"
          },
          {
            "frame": 969,
            "pc": "0x00427763",
            "address": "0x00457760",
            "label": "player max MP candidate",
            "old": "18",
            "new": "21",
            "cpuEip": "0x00427769",
            "cpuEax": "0x000012EF",
            "cpuEcx": "0x00000002",
            "cpuEdx": "0x00000003"
          },
          {
            "frame": 969,
            "pc": "0x00427763",
            "address": "0x00457762",
            "label": "player current MP candidate",
            "old": "18",
            "new": "21",
            "cpuEip": "0x00427769",
            "cpuEax": "0x000012EF",
            "cpuEcx": "0x00000002",
            "cpuEdx": "0x00000003"
          },
          {
            "frame": 969,
            "pc": "0x00420678",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "100",
            "new": "0",
            "cpuEip": "0x0042067D",
            "cpuEax": "0x004870A8",
            "cpuEcx": "0x00000004",
            "cpuEdx": "0x00000000"
          },
          {
            "frame": 970,
            "pc": "0x00420835",
            "address": "0x004870B2",
            "label": "animated/display HP candidate",
            "old": "30",
            "new": "31",
            "cpuEip": "0x00420839",
            "cpuEax": "0x004870B4",
            "cpuEcx": "0x00000001",
            "cpuEdx": "0x00000008"
          },
          {
            "frame": 970,
            "pc": "0x00420851",
            "address": "0x004870B4",
            "label": "animated/display level-or-state candidate",
            "old": "0",
            "new": "1",
            "cpuEip": "0x00420853",
            "cpuEax": "0x004870C0",
            "cpuEcx": "0x00000000",
            "cpuEdx": "0x00000000"
          },
          {
            "frame": 970,
            "pc": "0x00420698",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "0",
            "new": "1",
            "cpuEip": "0x0042069A",
            "cpuEax": "0x00000000",
            "cpuEcx": "0x00000004",
            "cpuEdx": "0x00000000"
          },
          {
            "frame": 971,
            "pc": "0x004207C9",
            "address": "0x004870B2",
            "label": "animated/display HP candidate",
            "old": "31",
            "new": "32",
            "cpuEip": "0x004207CC",
            "cpuEax": "0x00000015",
            "cpuEcx": "0x004870B4",
            "cpuEdx": "0x0000001F"
          },
          {
            "frame": 971,
            "pc": "0x00420685",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "1",
            "new": "2",
            "cpuEip": "0x0042068B",
            "cpuEax": "0x00487144",
            "cpuEcx": "0x00000002",
            "cpuEdx": "0x00000001"
          },
          {
            "frame": 972,
            "pc": "0x0042085A",
            "address": "0x004870B2",
            "label": "animated/display HP candidate",
            "old": "32",
            "new": "33",
            "cpuEip": "0x00420874",
            "cpuEax": "0x004870B4",
            "cpuEcx": "0x0000000A",
            "cpuEdx": "0x0000000A"
          },
          {
            "frame": 972,
            "pc": "0x00420693",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "2",
            "new": "3",
            "cpuEip": "0x00420695",
            "cpuEax": "0x00000000",
            "cpuEcx": "0x00000005",
            "cpuEdx": "0x00000002"
          },
          {
            "frame": 973,
            "pc": "0x00420690",
            "address": "0x004870B2",
            "label": "animated/display HP candidate",
            "old": "33",
            "new": "34",
            "cpuEip": "0x00420693",
            "cpuEax": "0x004870B4",
            "cpuEcx": "0x00000000",
            "cpuEdx": "0x00000021"
          },
          {
            "frame": 973,
            "pc": "0x00420678",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "3",
            "new": "4",
            "cpuEip": "0x0042067D",
            "cpuEax": "0x004870A8",
            "cpuEcx": "0x00000001",
            "cpuEdx": "0x00000003"
          },
          {
            "frame": 974,
            "pc": "0x004207B9",
            "address": "0x004870B2",
            "label": "animated/display HP candidate",
            "old": "34",
            "new": "35",
            "cpuEip": "0x004207BD",
            "cpuEax": "0x004870B4",
            "cpuEcx": "0x0000000C",
            "cpuEdx": "0x00000022"
          },
          {
            "frame": 974,
            "pc": "0x00420674",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "4",
            "new": "5",
            "cpuEip": "0x00420678",
            "cpuEax": "0x00000000",
            "cpuEcx": "0x00000002",
            "cpuEdx": "0x00000004"
          },
          {
            "frame": 975,
            "pc": "0x00420693",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "5",
            "new": "6",
            "cpuEip": "0x00420695",
            "cpuEax": "0x00000000",
            "cpuEcx": "0x00000001",
            "cpuEdx": "0x00000005"
          },
          {
            "frame": 976,
            "pc": "0x00420685",
            "address": "0x004870CA",
            "label": "animated/display EXP candidate",
            "old": "6",
            "new": "7",
            "cpuEip": "0x0042068B",
            "cpuEax": "0x00487144",
            "cpuEcx": "0x00000002",
            "cpuEdx": "0x00000006"
          },
          {
            "frame": 983,
            "pc": "0x004206A3",
            "address": "0x004870B4",
            "label": "animated/display level-or-state candidate",
            "old": "1",
            "new": "0",
            "cpuEip": "0x004206A5",
            "cpuEax": "0x004870C0",
            "cpuEcx": "0x00000000",
            "cpuEdx": "0x00000000"
          }
        ],
        "staticAddressHits": [
          {
            "frame": 969,
            "pc": "0x00427730",
            "caller": "0x004217DF",
            "function": "rng",
            "meaning": "level-up HP increase RNG call",
            "args": [
              "0x00450003",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 969,
            "pc": "0x00427730",
            "caller": "0x0042183B",
            "function": "rng",
            "meaning": "level-up stat RNG call",
            "args": [
              "0x00450002",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 969,
            "pc": "0x00427730",
            "caller": "0x00421897",
            "function": "rng",
            "meaning": "level-up stat RNG call",
            "args": [
              "0x00450002",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 969,
            "pc": "0x00427730",
            "caller": "0x004218DF",
            "function": "rng",
            "meaning": "level-up stat RNG call",
            "args": [
              "0x00450002",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 969,
            "pc": "0x00427730",
            "caller": "0x00421927",
            "function": "rng",
            "meaning": "level-up stat RNG call",
            "args": [
              "0x00450003",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 969,
            "pc": "0x00427730",
            "caller": "0x0042196F",
            "function": "rng",
            "meaning": "level-up stat RNG call",
            "args": [
              "0x00450003",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 969,
            "pc": "0x00427730",
            "caller": "0x004219AD",
            "function": "rng",
            "meaning": "level-up luck/random branch call",
            "args": [
              "0x00000064",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          }
        ],
        "vmTail": [
          {
            "frame": 988,
            "pc": "0x00402321",
            "stream": "0x004F8F00",
            "opcode": "0x03",
            "raw": "03 00 00 00 f8 8e 4f 00 21 00 01 00"
          },
          {
            "frame": 988,
            "pc": "0x00402321",
            "stream": "0x004D61E8",
            "opcode": "0x21",
            "raw": "21 00 02 00 03 00 11 00 21 00 02 00"
          },
          {
            "frame": 988,
            "pc": "0x00402321",
            "stream": "0x00502328",
            "opcode": "0x03",
            "raw": "03 00 00 00 20 23 50 00 21 00 01 00"
          },
          {
            "frame": 989,
            "pc": "0x00402321",
            "stream": "0x0047E894",
            "opcode": "0xA8",
            "raw": "a8 00 00 00 a8 01 00 00 b3 00 00 00"
          },
          {
            "frame": 989,
            "pc": "0x00402321",
            "stream": "0x0047E754",
            "opcode": "0x03",
            "raw": "03 00 00 00 50 e7 47 00 4d 00 00 00"
          },
          {
            "frame": 989,
            "pc": "0x00402321",
            "stream": "0x004DEDCC",
            "opcode": "0x03",
            "raw": "03 00 00 00 c8 ed 4d 00 08 00 00 00"
          },
          {
            "frame": 989,
            "pc": "0x00402321",
            "stream": "0x004DEE10",
            "opcode": "0x03",
            "raw": "03 00 00 00 0c ee 4d 00 08 00 00 00"
          },
          {
            "frame": 989,
            "pc": "0x00402321",
            "stream": "0x0047E764",
            "opcode": "0x03",
            "raw": "03 00 00 00 5c e7 47 00 9c 00 00 00"
          },
          {
            "frame": 989,
            "pc": "0x00402321",
            "stream": "0x004D22F4",
            "opcode": "0x13",
            "raw": "13 c0 5b 01 f0 22 4d 00 10 c0 5b 00"
          },
          {
            "frame": 989,
            "pc": "0x00402321",
            "stream": "0x004D5DAC",
            "opcode": "0x13",
            "raw": "13 c0 5b 01 a8 5d 4d 00 10 c0 5b 00"
          },
          {
            "frame": 989,
            "pc": "0x00402321",
            "stream": "0x004F8F00",
            "opcode": "0x03",
            "raw": "03 00 00 00 f8 8e 4f 00 21 00 01 00"
          },
          {
            "frame": 989,
            "pc": "0x00402321",
            "stream": "0x00502328",
            "opcode": "0x03",
            "raw": "03 00 00 00 20 23 50 00 21 00 01 00"
          }
        ],
        "objectStreamTail": [
          {
            "frame": 988,
            "object": "0x0055D5D4",
            "old": "64 e7 47 00",
            "new": "5c e7 47 00"
          },
          {
            "frame": 988,
            "object": "0x0055D5D4",
            "old": "5c e7 47 00",
            "new": "60 e7 47 00"
          },
          {
            "frame": 988,
            "object": "0x0055D5D4",
            "old": "60 e7 47 00",
            "new": "64 e7 47 00"
          },
          {
            "frame": 989,
            "object": "0x0055D2F8",
            "old": "54 e7 47 00",
            "new": "50 e7 47 00"
          },
          {
            "frame": 989,
            "object": "0x0055D2F8",
            "old": "50 e7 47 00",
            "new": "54 e7 47 00"
          },
          {
            "frame": 989,
            "object": "0x0055D3EC",
            "old": "cc ed 4d 00",
            "new": "c8 ed 4d 00"
          },
          {
            "frame": 989,
            "object": "0x0055D3EC",
            "old": "c8 ed 4d 00",
            "new": "cc ed 4d 00"
          },
          {
            "frame": 989,
            "object": "0x0055D4E0",
            "old": "10 ee 4d 00",
            "new": "0c ee 4d 00"
          },
          {
            "frame": 989,
            "object": "0x0055D4E0",
            "old": "0c ee 4d 00",
            "new": "10 ee 4d 00"
          },
          {
            "frame": 989,
            "object": "0x0055D5D4",
            "old": "64 e7 47 00",
            "new": "5c e7 47 00"
          },
          {
            "frame": 989,
            "object": "0x0055D5D4",
            "old": "5c e7 47 00",
            "new": "60 e7 47 00"
          },
          {
            "frame": 989,
            "object": "0x0055D5D4",
            "old": "60 e7 47 00",
            "new": "64 e7 47 00"
          }
        ],
        "directRewardWriteCaptured": true,
        "directLevelupCaptured": true,
        "expRolloverCaptured": true,
        "statGrowthCaptured": true,
        "note": "levelup-reward 캡처는 value-probe로 EXP 88→100→0→7, level 1→2, HP/MP 성장 후보를 정적 level-up 주소 근처에서 직접 잡는다."
      },
      {
        "traceId": "battle-exp-level-gold",
        "manifest": "hwanse-runtime-trace-2026-07-08T07-30-45-360Z-battle-exp-level-gold.manifest.json",
        "jsonl": "hwanse-runtime-trace-2026-07-08T07-30-45-360Z-battle-exp-level-gold.jsonl",
        "profiles": [
          "vm-core",
          "selected-root",
          "descriptor-stack",
          "field",
          "resource"
        ],
        "frameRange": [
          3083,
          3254
        ],
        "eventCount": 16092,
        "topEventCounts": [
          [
            "draw-surface",
            6027
          ],
          [
            "function-enter",
            2184
          ],
          [
            "trace-trigger",
            1984
          ],
          [
            "vm-op",
            1816
          ],
          [
            "vm-op-transition",
            1815
          ],
          [
            "object-stream-change",
            1648
          ],
          [
            "mem-write",
            344
          ],
          [
            "sound-api",
            146
          ],
          [
            "resource-surface-label",
            20
          ],
          [
            "surface-snapshot",
            17
          ],
          [
            "surface-upload",
            16
          ],
          [
            "surface-palette",
            14
          ]
        ],
        "textDraws": [
          {
            "frame": 3088,
            "pc": "0x0041B548",
            "rect": "16,76,82,100",
            "text": "호격권　　　　　"
          },
          {
            "frame": 3245,
            "pc": "0x0041F293",
            "rect": "440,392,568,408",
            "text": "호랑이바위　산길"
          },
          {
            "frame": 3245,
            "pc": "0x0041F293",
            "rect": "440,432,488,448",
            "text": "번　돈"
          },
          {
            "frame": 3245,
            "pc": "0x0041F293",
            "rect": "600,432,616,448",
            "text": "Ｇ"
          }
        ],
        "resourceLabels": [
          [
            "map_b1.cns",
            3896
          ],
          [
            "01234567.cns",
            780
          ],
          [
            "status.cns",
            634
          ],
          [
            "btl_at.cns",
            163
          ],
          [
            "btl_etc.cns",
            97
          ],
          [
            "window.cns",
            66
          ],
          [
            "zsa_saru.cns",
            60
          ],
          [
            "map_b2.cns",
            34
          ],
          [
            "cara_at1.cns",
            13
          ],
          [
            "map_b3.cns",
            13
          ],
          [
            "frame.cns",
            3
          ],
          [
            "face_01.cns",
            3
          ],
          [
            "cara_01.cns",
            3
          ],
          [
            "cara_02.cns",
            3
          ],
          [
            "cara_efc.cns",
            3
          ],
          [
            "btl_efc.cns",
            2
          ],
          [
            "icon.cns",
            2
          ],
          [
            "item.cns",
            2
          ],
          [
            "icon_s.cns",
            2
          ],
          [
            "num.cns",
            2
          ]
        ],
        "memWriteNames": [
          [
            "0x0059E312",
            342
          ],
          [
            "0x0059E310",
            2
          ]
        ],
        "probeValueChanges": [],
        "staticAddressHits": [
          {
            "frame": 3088,
            "pc": "0x00427730",
            "caller": "0x004056F4",
            "function": "rng",
            "meaning": "rng helper",
            "args": [
              "0x004D0010",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 3088,
            "pc": "0x00427730",
            "caller": "0x0040CDD4",
            "function": "rng",
            "meaning": "rng helper",
            "args": [
              "0x000000C8",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 3088,
            "pc": "0x00427730",
            "caller": "0x00434333",
            "function": "rng",
            "meaning": "rng helper",
            "args": [
              "0x00590017",
              "0x00000000",
              "0x10001017",
              "0x00000064"
            ]
          },
          {
            "frame": 3088,
            "pc": "0x00427730",
            "caller": "0x00434348",
            "function": "rng",
            "meaning": "rng helper",
            "args": [
              "0x00000010",
              "0x00000000",
              "0x10001017",
              "0x00000064"
            ]
          },
          {
            "frame": 3088,
            "pc": "0x00427730",
            "caller": "0x00434426",
            "function": "rng",
            "meaning": "rng helper",
            "args": [
              "0x004D0064",
              "0x00000000",
              "0x10001017",
              "0x00000064"
            ]
          },
          {
            "frame": 3088,
            "pc": "0x00427730",
            "caller": "0x0043444B",
            "function": "rng",
            "meaning": "rng helper",
            "args": [
              "0x0059001E",
              "0x00000000",
              "0x10001017",
              "0x00000064"
            ]
          },
          {
            "frame": 3088,
            "pc": "0x00427730",
            "caller": "0x00434460",
            "function": "rng",
            "meaning": "rng helper",
            "args": [
              "0x00000064",
              "0x00000000",
              "0x10001017",
              "0x00000064"
            ]
          },
          {
            "frame": 3088,
            "pc": "0x00427730",
            "caller": "0x0043446D",
            "function": "rng",
            "meaning": "rng helper",
            "args": [
              "0x00000064",
              "0x00000000",
              "0x10001017",
              "0x00000064"
            ]
          },
          {
            "frame": 3088,
            "pc": "0x00427730",
            "caller": "0x004346D8",
            "function": "rng",
            "meaning": "rng helper",
            "args": [
              "0x004D0000",
              "0x00000000",
              "0x10001017",
              "0x00000064"
            ]
          },
          {
            "frame": 3088,
            "pc": "0x00427730",
            "caller": "0x004346E9",
            "function": "rng",
            "meaning": "rng helper",
            "args": [
              "0x00000001",
              "0x00000000",
              "0x10001017",
              "0x00000064"
            ]
          },
          {
            "frame": 3181,
            "pc": "0x00427730",
            "caller": "0x004217DF",
            "function": "rng",
            "meaning": "level-up HP increase RNG call",
            "args": [
              "0x00450003",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 3181,
            "pc": "0x00427730",
            "caller": "0x0042183B",
            "function": "rng",
            "meaning": "level-up stat RNG call",
            "args": [
              "0x00450002",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 3181,
            "pc": "0x00427730",
            "caller": "0x00421897",
            "function": "rng",
            "meaning": "level-up stat RNG call",
            "args": [
              "0x00450002",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 3181,
            "pc": "0x00427730",
            "caller": "0x004218DF",
            "function": "rng",
            "meaning": "level-up stat RNG call",
            "args": [
              "0x00450002",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 3181,
            "pc": "0x00427730",
            "caller": "0x00421927",
            "function": "rng",
            "meaning": "level-up stat RNG call",
            "args": [
              "0x00450003",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 3181,
            "pc": "0x00427730",
            "caller": "0x0042196F",
            "function": "rng",
            "meaning": "level-up stat RNG call",
            "args": [
              "0x00450003",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          },
          {
            "frame": 3181,
            "pc": "0x00427730",
            "caller": "0x004219AD",
            "function": "rng",
            "meaning": "level-up luck/random branch call",
            "args": [
              "0x00000064",
              "0x00000000",
              "0x10001017",
              "0x00000065"
            ]
          }
        ],
        "vmTail": [
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x0047E754",
            "opcode": "0x03",
            "raw": "03 00 00 00 50 e7 47 00 4d 00 00 00"
          },
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x004DEDCC",
            "opcode": "0x03",
            "raw": "03 00 00 00 c8 ed 4d 00 08 00 00 00"
          },
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x004DEE10",
            "opcode": "0x03",
            "raw": "03 00 00 00 0c ee 4d 00 08 00 00 00"
          },
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x0047E764",
            "opcode": "0x03",
            "raw": "03 00 00 00 5c e7 47 00 9c 00 00 00"
          },
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x0047E718",
            "opcode": "0x03",
            "raw": "03 00 00 00 10 e7 47 00 08 00 00 00"
          },
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x00442BAD",
            "opcode": "0x02",
            "raw": "02 00 02 00 5d 02 00 00 00 00 03 00"
          },
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x004F8E44",
            "opcode": "0x13",
            "raw": "13 a1 68 6c 40 8e 4f 00 18 a0 64 68"
          },
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x00502018",
            "opcode": "0x03",
            "raw": "03 00 00 00 14 20 50 00 24 01 00 29"
          },
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x005020B4",
            "opcode": "0x03",
            "raw": "03 00 00 00 b0 20 50 00 00 00 00 00"
          },
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x00502290",
            "opcode": "0x13",
            "raw": "13 a1 68 6c 8c 22 50 00 18 a0 64 68"
          },
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x004F8F00",
            "opcode": "0x03",
            "raw": "03 00 00 00 f8 8e 4f 00 21 00 01 00"
          },
          {
            "frame": 3254,
            "pc": "0x00402321",
            "stream": "0x00502328",
            "opcode": "0x03",
            "raw": "03 00 00 00 20 23 50 00 21 00 01 00"
          }
        ],
        "objectStreamTail": [
          {
            "frame": 3254,
            "object": "0x0055BE00",
            "old": "01 00",
            "new": "00 00"
          },
          {
            "frame": 3254,
            "object": "0x0055BE00",
            "old": "04 18 50 00",
            "new": "70 e6 47 00"
          },
          {
            "frame": 3254,
            "object": "0x0055BE00",
            "old": "7c e6 47 00",
            "new": "80 e6 47 00"
          },
          {
            "frame": 3254,
            "object": "0x0055D2F8",
            "old": "54 e7 47 00",
            "new": "50 e7 47 00"
          },
          {
            "frame": 3254,
            "object": "0x0055D2F8",
            "old": "50 e7 47 00",
            "new": "54 e7 47 00"
          },
          {
            "frame": 3254,
            "object": "0x0055D3EC",
            "old": "cc ed 4d 00",
            "new": "c8 ed 4d 00"
          },
          {
            "frame": 3254,
            "object": "0x0055D3EC",
            "old": "c8 ed 4d 00",
            "new": "cc ed 4d 00"
          },
          {
            "frame": 3254,
            "object": "0x0055D4E0",
            "old": "10 ee 4d 00",
            "new": "0c ee 4d 00"
          },
          {
            "frame": 3254,
            "object": "0x0055D4E0",
            "old": "0c ee 4d 00",
            "new": "10 ee 4d 00"
          },
          {
            "frame": 3254,
            "object": "0x0055D5D4",
            "old": "64 e7 47 00",
            "new": "5c e7 47 00"
          },
          {
            "frame": 3254,
            "object": "0x0055D5D4",
            "old": "5c e7 47 00",
            "new": "60 e7 47 00"
          },
          {
            "frame": 3254,
            "object": "0x0055D5D4",
            "old": "60 e7 47 00",
            "new": "64 e7 47 00"
          }
        ],
        "directRewardWriteCaptured": false,
        "directLevelupCaptured": false,
        "expRolloverCaptured": false,
        "statGrowthCaptured": false,
        "note": "이전 캡처는 보상 관찰치와 전투 종료 경계 bridge로 유지한다."
      }
    ]
  },
  "evidence": [
    {
      "label": "battle KO reward loop",
      "range": "0x0040dfb8..0x0040e0c2",
      "keyLines": [
        "  40dfc0:\t57                   \tpush   edi",
        "  40dfc1:\te8 d3 5c 02 00       \tcall   0x433c99",
        "  40dfc6:\t33 c9                \txor    ecx,ecx",
        "  40dfd2:\tff 45 fc             \tinc    DWORD PTR [ebp-0x4]",
        "  40dfd5:\te8 e6 5d 02 00       \tcall   0x433dc0",
        "  40dfda:\t33 c9                \txor    ecx,ecx",
        "  40dff1:\t33 c9                \txor    ecx,ecx",
        "  40dff3:\t8a 48 04             \tmov    cl,BYTE PTR [eax+0x4]",
        "  40dff6:\t83 f9 02             \tcmp    ecx,0x2",
        "  40e010:\t8a 48 62             \tmov    cl,BYTE PTR [eax+0x62]",
        "  40e013:\tf6 c1 40             \ttest   cl,0x40",
        "  40e016:\t0f 84 95 00 00 00    \tje     0x40e0b1",
        "  40e02b:\t33 c0                \txor    eax,eax",
        "  40e02d:\ta0 e8 76 45 00       \tmov    al,ds:0x4576e8",
        "  40e032:\t3b 45 f8             \tcmp    eax,DWORD PTR [ebp-0x8]",
        "  40e047:\t8a 48 62             \tmov    cl,BYTE PTR [eax+0x62]",
        "  40e04a:\tf6 c1 80             \ttest   cl,0x80",
        "  40e04d:\t0f 84 05 00 00 00    \tje     0x40e058",
        "  40e06d:\t50                   \tpush   eax",
        "  40e06e:\te8 08 35 01 00       \tcall   0x42157b",
        "  40e073:\t83 c4 08             \tadd    esp,0x8",
        "  40e083:\t33 d2                \txor    edx,edx",
        "  40e085:\t66 8b 51 14          \tmov    dx,WORD PTR [ecx+0x14]",
        "  40e089:\t03 c2                \tadd    eax,edx",
        "  40e08e:\t8b 0c 8d 30 db 59 00 \tmov    ecx,DWORD PTR [ecx*4+0x59db30]",
        "  40e095:\t66 89 41 14          \tmov    WORD PTR [ecx+0x14],ax",
        "  40e099:\te9 8a ff ff ff       \tjmp    0x40e028",
        "  40e0a8:\t50                   \tpush   eax",
        "  40e0a9:\te8 88 76 02 00       \tcall   0x435736",
        "  40e0ae:\t83 c4 04             \tadd    esp,0x4"
      ]
    },
    {
      "label": "EXP reward formula",
      "range": "0x0042157b..0x0042177f",
      "keyLines": [
        "  421587:\t33 c9                \txor    ecx,ecx",
        "  421589:\t66 8b 48 06          \tmov    cx,WORD PTR [eax+0x6]",
        "  42158d:\t8b 45 08             \tmov    eax,DWORD PTR [ebp+0x8]",
        "  421590:\t33 d2                \txor    edx,edx",
        "  421592:\t66 8b 50 06          \tmov    dx,WORD PTR [eax+0x6]",
        "  421596:\t3b ca                \tcmp    ecx,edx",
        "  4215a1:\t33 c9                \txor    ecx,ecx",
        "  4215a3:\t66 8b 48 06          \tmov    cx,WORD PTR [eax+0x6]",
        "  4215a7:\t8b 45 08             \tmov    eax,DWORD PTR [ebp+0x8]",
        "  4215aa:\t33 d2                \txor    edx,edx",
        "  4215ac:\t66 8b 50 06          \tmov    dx,WORD PTR [eax+0x6]",
        "  4215b0:\t2b ca                \tsub    ecx,edx",
        "  4215be:\t33 c9                \txor    ecx,ecx",
        "  4215c0:\t66 8b 48 06          \tmov    cx,WORD PTR [eax+0x6]",
        "  4215c4:\t8b 45 0c             \tmov    eax,DWORD PTR [ebp+0xc]",
        "  4215c7:\t33 d2                \txor    edx,edx",
        "  4215c9:\t66 8b 50 06          \tmov    dx,WORD PTR [eax+0x6]",
        "  4215cd:\t2b ca                \tsub    ecx,edx",
        "  4215d6:\t25 ff ff 00 00       \tand    eax,0xffff",
        "  4215db:\t83 f8 0a             \tcmp    eax,0xa",
        "  4215de:\t0f 8c 05 00 00 00    \tjl     0x4215e9",
        "  4215f0:\t33 c9                \txor    ecx,ecx",
        "  4215f2:\t66 8b 48 06          \tmov    cx,WORD PTR [eax+0x6]",
        "  4215f6:\t8b 45 08             \tmov    eax,DWORD PTR [ebp+0x8]",
        "  4215f9:\t33 d2                \txor    edx,edx",
        "  4215fb:\t66 8b 50 06          \tmov    dx,WORD PTR [eax+0x6]",
        "  4215ff:\t3b ca                \tcmp    ecx,edx",
        "  42160a:\t33 c9                \txor    ecx,ecx",
        "  42160c:\t66 8b 48 14          \tmov    cx,WORD PTR [eax+0x14]",
        "  421610:\t8b 45 0c             \tmov    eax,DWORD PTR [ebp+0xc]",
        "  421613:\t33 d2                \txor    edx,edx",
        "  421615:\t66 8b 50 14          \tmov    dx,WORD PTR [eax+0x14]",
        "  421619:\t8b 45 fc             \tmov    eax,DWORD PTR [ebp-0x4]",
        "  42163b:\t33 c9                \txor    ecx,ecx",
        "  42163d:\t66 8b 48 14          \tmov    cx,WORD PTR [eax+0x14]",
        "  421641:\t8b 45 fc             \tmov    eax,DWORD PTR [ebp-0x4]",
        "  42164b:\t0f 8d 0b 00 00 00    \tjge    0x42165c",
        "  421651:\t66 c7 45 fc 01 00    \tmov    WORD PTR [ebp-0x4],0x1",
        "  421657:\te9 00 00 00 00       \tjmp    0x42165c",
        "  421664:\t33 c9                \txor    ecx,ecx",
        "  421666:\t66 8b 48 14          \tmov    cx,WORD PTR [eax+0x14]",
        "  42166a:\t8b 45 fc             \tmov    eax,DWORD PTR [ebp-0x4]",
        "  4216a7:\t33 c9                \txor    ecx,ecx",
        "  4216a9:\t8a 8c c0 98 77 45 00 \tmov    cl,BYTE PTR [eax+eax*8+0x457798]",
        "  4216b0:\t89 4d f8             \tmov    DWORD PTR [ebp-0x8],ecx",
        "  4216d0:\t25 ff ff 00 00       \tand    eax,0xffff",
        "  4216d5:\tc1 e8 01             \tshr    eax,0x1",
        "  4216d8:\t66 89 45 fc          \tmov    WORD PTR [ebp-0x4],ax",
        "  4216dc:\te9 06 00 00 00       \tjmp    0x4216e7",
        "  4216e1:\t66 c7 45 fc 01 00    \tmov    WORD PTR [ebp-0x4],0x1",
        "  4216e7:\te9 14 00 00 00       \tjmp    0x421700",
        "  42170e:\t33 c9                \txor    ecx,ecx",
        "  421710:\t8a 8c c0 99 77 45 00 \tmov    cl,BYTE PTR [eax+eax*8+0x457799]",
        "  421717:\t89 4d f4             \tmov    DWORD PTR [ebp-0xc],ecx",
        "  421737:\t25 ff ff 00 00       \tand    eax,0xffff",
        "  42173c:\tc1 e8 01             \tshr    eax,0x1",
        "  42173f:\t66 89 45 fc          \tmov    WORD PTR [ebp-0x4],ax",
        "  421743:\te9 06 00 00 00       \tjmp    0x42174e",
        "  421748:\t66 c7 45 fc 01 00    \tmov    WORD PTR [ebp-0x4],0x1",
        "  42174e:\te9 1e 00 00 00       \tjmp    0x421771"
      ]
    },
    {
      "label": "gold reward / item-drop handler",
      "range": "0x00435736..0x004357d0",
      "keyLines": [
        "  435742:\t33 c9                \txor    ecx,ecx",
        "  435744:\t66 8b 48 44          \tmov    cx,WORD PTR [eax+0x44]",
        "  435748:\t89 4d fc             \tmov    DWORD PTR [ebp-0x4],ecx",
        "  43574b:\ta1 e0 76 45 00       \tmov    eax,ds:0x4576e0",
        "  435750:\t03 45 fc             \tadd    eax,DWORD PTR [ebp-0x4]",
        "  435753:\t3d 3f 42 0f 00       \tcmp    eax,0xf423f",
        "  435758:\t0f 86 0f 00 00 00    \tjbe    0x43576d",
        "  43575e:\tc7 05 e0 76 45 00 3f \tmov    DWORD PTR ds:0x4576e0,0xf423f",
        "  435765:\t42 0f 00",
        "  435770:\t33 c9                \txor    ecx,ecx",
        "  435772:\t66 8b 48 44          \tmov    cx,WORD PTR [eax+0x44]",
        "  435776:\t01 0d e0 76 45 00    \tadd    DWORD PTR ds:0x4576e0,ecx",
        "  43577c:\t8b 45 08             \tmov    eax,DWORD PTR [ebp+0x8]",
        "  43577f:\t33 c9                \txor    ecx,ecx",
        "  435781:\t8a 48 40             \tmov    cl,BYTE PTR [eax+0x40]",
        "  435784:\t85 c9                \ttest   ecx,ecx",
        "  43578c:\t8b 45 08             \tmov    eax,DWORD PTR [ebp+0x8]",
        "  43578f:\t66 0f b6 40 41       \tmovzx  ax,BYTE PTR [eax+0x41]",
        "  435794:\t50                   \tpush   eax",
        "  435795:\te8 96 1f ff ff       \tcall   0x427730",
        "  43579a:\t83 c4 04             \tadd    esp,0x4",
        "  4357aa:\t8b 45 08             \tmov    eax,DWORD PTR [ebp+0x8]",
        "  4357ad:\t8a 40 40             \tmov    al,BYTE PTR [eax+0x40]",
        "  4357b0:\t50                   \tpush   eax",
        "  4357b1:\te8 dd c8 fe ff       \tcall   0x422093",
        "  4357b6:\t83 c4 08             \tadd    esp,0x8",
        "  4357b9:\t8b 45 08             \tmov    eax,DWORD PTR [ebp+0x8]",
        "  4357bc:\t8a 40 40             \tmov    al,BYTE PTR [eax+0x40]",
        "  4357bf:\te9 07 00 00 00       \tjmp    0x4357cb"
      ]
    },
    {
      "label": "money add/subtract VM helper",
      "range": "0x00406a38..0x00406ae8",
      "keyLines": [
        "  406a5a:\t8b 40 04             \tmov    eax,DWORD PTR [eax+0x4]",
        "  406a5d:\t03 05 e0 76 45 00    \tadd    eax,DWORD PTR ds:0x4576e0",
        "  406a63:\t3d 3f 42 0f 00       \tcmp    eax,0xf423f",
        "  406a68:\t0f 83 14 00 00 00    \tjae    0x406a82",
        "  406a74:\t8b 40 04             \tmov    eax,DWORD PTR [eax+0x4]",
        "  406a77:\t01 05 e0 76 45 00    \tadd    DWORD PTR ds:0x4576e0,eax",
        "  406a7d:\te9 0a 00 00 00       \tjmp    0x406a8c",
        "  406a82:\tc7 05 e0 76 45 00 3f \tmov    DWORD PTR ds:0x4576e0,0xf423f",
        "  406a89:\t42 0f 00",
        "  406a9b:\t8b 40 40             \tmov    eax,DWORD PTR [eax+0x40]",
        "  406a9e:\t8b 0d e0 76 45 00    \tmov    ecx,DWORD PTR ds:0x4576e0",
        "  406aa4:\t39 48 04             \tcmp    DWORD PTR [eax+0x4],ecx",
        "  406acc:\tf7 d8                \tneg    eax",
        "  406ace:\t29 05 e0 76 45 00    \tsub    DWORD PTR ds:0x4576e0,eax",
        "  406ad4:\t8b 45 08             \tmov    eax,DWORD PTR [ebp+0x8]"
      ]
    },
    {
      "label": "shop/inventory money checks",
      "range": "0x0040fd11..0x0041004f",
      "keyLines": [
        "  40fd27:\t66 8b 5c 81 02       \tmov    bx,WORD PTR [ecx+eax*4+0x2]",
        "  40fd2c:\ta1 e0 76 45 00       \tmov    eax,ds:0x4576e0",
        "  40fd31:\t2b d2                \tsub    edx,edx",
        "  40fd33:\tf7 f3                \tdiv    ebx",
        "  40fd35:\ta2 3b e3 59 00       \tmov    ds:0x59e33b,al",
        "  40fdae:\t66 8b 5c 81 02       \tmov    bx,WORD PTR [ecx+eax*4+0x2]",
        "  40fdb3:\ta1 e0 76 45 00       \tmov    eax,ds:0x4576e0",
        "  40fdb8:\t2b d2                \tsub    edx,edx",
        "  40fdba:\tf7 f3                \tdiv    ebx",
        "  40fdbc:\ta2 3b e3 59 00       \tmov    ds:0x59e33b,al",
        "  40fdd0:\t03 c1                \tadd    eax,ecx",
        "  40fdd2:\t83 f8 0a             \tcmp    eax,0xa",
        "  40fdd5:\t0f 8e 14 00 00 00    \tjle    0x40fdef",
        "  40fe22:\t66 8b 5c 81 02       \tmov    bx,WORD PTR [ecx+eax*4+0x2]",
        "  40fe27:\ta1 e0 76 45 00       \tmov    eax,ds:0x4576e0",
        "  40fe2c:\t2b d2                \tsub    edx,edx",
        "  40fe2e:\tf7 f3                \tdiv    ebx",
        "  40fe30:\ta2 3b e3 59 00       \tmov    ds:0x59e33b,al",
        "  41003b:\tf7 d8                \tneg    eax",
        "  41003d:\t29 05 e0 76 45 00    \tsub    DWORD PTR ds:0x4576e0,eax",
        "  410043:\t8b 45 08             \tmov    eax,DWORD PTR [ebp+0x8]"
      ]
    },
    {
      "label": "level-up carryover",
      "range": "0x0042177f..0x00421b33",
      "keyLines": [
        "  42179e:\t8a 88 e9 76 45 00    \tmov    cl,BYTE PTR [eax+0x4576e9]",
        "  4217a4:\t8d 04 49             \tlea    eax,[ecx+ecx*2]",
        "  4217a7:\tc1 e0 03             \tshl    eax,0x3",
        "  4217c7:\t8b 45 ec             \tmov    eax,DWORD PTR [ebp-0x14]",
        "  4217ca:\t66 ff 40 06          \tinc    WORD PTR [eax+0x6]",
        "  4217ce:\t8b 45 ec             \tmov    eax,DWORD PTR [ebp-0x14]",
        "  4219e0:\t8b 45 e4             \tmov    eax,DWORD PTR [ebp-0x1c]",
        "  4219e3:\t66 ff 40 06          \tinc    WORD PTR [eax+0x6]",
        "  4219e7:\t8b 45 e4             \tmov    eax,DWORD PTR [ebp-0x1c]",
        "  421aed:\t33 c9                \txor    ecx,ecx",
        "  421aef:\t66 8b 48 14          \tmov    cx,WORD PTR [eax+0x14]",
        "  421af3:\t8b 45 e4             \tmov    eax,DWORD PTR [ebp-0x1c]",
        "  421af6:\t33 d2                \txor    edx,edx",
        "  421af8:\t66 8b 50 16          \tmov    dx,WORD PTR [eax+0x16]",
        "  421afc:\t2b ca                \tsub    ecx,edx",
        "  421afe:\t8d 04 49             \tlea    eax,[ecx+ecx*2]",
        "  421b01:\t99                   \tcdq",
        "  421b05:\t03 c2                \tadd    eax,edx",
        "  421b07:\tc1 f8 02             \tsar    eax,0x2",
        "  421b0a:\t8b 4d e4             \tmov    ecx,DWORD PTR [ebp-0x1c]",
        "  421b0d:\t66 89 41 14          \tmov    WORD PTR [ecx+0x14],ax",
        "  421b11:\t33 c9                \txor    ecx,ecx",
        "  421b24:\t00 00 00",
        "  421b27:\tb0 01                \tmov    al,0x1",
        "  421b29:\te9 00 00 00 00       \tjmp    0x421b2e"
      ]
    }
  ],
  "openQuestions": []
}
