Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@

All notable changes to Hack Engine are documented here.

## [1.3.5] - 2026-09-29

- Unify Simple and Advanced into one scan workflow with expandable Scan options.
- Keep active scan settings visible while options are collapsed.
- Share candidate filtering, sorting, watches, and one value editor across popup, sidebar, and pop-out.
- Preserve scan configuration during refinement and refresh the object-picker summary.
- Prevent paused Ruffle games from resuming through player-overlay input.
- Preserve newer scans during asynchronous reset cleanup and background state recovery.

## [1.3.0] - 2026-09-27

Not published to browser stores. Game pause controls and automatic pause during scanning.
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Hack Engine helps you find, watch, and change accessible numeric values in WebAs

Everything happens locally in the inspected tab. Hack Engine has no accounts, telemetry, advertising, or remote service.

> Current release: **v1.3.0 release candidate — not published**. Core workflows are tested locally on Linux Firefox and Chromium; the remaining release gates are recorded in [IMPLEMENTATION_1_0.md](IMPLEMENTATION_1_0.md).
> Current release: **v1.3.5 release candidate — awaiting validation and store review**. The current release checks cover the controlled eight-game matrix and packaged browser regressions described in [test/GAME_TESTING.md](test/GAME_TESTING.md). Historical 1.0 qualification notes remain in [IMPLEMENTATION_1_0.md](IMPLEMENTATION_1_0.md).

## What you can do

Expand All @@ -13,7 +13,7 @@ Everything happens locally in the inspected tab. Hack Engine has no accounts, te
- **Recover mistakes:** Undo one refinement, restore the last write when the game has not changed it, and stop all freezes.
- **Edit and freeze:** Replace a discovered value or keep it fixed while the game runs.
- **Watch values live:** Keep useful candidates visible as they change and give each watch a descriptive label.
- **Start simple, go deeper:** Use Quick scan for the common workflow, then open Advanced controls when you need more options.
- **Start simple, go deeper:** Scan with Automatic defaults, then expand **Scan options** when you need more control.
- **Keep one shared workspace:** Candidates, watches, selections, and freezes stay synchronized between the toolbar, sidebar, and pop-out.

## How to use Hack Engine
Expand All @@ -24,11 +24,11 @@ Everything happens locally in the inspected tab. Hack Engine has no accounts, te
4. Change that value in the game, enter the new value, and choose **Next scan**.
5. Repeat until only a small number of candidates remain, then select one to watch, edit, or freeze it.

If the exact value is not known, start with **Unknown initial value** and refine after the game changes. **Value range** helps with rounded or approximate values. Advanced mode also provides explicit number-format, alignment, multiplier, and inspection-source controls. Add known addresses, select individual candidates to watch, edit each watch's label, and sort addresses or values in either direction. Write feedback follows verification through 250 ms; expandable details distinguish verification from game restoration or failed reads.
If the exact value is not known, start with **Unknown initial value** and refine after the game changes. **Value range** helps with rounded or approximate values. Expand **Scan options** to choose a number format, alignment, or JavaScript object. Non-default settings remain visible in the collapsed summary. The toolbar, sidebar, and pop-out all provide **Candidates** and **Watches**, filtering, sorting, and one selected-value editor. Select individual candidates to watch, edit each watch's label, and sort addresses or values in either direction. Write feedback follows verification through 250 ms; expandable details distinguish verification from game restoration or failed reads.

## JavaScript games

Choose **JavaScript objects** as the source and scan normally. Advanced controls offer an object picker to narrow discovery. Results show property paths instead of memory addresses. If discovery reaches a limit, the panel reports partial coverage; choose a narrower object and scan again. A replaced object makes its old watches unavailable rather than redirecting writes.
Choose **JavaScript objects** as the source and scan normally. Expand **Scan options** to use the object picker and narrow discovery. Results show property paths instead of memory addresses. If discovery reaches a limit, the panel reports partial coverage; choose a narrower object and scan again. A replaced object makes its old watches unavailable rather than redirecting writes.

## Browser support

Expand Down Expand Up @@ -62,7 +62,7 @@ Reload the game page after loading the extension so Hack Engine can detect the p
## Good to know

- Hack Engine searches captured WebAssembly memory and reachable JavaScript object properties. Private variables, worker state, encoded values, and server-controlled state are outside this release. See [compatibility](COMPATIBILITY.md) for tested coverage and limits.
- A displayed number may be rounded, scaled, copied, or recalculated by the game. Range scans, comparison scans, and Advanced mode can help identify the useful value.
- A displayed number may be rounded, scaled, copied, or recalculated by the game. Range scans, comparison scans, and additional scan options can help identify the useful value.
- Editing the wrong address can reset or crash the embedded player. Use Hack Engine only with games and software you own or are authorized to inspect.

## Planned features
Expand Down
16 changes: 8 additions & 8 deletions USER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ Hack Engine finds, watches, and edits accessible numeric values in WebAssembly a
5. Select a candidate. Selection adds it to the shared watch list automatically.
6. Enter a replacement and choose **Write value**. Use **Freeze** only when the game repeatedly restores the address.

## Persistent and advanced views
## One workflow across popup, sidebar, and pop-out

The toolbar popup closes when focus returns to the page. Use the pin to open the persistent sidebar. The sidebar's **Advanced** view adds explicit number format, alignment, and inspection-source controls plus filtering, sorting, and watches.
The toolbar popup closes when focus returns to the page. Use the pin to open the persistent sidebar. Every surface uses the same scan form, with Automatic defaults and expandable **Scan options** for number format, alignment, and the JavaScript object picker. Non-default settings remain visible in the collapsed summary. Expanding or collapsing these options preserves the current scan and results.

Both views show candidates with recommended variable types first: Float64 for AVM1, or Int32, Uint32, then Float64 for AVM2. WebAssembly prioritizes Int32, Uint32, Float32, then Float64. Candidates within each priority are ordered by address; when Ruffle AVM is unknown, candidates are ordered by address. Advanced defaults to **Recommended types**, with ascending/descending Address and Value sorting and Type sorting available. Counts distinguish displayed preview rows from all scan matches. Simple always uses the recommended order.
Candidates default to recommended variable types first: Float64 for AVM1, or Int32, Uint32, then Float64 for AVM2. WebAssembly prioritizes Int32, Uint32, Float32, then Float64. Candidates within each priority are ordered by address; when Ruffle AVM is unknown, candidates are ordered by address. The **Candidates** and **Watches** tabs, filtering, and sorting are available in the toolbar, sidebar, and pop-out. Sorting defaults to **Recommended types**, with ascending/descending Address and Value sorting and Type sorting available. Counts distinguish displayed preview rows from all scan matches; the candidate preview shows up to 200 rows. Select a candidate or watch to use the same value editor.

AVM detection uses only players linked to the selected memory through Ruffle's metadata callback. Unknown types are checked once per second for up to 15 retries; detection stops early on success and updates the runtime hints automatically. A new movie's metadata event starts a fresh retry budget. Existing scan results are retained. Some Ruffle players share one memory: if that memory contains both AVM1 and AVM2, or ownership cannot be established, it stays **Unknown** and Automatic searches all numeric types.

The toolbar, sidebar, and pop-out share the inspected tab's scan, candidates, watches, primary selection, and freeze state. Advanced controls provide the complete supported workflow; there is no separate inspector or DevTools entry.
The toolbar, sidebar, and pop-out share the inspected tab's scan, candidates, watches, primary selection, and freeze state. Each surface provides the complete supported workflow; there is no separate inspector or DevTools entry.

### Known addresses and watch labels

Expand All @@ -30,15 +30,15 @@ A live session supports up to 256 watches. Each watch can be edited or frozen in

## Pausing the game

Use **Pause game** to suspend a supported Ruffle game, then **Resume game** to continue. The controls are available in both Simple and Advanced views. If a Ruffle memory is shared by multiple associated players, pausing that source pauses all of those players.
Use **Pause game** to suspend a supported Ruffle game, then **Resume game** to continue. The controls are available in the toolbar, sidebar, and pop-out. If a Ruffle memory is shared by multiple associated players, pausing that source pauses all of those players.

Enable **Pause while scanning** to pause during first scans, refinements, and searches across all number formats. The preference is saved. A game that was running resumes when the scan completes, fails, or is cancelled; a game already paused stays paused. Manual pause remains active when you close the popup, so reopen the controls to resume. Disconnecting the page bridge or leaving the page releases pauses owned by Hack Engine.

Pause requires a Ruffle player linked to the selected memory with a supported playback API. The controls are disabled for other WebAssembly and JavaScript sources, or when player ownership is unknown. Scanning those sources still works, but does not pause them. Games with independent workers or server activity are outside this pause control.

## Numeric formats

If the Simple scan does not find the value, try **All numeric types** in Advanced. Common Ruffle representations include `Float64` for AVM1 numbers and `Int32`, `Uint32`, or `Float64` for AVM2 values. **Any byte** alignment is slower but can find unaligned values.
If an Automatic scan does not find the value, try **Search all number formats** after an exact/range scan, or reset the scan and choose **All numeric types** in **Scan options**. Common Ruffle representations include `Float64` for AVM1 numbers and `Int32`, `Uint32`, or `Float64` for AVM2 values. **Any byte** alignment is slower but can find unaligned values.

## Why a displayed value may not appear

Expand Down Expand Up @@ -76,7 +76,7 @@ Scans are limited to captured memories of at most 256 MiB. Snapshot scans check

## JavaScript discovery

Select **JavaScript objects** for reachable numeric own properties in plain objects, arrays, and numeric typed arrays. First scan discovers available values; subsequent scans filter those same live properties. Advanced offers an object picker; it accepts selections, never executable expressions. Number format, alignment, and scaling apply only to WebAssembly.
Select **JavaScript objects** for reachable numeric own properties in plain objects, arrays, and numeric typed arrays. First scan discovers available values; subsequent scans filter those same live properties. **Scan options** offers an object picker; it accepts selections, never executable expressions. Alignment applies only to WebAssembly.

Discovery skips ordinary getters and browser/DOM internals. JavaScript Proxy inspection traps can still execute; this is not an isolated debugger. Closures, module-private state, class instances, Map/Set contents, BigInt, workers, and server state are not searched.

Expand All @@ -86,6 +86,6 @@ Read-only values can be watched but cannot be edited. Typed-array writes must fi

### Targeted number formats

In Advanced, **Number format** controls the first scan. WebAssembly Automatic starts with Int32, Uint32, Float32 and Float64; decimal searches use Float32 and Float64. These are heuristic starting formats, not detected source-language types. Choose **All numeric types** (or **Search all number formats** after an exact/range scan) to include 8-bit and 16-bit integers. Individual formats remain selectable. Unknown Ruffle runtimes still search all formats.
In **Scan options**, **Number format** controls the first scan. WebAssembly Automatic starts with Int32, Uint32, Float32 and Float64; decimal searches use Float32 and Float64. These are heuristic starting formats, not detected source-language types. Choose **All numeric types** (or **Search all number formats** after an exact/range scan) to include 8-bit and 16-bit integers. Individual formats remain selectable. Unknown Ruffle runtimes still search all formats.

For JavaScript, Automatic and All numeric types search all reachable finite numbers. **Number properties** targets ordinary object and array properties. The typed-array choices target actual element storage, such as Float32Array or Int32Array; Uint8 also includes Uint8ClampedArray. A whole-valued ordinary JavaScript Number is still a Number property, not an Int32 element. Choose an object to narrow discovery further. Reset the scan to change formats.
Loading
Loading