Vacuum menu on F replaces the pick-up modes (t16)

Pick-up takes everything unless something is marked; F with the Vacuum
(when nothing in reach can be used) or the card chips open a menu with
pick-up and blow toggles per material. The bag rows lose their buttons.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-24 02:28:56 -04:00
co-authored by Claude Opus 5.5
parent 255824ec6d
commit aa46406c92
16 changed files with 148 additions and 125 deletions
+6 -12
View File
@@ -44,6 +44,7 @@ function doInteract() {
if (msg) break outer;
}
if (msg) { setStatus(msg, 'info'); if (!/^New (drill bit|bag)/.test(msg)) toast(msg); }
else if (toolId() === 'vacuum') openVacuumMenu();
else if ((moldAt(ax, ay) || {}).kind !== 'ingot') setStatus('Nothing to use there.', 'info'); // an ingot mold needs no F: say nothing
}
// Pick (middle mouse): the piece under the cursor becomes the one you build, with its
@@ -118,10 +119,7 @@ function primaryPress(shift) {
return;
}
if (t === 'vacuum') {
const g = GAME.pickMode === 'first' ? grainAt(ax, ay) : 0;
GAME.vacFilter = shift || GAME.pickMode === 'all' ? -1 : g;
GAME.vacLocked = shift || GAME.pickMode !== 'first' || !!g;
if (!shift && GAME.pickMode === 'marked' && !GAME.collect.size) setStatus('Nothing marked to pick up. R over something, or ⬇ in the bag.', 'info');
GAME.vacFilter = shift || !GAME.collect.size ? -1 : 0;
hudDirty = true;
} else if (t === 'build') {
const P = piece();
@@ -188,7 +186,7 @@ function primaryRelease(shift) {
if (r.n || ghosts) { playSfx('place'); setStatus(gtxt || (r.status ? r.status + hint : ''), 'info'); } else { setStatus((r.status || 'Nothing placed.') + hint); playSfx('error'); }
GAME.drag = null; GAME.dragDir = -1; hudDirty = true;
}
if (t === 'vacuum') { GAME.vacFilter = 0; GAME.vacLocked = false; hudDirty = true; }
if (t === 'vacuum') { GAME.vacFilter = 0; hudDirty = true; }
}
function secondaryPress() {
const t = toolId();
@@ -207,13 +205,9 @@ function toolTick() {
const r = toolPulse(ax, ay, GAME.drillW, GAME.drillTune);
if (r.fired) { playSfx('pulse', GAME.drillW); if (r.status) setStatus(r.status); }
} else if (t === 'vacuum') {
if (!GAME.vacLocked && GAME.pickMode === 'first') { const g = grainAt(ax, ay); if (g) { GAME.vacFilter = g; GAME.vacLocked = true; hudDirty = true; } }
const f = GAME.vacFilter, marked = GAME.pickMode === 'marked', list = GAME.collect;
if (f || marked && list.size) {
const r = toolVacuum(ax, ay, GAME.brush[1], f < 0 ? () => true : marked ? m => list.has(m) : m => m === f);
if (r.got) { playSfx('suck'); hudDirty = true; }
if (r.status) setStatus(r.status);
}
const r = toolVacuum(ax, ay, GAME.brush[1], GAME.vacFilter < 0 || !GAME.collect.size ? () => true : m => GAME.collect.has(m));
if (r.got) { playSfx('suck'); hudDirty = true; }
if (r.status) setStatus(r.status);
} else if (t === 'ignite') {
if (inReach(ax, ay)) { const r = toolIgnite(ax, ay); playSfx('spark'); if (Math.random() < 0.6) spawnSpark(ax + 0.5, ay + 0.5); if (!r.fuel) setStatus('Aim at coal or wood touching air to light it.'); }
else setStatus('Out of reach.');