Releases: SaekoM/Fap-Hero-Journey
Release v0.3.2
Fap Hero Journey — v0.3.2
This one's about progression and upkeep: your runs now get scored and kept,
pausing costs you, and the app can update itself.
Existing journeys, saves, and settings carry over untouched.
✨ Highlights
- Local scoreboard — a high-score history for each journey.
- Pause penalty — your score drains while you're paused.
- In-app updater — check, download, and stage a new build from inside the app.
🏆 Local Scoreboard
Every run you finish — or abandon — is recorded per journey, ranked by score.
- A HIGH SCORES panel appears beside a journey's details in the selector,
listing your top runs with the outcome (✓ complete or ✗ round 4/9) and
the date. - Both completed and abandoned runs are tracked (quitting to the menu
mid-journey counts as an attempt — Save & Quit at a checkpoint does not). - Clear a journey's history anytime from the panel. It's also cleared
automatically when you rebuild/re-import or delete the journey.
⏸ Pause Penalty
Stepping away now has a cost.
- While the game is actively paused — the pause button or the Options menu —
your score ticks down each second. - System pauses are free: boss intros, checkpoint banners, shops, forks, and
storyboards never penalize you. - The penalty only eats into the current round's score and never drops below
zero — points you've already banked are safe.
⬇ In-App Updater
No more manually checking the forum for new builds.
- The main menu checks for a newer release on launch and shows an
"Update available" banner. - Click it to download the new build, verify it, and extract it into a fresh
folder next to your current install — the folder opens automatically. Close
the app, run the new version, and delete the old folder. - The updater never overwrites the running app, so there's nothing to corrupt.
- Don't want it pinging for updates? Turn it off: Options → "Check for updates
on launch."
🔧 Under the hood
- Added an automated test suite (51 tests) and CI that runs on every change —
fewer regressions reaching you. - Internal cleanups to the fork-resolution, sensory-effect, and save code (no
behaviour change).
🐛 Fixes
- The score could quietly tick up in the background behind a boss intro or
checkpoint banner — playback is now properly frozen until the round begins.
Release v0.3.1
Fixed bug where checkpoints weren't working as intended on boss rounds.
Release v0.3.0
Fap Hero Journey — v0.3.0
The round-behaviour update. Alongside Normal and Boss rounds, you can now author
Cursed and Blessed rounds, and layer in a brand-new set of non-gameplay
visual & audio modifiers — each with its own adjustable intensity — on top of
cursed and boss rounds alike.
Existing journeys keep working unchanged; everything new is opt-in and defaults
to off.
✨ Highlights
- Cursed rounds — an affliction (or two) hits at round start. Pay to cleanse
it, or endure it for a bonus. - Blessed rounds — the positive mirror: score, coin, and stroke boons, plus
protective buffs. - Non-gameplay modifiers — 22 purely visual/audio effects (blur, pixelate,
grayscale, vignette, static, screen shake, muffle, reverb, distortion, and
more), each with a 0–100% intensity slider. - Intro cards — cursed/blessed rounds telegraph their effects with an
animated card, now toggleable per round for surprise rounds. - Storyboard item rewards and a new Cleanse item.
☠ Cursed Rounds
A cursed round applies one or more gameplay curses at the start. Items stay
usable, so you can fight back — or pay the round's cleanse cost (coins, or a
free Cleanse item) to lift it. Carry it to the end without cleansing and you
collect the round's endure reward.
- Gameplay curse catalog: Shrunken (shorter strokes), Choked / Sunken
(range-clamped), Inverted (up/down flipped), Numbed (device ignores the
script), Greed / Pauper (coin penalties), Toll (instant coin loss), Fog (HUD
hidden), Restless (can't pause). - Fixed or random: tick exactly which curses apply, or leave it to a roll
from the pool. Random rounds occasionally land a double curse. - Per-round economy: author the cleanse cost and the endure reward.
✦ Blessed Rounds
The positive counterpart — pure upside, no cleanse or cost.
- Boon catalog: Fervor (double score), Fortune (double coins), Surge
(stronger, longer strokes), Gift (start the round holding a free item), Ward
(repels the next curse — carries across rounds), Lingering (your active item
effects don't run out this round), Interest (gain coins equal to 25% of your
balance). - Fixed or random selection, same as cursed rounds.
🎨 Non-gameplay Modifiers (Visual & Audio)
A new category of effects that change only how a round looks and sounds —
they never touch the device, score, or economy. Add them to cursed rounds
(where they're part of the cleanse) or boss rounds (forced, no cleanse), and
dial each one's strength with an intensity slider.
Visual
- Blinded — the video is hidden; the device plays on in the dark
- Murk — the screen is dimmed
- Tunnel — vision closes to a narrow tunnel
- Strobe — the screen fades to black and back
- Drained — color drained to grayscale
- Bleary — the video blurs out of focus
- Censored — the video is pixelated
- Negative — colors inverted
- Faded — washed out to sepia
- Banded — colors crushed into harsh bands
- Feverish — colors run hot and oversaturated
- Fracture — colors split apart (chromatic aberration)
- Swoon — the video ripples and sways
- Bloodshot — a red haze pulses over the screen
- Interference — static crawls across the screen
- Flicker — the screen flickers erratically
- Tremor — the screen shakes
Audio
- Silence — the audio is muted
- Muffled — audio muffled, as if underwater
- Cavern — audio echoes in a vast space
- Distorted — audio distorted and harsh
- Faltering — audio swells and fades
Intensity: every effect except the all-or-nothing ones (Blinded, Silence)
has a per-round intensity. On a cursed round you can also let non-gameplay
modifiers into the random pool, so a roll can surprise the player with a
visual/audio twist — off by default.
Intro Cards
Cursed and blessed rounds open with an animated card naming the effect(s) before
the video starts. New Show intro card toggle (on by default) lets you turn it
off per round for an unannounced hit.
Items
- Cleanse — a held item, consumed automatically by the cursed-round cleanse
button (a free alternative to paying coins). Not manually activatable. - Storyboard rewards can now grant an item on completion, in addition to
coins.
Builder
- Round-type toggles for Cursed and Blessed in the round side panel
(mutually exclusive with Boss). - Non-gameplay modifier picker — a collapsible section (auto-expands when the
round already uses some), split into Visual and Audio subsections, with
a per-modifier checkbox and a slider + exact % entry for intensity. - Random-pool toggle on cursed rounds to opt non-gameplay modifiers into the
roll. - Funscript/video preview now reflects the stroke modifiers of a round's
curses and boons, not just boss modifiers.
Fixes & polish
- Audio effects no longer leak between sessions. Reverb/distortion/muffle and
the rest run on a dedicated audio bus that's cleared on entering and leaving a
run, so exiting a test mid-round can't carry an effect into the next one. - Tighter, more obtrusive Murk and Tunnel at their default strength.
- Smoother, composable video effects: multiple visual modifiers can stack on one
round at once.
Notes
- Backward compatible. Existing journeys load and play unchanged — all new
round fields default to off / empty, and intro cards default to on. - Cursed/Blessed effects are torn down cleanly at round end, on cleanse, and when
warded, so nothing bleeds into the next round.
Release v0.2.1
Fap Hero: Journey — v0.2.1
Everything new since v0.2.0 — a big one for both players and journey authors.
Fork Resolution Types
Forks are no longer just "pick a path." Every fork can now resolve one of four ways:
- Player Choice — the classic manual pick.
- Random — the game rolls a weighted path with a roulette-style reveal.
- Conditional — auto-picks a path from your last-round score, coin balance, or an item you're carrying (tiered thresholds, with an author-set default for "no match").
- Sacrifice — pay to proceed: each path can cost coins and/or a required item, both consumed on pick; unaffordable paths are locked out.
- New Key item — held until spent at a locked fork.
Play Test (Builder)
Authors can now test-play from any node instead of replaying from the start to check the middle of a long journey.
- "Test From Here" saves and drops you into the real runtime at that node.
- Works on nodes inside fork paths (parent forks auto-resolve to reach them).
- Seed a starting score / coin balance to exercise Conditional & Sacrifice forks.
- Esc returns to the builder; test runs never touch real player saves.
Funscript & Video Preview (Builder)
A new in-builder preview for any round:
- Scrollable, zoomable funscript graph with a draggable playhead and time ruler.
- Synced video above the graph (H.264 sources) — play/pause and scrub.
- Boss modifiers shown live on the curve, so you can see exactly what a Scale / Clamp / Mirror does before playing.
Smoother Transitions
Cleaner round-to-round flow: the screen holds black until the next round's video actually has a frame (no background flash), the HUD fades in instead of popping, and shop / fork / storyboard screens dim smoothly into the fade.
Quality of Life
- Open Media Folder button in the builder.
Fixes
- Scale modifier now scales each stroke around its own center rather than a global midpoint, so small and rail-hugging strokes are no longer squashed or clipped. (Affects the Scale boss modifier and the Long Game / Shrink Ray items — expect a slightly different feel.)
- Journey-graph connecting lines no longer vanish on very tall/wide journeys when zoomed in.
Under the Hood
- Builder code cleanup and shared-helper consolidation.
Release v0.2.0
Fap Hero Journey — v0.2
The Journey Builder overhaul. This release is almost entirely about making
journeys faster, friendlier, and safer to build — most of it straight from your
feedback. If you author content, nearly everything you do in the editor just got
quicker. There's also a UI scale option and better video handling for everyone.
Build journeys in bulk
No more adding rounds one at a time.
- Drag in a batch of files. Drop any mix of videos and funscripts onto the
builder and it creates a round for each one, pairing each video with its
matching funscript by file name. - Drag in a whole folder. Drop a folder and it's scanned recursively —
every scene inside is imported. - Multi-axis & vibrator scripts attach themselves. Files like
scene.pitch.funscriptorscene.vibe1.funscriptare recognized and routed to
the right round automatically. - Smart auto-fill. Set just the video on a round and the matching funscript —
plus any axis/vib scripts sitting beside it — get pulled in on their own.
A folder that used to take twenty minutes of clicking now comes in with one drag.
Move & organize freely
Restructuring a journey — especially story-heavy ones — is no longer a chore.
- Copy, Cut, Paste & Duplicate whole modules. Move a fully built storyboard —
speaker images, variant portraits and all — to another branch. Copy an entire
fork (with everything nested inside) and drop it elsewhere. - Select multiple at once — drag a box, Shift+click a range, or Ctrl+click to
hand-pick — then copy / cut / delete / reorder them as a group. - Undo & Redo every structural change, so you can experiment without fear.
- Add anywhere fast —
Ctrl+1–4drop a round / shop / storyboard / fork at
the current spot, and clicking a fork branch lets you add or paste straight
into that path without hunting for the+. - Delete with a keystroke (Backspace / Delete).
Faster, clearer editing
- Live warning badges. Nodes flag a ⚠ the moment something's missing — a
round with no funscript, a fork with too few paths, a moved/renamed file.
Hover for the details. No more finding out only when you hit Save. - Funscript readout. Each round now shows its length and action count once a
script is loaded — handy for pacing. - Number fields with steppers for coins, shop size, and price multiplier —
no more accidental bad input. - Friendly empty state. A brand-new journey now tells you how to start.
Transcoding & video compatibility
Videos that aren't in a format the player can decode are converted on save — now
far more reliable and configurable (Options → Transcoding).
- Auto-Transcode toggle (on by default). When on, videos are converted so
they'll play. Turn it off to use your own H.264 videos as-is — no ffmpeg needed. - Catches sneaky "it's H.264 but won't play" videos — 10-bit and 4:2:2 clips
are detected and re-encoded instead of silently failing. - Custom ffmpeg location with a Test button, for unusual setups.
- No more silent failures. If a video can't be converted, the save stops with
a clear explanation instead of producing a round that won't play.
Navigation & comfort
- Fit-to-view button frames your whole journey in one click — great after a
big import. - Wider zoom range for close-up work and the big picture alike.
- Shortcuts reference — a new ⌨ button lists every shortcut in the builder.
- Version number now shown on the main menu.
UI scale (for everyone)
- New UI Scale setting (Options → Display). Size the whole interface up if
menus look small on a high-resolution or 4K display — applies instantly. - The gameplay video now always fills the screen correctly when the UI scale,
window size, resolution, or fullscreen state changes.
Builder shortcuts at a glance
| Shortcut | Action |
|---|---|
| Ctrl + 1 / 2 / 3 / 4 | Add a round / shop / storyboard / fork |
| Ctrl + C / X / V | Copy / Cut / Paste module(s) |
| Ctrl + Z / Ctrl + Y | Undo / Redo |
| Backspace / Delete | Delete selected module(s) |
| Ctrl + S | Save journey |
| Click | Select a node |
| Click a fork branch | Target it — add/paste to the top of that path |
| Shift + Click | Select a range of nodes |
| Ctrl + Click | Add/remove a node from the selection |
| Ctrl + A | Select all in the current branch |
| Drag on empty canvas | Marquee-select |
| Middle-drag / Wheel | Pan / Zoom |
| Drop files or a folder | Auto-create rounds |
Thanks for building and playing — a huge amount of this release came straight
from your feedback. Keep it coming. 💜
Release v0.1.4
Device Reliability & Save Pipeline Update
This update focuses on playback feedback — knowing what's happening with
your device at a glance — and finishing the save pipeline for journeys
with deeply nested forks and non-H.264 video.
Highlights
- A persistent device-status banner now warns you the moment your device,
Intiface server, or serial port disconnects mid-play. - The banner also catches selected-device mismatches — if your saved
preference isn't connected but a different device is, you'll know. - Beat Bar and Storyboard Filler settings now take effect immediately
instead of requiring a new round. - Saves now correctly transcode non-H.264 videos inside fork paths, not
just top-level rounds.
Device-status banner
A new red banner pinned to the top of the play screen appears whenever your
configured output device can't receive commands. It auto-hides as soon as
things recover, and it lives outside the auto-hiding HUD so it stays visible
even when the rest of the HUD fades.
The banner distinguishes four distinct states with a specific message for
each:
| What happened | Banner text |
|---|---|
| Intiface (server) disconnected | INTIFACE DISCONNECTED — RECONNECT IN OPTIONS |
| Intiface running, but no device available (battery, Bluetooth, USB unplug) | NO DEVICE CONNECTED — POWER ON OR RE-PAIR YOUR DEVICE |
| Your selected device isn't connected, but a different paired device is being used in its place | "THE HANDY" UNAVAILABLE — USING "LOVENSE SOLACE" INSTEAD (CHANGE IN OPTIONS) |
| Serial T-code port closed | SERIAL DEVICE DISCONNECTED — RECONNECT IN OPTIONS |
The mismatch case (third row) is a brand-new safety net for users with
multiple devices — no more "wait, why is my Handy moving when I thought I had
Lovense selected" surprises.
If you never picked a specific device (the default for first-time users),
the mismatch banner stays hidden — the existing fallback-to-first-available
behavior is preserved for that case.
Settings now apply mid-game
Two settings used to require leaving and re-entering the journey before
taking effect. They're now fully live:
- Beat Bar (on/off) — toggling it in Options now creates or destroys the
bar immediately. If a round is loaded, the new bar starts pre-seeded with
the current funscript's beats. - Storyboard Filler (range + speed) — adjusting the range slider or the
half-cycle speed during an active storyboard's filler now retargets the
device immediately as you drag, instead of waiting for the next storyboard
to start.
All other settings (volumes, fullscreen, resolution, position clamp, home
position, latency, vibe intensity, max stroke speed, HUD auto-hide, etc.)
were already live and remain so.
Fork-path videos now transcode correctly
Saves used to only inspect top-level rounds when planning video
transcoding. Any video using a non-H.264 codec (AV1, HEVC, VP9, etc.) inside
a fork path would be silently copied as-is, then fail to play because the
in-game video decoder only handles H.264.
Now the save flow walks the entire journey tree — top-level and every
fork path at every depth — to plan transcoding. Same source video used in
multiple rounds is probed and transcoded once and reused.
Additionally, if ffmpeg isn't available and your journey contains
non-.mp4 videos, the save now refuses with a clear error instead of
silently producing a journey with broken video playback.
Migration notes
- No action required. Existing journeys load and play unchanged.
- If you previously saved a journey containing fork-path AV1/HEVC/VP9 videos
and noticed black-screen playback on some rounds, re-save the journey in
the editor to get the videos properly transcoded. - The new device-status banner only appears when relevant — if everything's
working, you'll never see it.
Release v0.1.3
Journey Builder — Validation & Save Update
This update is focused on making the journey editor reliable for large, complex
journeys. If you've ever hit "Save Cancelled" with no idea why, lost work to a
mid-save failure, or wanted more freedom in how you name things — this is for
you.
Highlights
- Save errors now tell you exactly what went wrong, where, and how to fix it.
- Pre-save validation catches every issue at once instead of one-at-a-time.
- Name restrictions relaxed — any character is fine in round and fork-path names.
- Saves are now fully rolled back on failure or cancel; your existing journey is never corrupted.
- Long / deeply-forked journeys no longer hit Windows path-length limits.
- Crash recovery: leftover saves from a previous session can now be cleaned up in one click.
Better save error reporting
The vague "Save Cancelled. Journey not saved." message is gone. When a save
fails or is cancelled, you now get a detailed modal that tells you:
- Which item failed — e.g. "Fork 1 → Path 'Adventure' → Round 3 'Boss Final'".
- What went wrong — source file moved, destination unwritable, ffmpeg crashed, you clicked cancel, etc.
- What to do about it — a one-line remediation hint for each kind of failure.
- A Copy Details button to dump everything to clipboard so you can paste it into a bug report.
No more guessing.
Pre-save validation catches everything at once
Before any file is touched, the editor now walks your entire journey — top level
plus every fork path, recursively — and lists every problem it finds in one
shot:
- Source files (videos, funscripts, images) that have been moved or deleted since you dragged them in.
- Empty round or fork-path names.
- Forks with fewer than 2 paths.
- Fork paths with no rounds.
- Journey-name collisions (prevents accidentally overwriting another journey when you rename).
- Videos that need transcoding when ffmpeg isn't available.
You see all of it in one modal, fix it all in one editing pass, and save once.
No more fix-one-thing-then-save-again-to-discover-the-next.
Name restrictions relaxed
You used to be blocked from using / \ : * ? " < > | in round names or
fork-path names because they ended up in folder paths. Not anymore. Names are
now purely display strings, so the following are all valid:
"What's Next?""Yes / No""Boss: The Final Showdown""<chapter 4>""Round 1.5"
Only empty names are still flagged, since you still need something to
identify each round and path.
The journey title itself still gets sanitized into a folder name on save
(spaces become underscores, forbidden characters are stripped) — but this
happens automatically and you never see it.
Saves are now properly rolled back on failure
Previously, the save process overwrote your existing journey folder as it went.
If a video copy was cancelled, the disk filled up mid-save, or a source file
got moved — you could end up with a half-corrupt journey that was hard to
recover.
Now saves write to a hidden staging folder first, and only atomically swap
it into place once everything has succeeded. The consequences:
- Cancel a save → your existing journey is untouched. Same for any I/O failure mid-save.
- Even a crash, force-quit, or power loss during the save leaves the original journey on disk and intact.
- The staging folder gets cleaned up automatically on a successful save.
Long and complex journeys now save reliably
Windows has a 260-character path limit that used to silently bite on journeys
with long names, many rounds, or videos with long filenames. The save system
now uses short, fixed-length internal folder and file names:
Handy Fix v0.1.1
Adjusted the output type gate to include HwPositionWithDuration. It seems Handy uses this output type versus absolute position OSR uses.
Device Caching Fix v0.1.2
Fixed potential device cache issue. App will no re-resolve device at play() to keep current device instead of relying on cache.
Demo v0.1.0
Demo releas
What's Changed
New Contributors
Full Changelog: https://github.com/SaekoM/Fap-Hero-Journey/commits/release