626879ed0c
- Add enemy freshness tracking (novelty bonus for repeated deploys) - Add freshness bar to sidepanel enemy cards with penalty indicator - Major overhaul of renderer-overlays.js (790+ lines for UI polish) - Enhanced combat log, shop overlays, and inventory UI - Improved weapon/upgrade display with partial ownership colors - Added element icons and weakness/resistance indicators to cards - Enhanced radial menu and tooltip system - Add "stale/%" penalty text when freshness depleted - Update play link to ffazeshift.net in index.html
87 lines
2.4 KiB
JavaScript
87 lines
2.4 KiB
JavaScript
// ═══ shop.js ═══
|
|
// ============================================================
|
|
// SHOP.JS — Armory / Command overlay state management
|
|
// ============================================================
|
|
|
|
function openArmory() {
|
|
if (G.gameOver) return;
|
|
G.armoryOpen = true;
|
|
G.commandOpen = false;
|
|
G.threatOpen = false;
|
|
G.prestigeOpen = false;
|
|
_radialSlot = -1;
|
|
_shopScrollY = 0;
|
|
setPaused(true, false);
|
|
}
|
|
|
|
function closeArmory() {
|
|
G.armoryOpen = false;
|
|
_shopScrollY = 0;
|
|
setPaused(false);
|
|
}
|
|
|
|
function openCommand() {
|
|
if (G.gameOver) return;
|
|
G.commandOpen = true;
|
|
G.armoryOpen = false;
|
|
G.threatOpen = false;
|
|
G.prestigeOpen = false;
|
|
_radialSlot = -1;
|
|
_shopScrollY = 0;
|
|
setPaused(true, false);
|
|
}
|
|
|
|
function closeCommand() {
|
|
G.commandOpen = false;
|
|
_shopScrollY = 0;
|
|
setPaused(false);
|
|
}
|
|
|
|
function openWeaponDetail(slotIndex) {
|
|
if (!G.weapons[slotIndex]) return;
|
|
G.weaponDetailSlot = slotIndex;
|
|
_radialSlot = -1;
|
|
G.armoryOpen = false;
|
|
G.commandOpen = false;
|
|
G.threatOpen = false;
|
|
G.prestigeOpen = false;
|
|
_weaponDetailScrollY = 0;
|
|
setPaused(true, false);
|
|
}
|
|
|
|
function closeWeaponDetail() {
|
|
G.weaponDetailSlot = -1;
|
|
_weaponDetailScrollY = 0;
|
|
if (!G.armoryOpen && !G.commandOpen) setPaused(false);
|
|
}
|
|
|
|
function calcSellPrice(weapon) {
|
|
const def = WEAPON_DEFS.find(d => d.id === weapon.defId);
|
|
const baseSell = Math.floor((def?.cost ?? 0) * 0.5);
|
|
const upgTree = WEAPON_UPGRADE_TREES[weapon.defId] || [];
|
|
const upgSell = (G.weaponUpgradesBought[weapon.instanceId] || []).reduce((sum, id) => {
|
|
const u = upgTree.find(u => u.id === id);
|
|
return sum + Math.floor((u?.cost ?? 0) * 0.5);
|
|
}, 0);
|
|
return baseSell + upgSell;
|
|
}
|
|
|
|
function renderShop() { /* no-op — render loop redraws every frame */ }
|
|
|
|
function sellWeapon(slotIndex) {
|
|
const w = G.weapons[slotIndex];
|
|
if (!w) return;
|
|
const activeCount = (G.weapons || []).slice(0, G.tower.weaponSlots).filter(x => x != null).length;
|
|
if (activeCount <= 1) { addLog('Cannot sell last weapon!', 'lose'); return; }
|
|
const price = calcSellPrice(w);
|
|
removeWeaponFromSlot(slotIndex);
|
|
const invIdx = (G.weaponInventory || []).findIndex(x => x.instanceId === w.instanceId);
|
|
if (invIdx >= 0) G.weaponInventory.splice(invIdx, 1);
|
|
G.credits += price;
|
|
_radialSlot = -1;
|
|
_sellHoldSlot = -1;
|
|
closeWeaponDetail();
|
|
addLog('Sold ' + getWeaponDef(w).name + ' for ' + price + '¢.', 'win');
|
|
updateHUD();
|
|
}
|