diff --git a/assets/door_locked.png b/assets/door_locked.png index 7258aca..af4ead3 100644 Binary files a/assets/door_locked.png and b/assets/door_locked.png differ diff --git a/assets/door_open.png b/assets/door_open.png index afb615d..7064a9b 100644 Binary files a/assets/door_open.png and b/assets/door_open.png differ diff --git a/assets/enemy_mini.png b/assets/enemy_mini.png index a8b9cbc..182c691 100644 Binary files a/assets/enemy_mini.png and b/assets/enemy_mini.png differ diff --git a/assets/enemy_mini_sheet.png b/assets/enemy_mini_sheet.png index e8eab28..7ff024f 100644 Binary files a/assets/enemy_mini_sheet.png and b/assets/enemy_mini_sheet.png differ diff --git a/docs/README.md b/docs/README.md index 0356864..1a7e5d1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -66,4 +66,4 @@ Runs the smoke test (`test/smoke.js`). ## The fantasy in one paragraph -Rooms lock behind you. The meat waves come in threes. Elites gleam gold and drop the good stuff. The Pressure gauge climbs the longer you stay flawless, and every boss — saw, crown, mother, flenser, choir, father, auger, scald — cycles back around, deeper and meaner, until the meat finally wins. Take the meat. Take the stairs. +Rooms lock behind you. The meat waves come in threes. Elites gleam gold and drop the good stuff. Set the Pressure Dial before you descend — the gauge climbs the longer you stay flawless, and every point of score rides it. Every boss — saw, crown, mother, flenser, choir, father, auger, scald — cycles back around, deeper and meaner, until the meat finally wins. Take the meat. Take the stairs. diff --git a/docs/enemies.md b/docs/enemies.md index 30b6177..e11fbd1 100644 --- a/docs/enemies.md +++ b/docs/enemies.md @@ -65,11 +65,11 @@ Chaser that **splits into 2 Minis on death** (non-elite Splitters only). Slightl | Base HP | 6 | | Base speed | 120 | | Contact damage | 1 | -| Hitbox radius | 10 | +| Hitbox radius | 14 | | XP | 1 | | First appears | Only from Splitter deaths and boss summons | -Tiny, quick chaser with a small hitbox. Never spawns directly from room waves. +Small, vicious gore-red chaser. Never spawns directly from room waves. Splitter splits and boss summons appear instantly; room-wave enemies telegraph first (see below). ### Exploder @@ -135,7 +135,11 @@ base speed × (1 + 0.04 × (floor − 1) + 0.01 × power) × (elite ? 0.9 : 1) **Contact damage:** flat per type (elites +1) — it **never scales with floor**. What kills you late-game is volume, speed, and HP pools, not bigger hit numbers. -**Pressure** (see [gameplay.md](gameplay.md#pressure-dynamic-difficulty)) ranges 0.75–1.60 and multiplies both HP and speed. Playing flawlessly pushes it up; getting hit pulls it down. +**Pressure** (see [gameplay.md](gameplay.md#pressure-dynamic-difficulty)) ranges 0.75–1.60 and multiplies both HP and speed. Playing flawlessly pushes it up; getting hit pulls it down. The title-screen **Pressure Dial** (−5…+5) tunes how fast it rises per clean room and how much relief each hit grants — and every point of score is multiplied by the live pressure value. + +### Wave spawn telegraph + +When a combat-room wave spawns, each enemy first appears as a **pulsing red sigil** for 0.5 s — frozen, harmless, but targetable. After the telegraph it materializes and becomes dangerous. Splitter splits and boss-summoned minions appear instantly (no telegraph). ### Example: Floor 10 Shambler diff --git a/docs/gameplay.md b/docs/gameplay.md index 845766a..ccaf3e8 100644 --- a/docs/gameplay.md +++ b/docs/gameplay.md @@ -72,9 +72,11 @@ Your best score is saved in `localStorage` as `meatslicer_best` and shown on the |---|---| | **- / =** | SFX volume down / up | | **, / .** | Music volume down / up | +| **; / '** | HUD opacity down / up (25%–100%) | | **[ / ]** or **Left / Right arrows** | Previous / next music track | | **Click arrows** | Cycle music tracks | -| **H / [?] button** | Open the Field Manual (7 pages: controls, loop, arsenal, mutations, implants, bestiary, pressure) | +| **Drag sliders** | SFX / Music / HUD opacity bars are click-and-drag | +| **H / [?] button** | Open the Field Manual (8 pages: controls, loop, arsenal, mutations, implants I, implants II, bestiary, pressure) | ### Menus @@ -106,7 +108,7 @@ Right-click is disabled (context menu suppressed). There is **no dash, no intera - Every hit taken deals a **minimum of 1 damage** (`max(1, round(dmg))`). - **Armor** gives a chance to completely ignore a hit: block chance = `armor / (1 + armor)`, capped at 75%. A blocked hit shows "BLOCKED" and grants only 0.2 s of invulnerability. -- **Shield hearts** (cyan pips) absorb damage before real HP. They come from the Bone Plate item and Shield Heart perk, and are refilled to full at the start of each floor. Losing your last shield pip triggers a "SHIELD DOWN" warning. +- **Shield hearts** (cyan) absorb damage before real HP. They come from the Bone Plate item and Shield Heart perk, and are refilled to full at the start of each floor. Losing your last shield triggers a "SHIELD DOWN" warning. On the HUD they render at half-heart granularity — **2 shield HP = one full cyan heart**, matching red hearts (2 HP = 1 heart). - Getting hit knocks you back 14 px, shakes the screen, and flashes a red vignette. ### Healing @@ -207,15 +209,25 @@ Clearing a combat room drops: ## Pressure (Dynamic Difficulty) -The **PRESSURE** meter on the HUD is a run-long adaptive difficulty multiplier applied to enemy and boss **HP and speed at spawn time**: +The **PRESSURE** meter on the HUD is a run-long adaptive difficulty multiplier applied to enemy and boss **HP and speed at spawn time**. It also **multiplies every point of score you earn** — the higher the pressure, the more each kill, room, and floor is worth. - Range: **0.75 – 1.60** (starts at 1.00). -- **+0.01** for every room cleared **without taking damage** (flawless streak). +- Gains for rooms cleared **without taking damage** (flawless streak). - Taking damage **relieves** pressure, scaled by how big the hit was, how low your HP is, and how many recent hits you've taken. -- Decays passively at 0.02/s while below 35% HP, or 0.008/s if you stall in a room for 90+ seconds. +- Decays passively while below 35% HP, or if you stall in a room for 90+ seconds. - Only affects enemies spawned *after* the change — living enemies keep their stats. -In short: playing flawlessly slowly raises the heat; getting hurt cools things down. +### The Pressure Dial + +The title screen has a **PRESSURE DIAL** (−5 … +5) that tunes how pressure responds. It sets two curves — how fast pressure **rises** per clean room, and how much **relief** each hit grants (which also scales the passive decay). The midpoint (0) is the standard tuning; the dial persists between sessions. + +| Dial | Rise / clean room | Relief on hit (base) | Behaviour | +|---|---|---|---| +| **−5** | 0 | 0.050 (max) | Mercy — pressure can only ever fall; score capped at 1.00× | +| **0** | +0.010 | 0.030 | Standard — today's balance | +| **+5** | +0.050 | 0 (none) | Ratchet — pressure can only ever rise; score floored at 1.00× | + +Values between the ends interpolate linearly (rise: 0→1→5 units; relief: 5→3→0 units, 1 unit = 0.01). At −5 pressure never rises so your score multiplier stays ≤ 1.00×; at +5 it never falls, so pressure climbs to the 1.60× cap and your score climbs with it. **Cranking the dial up is how you chase the BEST CUT.** ### Streak @@ -239,10 +251,11 @@ Full formulas are in [enemies.md](enemies.md) and [bosses.md](bosses.md). ## HUD Reference -- **Top-left — BUTCHER // VITALS:** level, hearts (red) and shield hearts (cyan), XP bar, active weapon + ammo (red when below 25%), holstered weapon with `[R]` swap hint. +- **Top-left — BUTCHER // VITALS:** level, hearts (red, 2 HP per heart; half containers render as half outlines) and shield hearts (cyan, 2 shield HP per heart), shown on up to two rows, XP bar, active weapon + ammo (red when below 25%), holstered weapon with `[R]` swap hint. - **Item tray** (below vitals): up to 24 item icons with tier numerals I–IX. - **Top-right — SECTOR MAP:** minimap. White = current room, red = boss, gold = item, gray = cleared, maroon = uncleared. Includes floor number. -- **Bottom-right — RUN DATA:** floor, kills, score, PRESSURE %, STREAK, pressure bar. +- **Bottom-right — RUN DATA:** floor, kills, score (with the live pressure multiplier), PRESSURE % (with the dial setting), STREAK, pressure bar. +- **HUD opacity** is adjustable from the pause menu (`;` / `'` or the HUD slider, 25%–100%). The boss HP bar and toast notifications always stay fully opaque. - **Bottom-center:** boss HP bar (during boss fights). - **Top-center:** toast notifications (pickups, floor intros, boss events). @@ -250,8 +263,8 @@ Full formulas are in [enemies.md](enemies.md) and [bosses.md](bosses.md). | Screen | What it offers | |---|---| -| **Title** | INITIATE DESCENT, control reference, best score | -| **Pause** | Jukebox (track cycling), SFX/music volume, resume/swap/auto/mute hints, Field Manual (`H` / `?` button) | +| **Title** | INITIATE DESCENT, PRESSURE DIAL (−5…+5), control reference, best score | +| **Pause** | Jukebox (track cycling), SFX/music volume + HUD opacity sliders, resume/swap/auto/mute hints, Field Manual (`H` / `?` button) | | **Mutation Draft** | 3 perk cards, random cut, reroll, auto-draft | | **Game Over ("BUTCHERED")** | Floor, kills, score, NEW BEST CUT tag, restart | @@ -265,5 +278,7 @@ Stored in `localStorage` between sessions: - `meatslicer_sfx_volume` (default 0.45) - `meatslicer_music_volume` (default 0.55) - `meatslicer_autoperk` — auto-draft toggle +- `meatslicer_pressure_dial` — Pressure Dial setting (−5…+5, default 0) +- `meatslicer_hud_alpha` — HUD opacity (default 1.0) Nothing else carries over: no unlocks, no meta-currency, no saved runs. Every descent starts fresh with a Bone Popper and 6 HP. diff --git a/docs/items.md b/docs/items.md index 45b1571..6576ac1 100644 --- a/docs/items.md +++ b/docs/items.md @@ -77,7 +77,7 @@ All of these trigger from your weapon hits (orbital knives proc at half chance). | **Iron Stomach** | +½ heart container, heal ½ heart | `maxHp +1`, heal 1 | | **Ghoul Heart** | +2 max HP, heal 2 | `maxHp +2`, heal 2 | | **Twin Hearts** | +1 max heart, heal 1 heart | `maxHp +2`, heal 2 (identical to Ghoul Heart) | -| **Bone Plate** | +½ shield heart each floor | `shieldPerk +1`, `shieldHp +1` — shields refill every floor | +| **Bone Plate** | +½ shield heart each floor | `shieldPerk +1`, `shieldHp +1` — shields refill every floor (1 shield HP = ½ heart, renders as half a cyan pip) | | **Second Stomach** | +½ heart and excess healing shields | `maxHp +1`, heal 1, `overShield +1` — overflow healing becomes shield HP | | **Tanned Hide** | +8% chance to ignore damage | `armor +0.087` — block chance `armor / (1 + armor)`, cap 75% | | **Dead Man's Clock** | +0.25s hurt immunity | `invBonus +0.25` — post-hit invulnerability 0.9 s → 1.15 s at tier I | @@ -103,7 +103,7 @@ All of these trigger from your weapon hits (orbital knives proc at half chance). | **Magnet Maw** | +60% pickup radius | `magnet ×1.6` — magnet radius 46 × magnet px | | **Gorging Leech** | +20% XP gained | `xpMul ×1.20` | | **Reroll Rib** | +1 perk reroll each level | `rerollPerLevel +1` and +1 reroll immediately | -| **Brass Magazine** | 15% less ammo use, +20% ammo found | `ammoEff ×1.15`, `ammoPickupMul ×1.20` | +| **Brass Magazine** | 15% less ammo use, +20% ammo found | `ammoEff ×1.15`, `ammoPickupMul ×1.20` (the ×1.15 stays multiplicative; the **Scrap Feed** perk's additive stacks sit underneath it) | | **Hollow Bones** | +12% move speed | `speedMul ×1.12` (178 → ~199 px/s at tier I) | --- diff --git a/docs/perks.md b/docs/perks.md index 365329a..3250fb1 100644 --- a/docs/perks.md +++ b/docs/perks.md @@ -70,7 +70,7 @@ XP comes from gems dropped by kills, room clears, and bosses, scaled by your `xp | **Carrion Sense** | +8% pickup radius and pull speed | `magnet ×1.08`, `magnetPull ×1.08` *(note: pull speed is not currently wired into pickup movement — the radius half works)* | | **Scavenger** | +4% drop luck | `luck +0.04` | | **Bloodrush** | +5% XP gain, bonus crystal chance | `xpMul ×1.05` | -| **Scrap Feed** | 5% less ammo consumed | `ammoEff ×1.05` | +| **Scrap Feed** | 5% less ammo (diminishing) | `ammoEff +0.05` per stack — saving fraction = rating/(1+rating), so each extra stack helps less (like Thick Hide) | --- diff --git a/index.html b/index.html index a99c566..62caace 100644 --- a/index.html +++ b/index.html @@ -6,31 +6,31 @@