Phase 5: active items — room-clear charged, dedicated pedestals, Space to use

- ACTIVES table with 10 actives (Bone Nova, Offal Bomb, Blood Transfusion,
  Cleaver Storm, Butcher's Bell, Marrow Draught, Slaughter Time, Panic Room,
  Skinner's Coin, Gut Reroll); charges accrue +1/combat room, +2/boss
- Dedicated 'active' pickup with weapon-style swap-drop; 30% boss / 15% item-room
  bonus pedestal spawns; flat +2 powerScore while held
- HUD active slot with charge pips + READY state; ACTIVES help page (12 pages);
  teal medallion frame variant in draw_sprites.py; 10 generated icons
- Procedural Sfx.active()/activeEmpty() (real clips deferred to audio batch)
- Fix: toast panel width now fits the wider of title/subtitle and clamps to screen
- Bump asset cache to v=40
This commit is contained in:
MeatSlicer Developer committed 2026-07-30 17:14:25 +10:00
1 parent f71d202850
commit 0ec12cd72c
27 files changed
+337 -37

No files matched your search

+10 -1
View File
@@ -44,6 +44,9 @@ const SPRITE_MANIFEST = [
'i_meathook', 'i_blooddebt',
'i_butchersoath', 'i_secondskin', 'i_twinsidearm', 'i_crimsonmetronome', 'i_abattoirengine',
'i_gorecrown', 'i_thousandteeth', 'i_hollowfather', 'i_thelastcut', 'i_meatgrinder',
// active items
'a_bonenova', 'a_offalbomb', 'a_bloodtransfusion', 'a_cleaverstorm', 'a_butchersbell',
'a_marrowdraught', 'a_slaughtertime', 'a_panicroom', 'a_skinnerscoin', 'a_gutreroll',
// full 64px/128px eight-direction action atlases
'player_sheet', 'player_legs_sheet',
'enemy_shambler_sheet', 'enemy_runner_sheet', 'enemy_spitter_sheet',
@@ -81,7 +84,7 @@ const Sprites = {
const img = new Image();
img.onload = () => { this.imgs[name] = img; if (--pending === 0) G.imagesLoaded = true; };
img.onerror = () => { if (--pending === 0) G.imagesLoaded = true; };
img.src = 'assets/' + name + '.png?v=39';
img.src = 'assets/' + name + '.png?v=40';
}
},
@@ -286,6 +289,12 @@ const Sprites = {
} else if (name.startsWith('w_')) {
ctx.fillStyle = C('#b8a888'); ctx.fillRect(-8, -3, 16, 6);
ctx.fillStyle = C('#6b5333'); ctx.fillRect(-4, 3, 5, 6);
} else if (name.startsWith('a_')) {
ctx.fillStyle = C('#2fa898');
ctx.beginPath(); ctx.arc(0, 0, 9, 0, TAU); ctx.fill();
ctx.fillStyle = C('#0d2a26');
ctx.font = 'bold 10px monospace'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle';
ctx.fillText('!', 0, 0);
} else if (name.startsWith('i_') || name.startsWith('perk_')) {
ctx.fillStyle = C('#c9a227');
ctx.beginPath(); ctx.arc(0, 0, 9, 0, TAU); ctx.fill();