BYTEPATH++ Design and Base Game
Fable 5
Summary
Foundation session for BYTEPATH++, the settled next release (from Steam Market Research 1–3): full design direction (theme exploration → lore development → lore shelved → lore-free expedition/forge/descent spec), then the first playable slice on Anchor 3 with the BYTEPATH.rogue CRT pipeline, pulse combat, an F1 shader-tuner that established the game's UI language, three engine fixes, and complete source catalogs + archetype analysis of both parent games.
Source hunt (D:/ drive):
- Original BYTEPATH found in three copies; the SHIPPED source is
D:/2020-2021 code/old/BYTEPATH/(objects/Player.lua 2396 lines; the2017-2018 codecopies are earlier snapshots). - The 2020 screenshot project identified as
D:/2020-2021 code/old/BYTEPATH.rogue/(MoonScript, Apr 2020): fake-OS windows, devices (Blaster/Glitcher/0xAED/...), DATA "ex" currency, decryption, cursor-is-the-ship combat. Itstodoshows near-release planning (12 enemies, 9 devices, ~20 modifiers, "300 level variants" unbuilt).
Incremental-not-idler direction: read Deep Instinctive Changes + the May-2026 meaning/commitment messages; core constraint = the game must train commitment, not optionality ("what does 100 repetitions train in the body?"). Key moves: revelation-compulsion over accumulation-compulsion; no wall-clock progression; defined ending; one AFK archetype as earned endgame only.
Theme exploration: LLM-training theme (auto-curriculum premise, data-diet draft, grokking-as-follow-through, reward-hacking as in-game Goodhart) was developed in full then REJECTED by owner as "too many concepts". Simpler-theme pass produced the em/Vow frame (Age of Em) as winner.
Technochrist lore development (later shelved): owner's frame — reality market
(worlds compete purely economically on productivity-per-FLOP), the Pleasure
Iteration's adverse-selection death spiral (Prime Intellect/Slaanesh terminal
state; losing worlds SLOW then archive), the Ascetic Iteration (low-res square
world = why the game looks like BYTEPATH), Church of the Technochrist as
pleasure-world exiles running full-resolution religiosexual enclaves (incarnation
theology, class-by-migration-order). The souls debate ran three rounds: owner
killed "nothing is final" and "the Stillness"; killed the wisdom-generation
mechanism (fork-and-merge volume beats any filter; quarantined forks can be
debriefed); surviving mechanisms = opacity/anti-simulation (capture-and-rehearse;
"for a copyable being, capture is worse than death"), Red Queen monoculture
fragility, binding promises/trust niche; the surviving distinction = REVERSIBILITY
(growth-with-rollback is the reroll; the single thread's growth is final/meant).
Placement locked as the Operative. All preserved at
private/technochrist-game-lore.md when the game went lore-free.
Roguelite Design Analysis 2 application: first pass (lore-bound: Dossier/ Liturgy/Dead Drop/Indulgence&Vow) rejected; lore-free pass produced V1 Canon (one keepsake per run), V2 Rehearsal (scout scheduled world, manifest), V3 Rival (conservation-law adversary), V4 Haul (climbs → forge one haul → descent), V5 Vows, V6 Tab. Owner chose V4 (mouse combat suits map-scavenging + the B-Side song idea). Detailed on commitment/meaning axes: exit discipline as the trained verb ("the skill V4's core loop trains is STOPPING"), expedition budget kills the macro-reroll leak, route scarcity (~40-60% coverage) + readable containers against the vacuum-simulator trap, live-forward descent death.
Final design (BYTEPATH++/design.md, lore-free): two-channel principle (destruction→dust→permanent tree; collection→sealed hauls→potential), budgeted expeditions (N=8-12), cracking (use-now-lose-forever, K=1-3), family-visible haul seals, the shelf, the Forge (choose ONE haul, crypt memorial for the rest, keep/fuel/cut under capacity gate, anchor keystones gated by tree path, tree calcifies), the Descent (long, locked, live-forward death), 600-900-node tree with income capping at ~15-25%. Names: BYTEPATH++ → TCOTT → BYTEPATH++ (owner: "we'll figure out any lore later"; folder E:/a327ex/BYTEPATH++).
First playable slice (Anchor 3, main.lua single-file): design brief with a verified per-event juice inventory (owner: copy the juice EXACTLY, check everything). Ported: displacement + playscii CRT shader pipeline (4 layers, CRT at window resolution via fixed-size 1440x810 layer), cursor-is-the-ship player (lerp 0.9, RMB facing flip, 2HP), pulse attack (full chain: shoot punch/muzzle effect/4 spark particles/8 decel projectiles/bracket pulse effect/100x100 area hit at full multiplier/white→blue flash/camera shake [email protected]), block enemy (hit-punch 1.35, death effect + 0-2 staggered displacement blocks), player contact (blink/50% slow via engine time_scale/black flash), ambient screen-warp, kd_spring + sampled_shake ported verbatim (framework spring/shake are different algorithms). snake_case convention established (owner: "next instances will follow it automatically"). Enemy solid-not-sensor because Box2D v3 generates no sensor-sensor events. Headless --verify mode added.
Debug saga (each now in auto-memory):
- Callable colors:
bad argument #6 to 'rectangle' (number expected, got table)— layer_* takes packed ints fromwhite(); then the replace-all overcorrection broke constructor args (attempt to call a number value (field 'color')). - Queued shader contract: layer_apply_shader/layer_shader_set_* are COMMANDS processed only by that layer's layer_render (no render = silent no-op).
- layer_render CLEARS by default →
layer_render(lyr, false)after draw_from (framework wrapper now forwards the arg); apply ping-pong swap persists across frames → layer_reset_effects each frame. - Effect shaders must declare
in vec2 TexCoord(ENGINE_API'sv_texcoordexample is stale); mismatched varying linked leniently as (0,0) → solid-black output. - layer_shader_set_texture arg 4 required a Texture* userdata; passing layer_get_texture's GL id silently no-oped → displacement map sampled the game texture itself (static echo squares). ENGINE FIX: accepts raw GL ids now.
- Stroke shapes invisible at 1px/integer/rough: SDF ring centered on the boundary
puts both pixel rows at exactly |d|=0.5, step() excludes them. ENGINE FIX:
inset ring
d = max(d, -(d + stroke)), GATED to rough (smooth keeps centered ring). Owner rejected the 4-layer_line workaround: "this is a hack". - layer_new grew optional w/h passthrough (C already supported fixed-size layers).
F1 tuner + UI language: owner directed using the game's real UI language — diegetic windows INSIDE the game canvas (shaken + CRT'd), original Window chrome (black fill, 1px white outline, title at y+0, bar = font height + 2, separator, line-drawn 6x6 X cross, 16x14 close zone, 0.25-white hover fills), vormgevers.ttf, sliders (outlined track + fill + saved-position tick), per-row save/restore buttons, reset-all + export buttons (export → tuner_export.txt as paste-ready Lua table), combat input suppressed while a window is open. 12 knobs over both shaders. Owner tuned and baked: u_disp_strength 0.0326389, u_ghost 0.102431, u_crush 0.215278.
Source catalogs + archetypes (reference/): source-catalogs.md = full
verified inventories of both parents (.rogue: 9 attacks/62 passives/12 enemies/
formation spawner; BYTEPATH shipped: 17 attacks/9 visual-only ships/~832-node
tree with max_tree_nodes=80 cap/44 special attributes/22 wired in-run classes/
~40 item stat-buffs/14 enemies with Director point costs/22s-round point-budget
Director). archetypes.md = cross-game analysis: .rogue's few-shapes×many-
modifiers chassis wins; random power = phase 1, forged power = phase 2;
BYTEPATH's trade nodes = proto-commitment keystones; constructs = the AFK branch;
every-Nth procs as core, chance+Luck deferred; proposed v1 roster (9 .rogue
attacks, 20 modifiers, 5-stat block, cycle clock, 5 constructs, Seeker/Shooter/
Exploder/BigRock enemies) with open questions (luck timing, defensive family,
ammo-fuel economy, expedition item drops).
🔒 Only the summary of this log is public. Private because this is BYTEPATH++.