Add freshness bar, enhance overlays and renderers

- 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
This commit is contained in:
2026-06-17 11:58:17 -04:00
parent 6a710c3f03
commit 626879ed0c
21 changed files with 1884 additions and 312 deletions
+94 -38
View File
@@ -14,13 +14,23 @@ const ELEMENTS = {
physical: { name: 'Physical', color: '#c8c8c8', glow: '#ffffff', icon: '💢' },
};
// ── DIFFICULTY TIERS ──────────────────────────────────────────
const DIFFICULTY_TIERS = [
{ id: 0, name: 'NORMAL', unlockCost: 0, hpMult: 1.00, speedMult: 1.00, armorMult: 1.00, rewardMult: 1.00 },
{ id: 1, name: 'SKIRMISH', unlockCost: 500, hpMult: 1.25, speedMult: 1.15, armorMult: 1.20, rewardMult: 1.40 },
{ id: 2, name: 'ASSAULT', unlockCost: 2000, hpMult: 1.60, speedMult: 1.30, armorMult: 1.50, rewardMult: 1.90 },
{ id: 3, name: 'SIEGE', unlockCost: 6000, hpMult: 2.10, speedMult: 1.50, armorMult: 2.00, rewardMult: 2.50 },
{ id: 4, name: 'ONSLAUGHT', unlockCost: 15000, hpMult: 2.85, speedMult: 1.75, armorMult: 2.80, rewardMult: 3.50 },
{ id: 5, name: 'CATACLYSM', unlockCost: 40000, hpMult: 3.80, speedMult: 2.00, armorMult: 4.00, rewardMult: 4.70 },
];
// ── ENEMY TYPES ───────────────────────────────────────────────
const ENEMY_DEFS = [
{
id: 'grunt',
name: 'GRUNT',
desc: 'Basic foot soldier. No special traits.',
hp: 8, speed: 0.9, radius: 7, armor: 0,
hp: 8, speed: 0.72, radius: 7, armor: 0,
color: '#aaaaaa', glowColor: '#ffffff',
cost: 20, reward: 30,
resistances: {},
@@ -32,7 +42,7 @@ const ENEMY_DEFS = [
id: 'runner',
name: 'RUNNER',
desc: 'Very fast, low HP. Hard to track.',
hp: 5, speed: 2.35, radius: 5, armor: 0,
hp: 5, speed: 1.88, radius: 5, armor: 0,
color: '#00ff88', glowColor: '#00ff88',
cost: 30, reward: 44,
resistances: {},
@@ -44,7 +54,7 @@ const ENEMY_DEFS = [
id: 'brute',
name: 'BRUTE',
desc: 'High HP and armor. Slow mover.',
hp: 35, speed: 0.52, radius: 13, armor: 3,
hp: 35, speed: 0.42, radius: 13, armor: 3,
color: '#ff7043', glowColor: '#ff3300',
cost: 80, reward: 112,
resistances: { physical: 0.5 },
@@ -56,7 +66,7 @@ const ENEMY_DEFS = [
id: 'swarm',
name: 'SWARM',
desc: 'Spawns 6 tiny units at once.',
hp: 3, speed: 1.85, radius: 4, armor: 0,
hp: 3, speed: 1.48, radius: 4, armor: 0,
color: '#ce93d8', glowColor: '#cc00ff',
cost: 60, reward: 84,
resistances: {},
@@ -68,7 +78,7 @@ const ENEMY_DEFS = [
id: 'phantom',
name: 'PHANTOM',
desc: '40% dodge. Void-touched.',
hp: 6, speed: 1.7, radius: 7, armor: 0,
hp: 6, speed: 1.36, radius: 7, armor: 0,
color: '#c77dff', glowColor: '#9900ff',
cost: 100, reward: 138,
evasion: 0.3,
@@ -81,7 +91,7 @@ const ENEMY_DEFS = [
id: 'iceling',
name: 'ICELING',
desc: 'Ice elemental. Slows bullets on contact.',
hp: 12, speed: 0.88, radius: 9, armor: 1,
hp: 12, speed: 0.70, radius: 9, armor: 1,
color: '#7ecfff', glowColor: '#00cfff',
cost: 90, reward: 125,
resistances: { ice: 0.0 },
@@ -93,7 +103,7 @@ const ENEMY_DEFS = [
id: 'sparkling',
name: 'SPARKLING',
desc: 'Lightning elemental. Fast and electric.',
hp: 7, speed: 2.1, radius: 6, armor: 0,
hp: 7, speed: 1.68, radius: 6, armor: 0,
color: '#ffe033', glowColor: '#ffcc00',
cost: 110, reward: 148,
resistances: { lightning: 0.0 },
@@ -105,7 +115,7 @@ const ENEMY_DEFS = [
id: 'venom',
name: 'VENOM',
desc: 'Poison elemental. Immune to DoT.',
hp: 14, speed: 0.96, radius: 10, armor: 0,
hp: 14, speed: 0.77, radius: 10, armor: 0,
color: '#7fff4f', glowColor: '#44ff00',
cost: 120, reward: 160,
resistances: { poison: 0.0, fire: 0.6 },
@@ -117,7 +127,7 @@ const ENEMY_DEFS = [
id: 'titan',
name: 'TITAN',
desc: 'Massive HP, heavy armor, very slow.',
hp: 120, speed: 0.31, radius: 20, armor: 8,
hp: 120, speed: 0.25, radius: 20, armor: 8,
color: '#ff1744', glowColor: '#ff0000',
cost: 350, reward: 465,
resistances: { physical: 0.4, fire: 0.7 },
@@ -129,7 +139,7 @@ const ENEMY_DEFS = [
id: 'wraith',
name: 'WRAITH',
desc: 'Void entity. Ignores 80% of armor.',
hp: 18, speed: 1.38, radius: 9, armor: 0,
hp: 18, speed: 1.10, radius: 9, armor: 0,
color: '#9900ff', glowColor: '#6600cc',
cost: 200, reward: 265,
armorPen: 0.8,
@@ -138,6 +148,53 @@ const ENEMY_DEFS = [
element: 'void',
count: 1,
},
{
id: 'commander', name: 'COMMANDER',
desc: 'Aura: nearby enemies AND self gain +30% damage resistance. Weak to arcane.',
hp: 160, speed: 0.60, radius: 11, armor: 2,
color: '#ffc107', glowColor: '#ff8f00',
cost: 220, reward: 280,
resistances: {}, weaknesses: { arcane: 2.0 },
element: null, count: 1, minTier: 3,
},
{
id: 'juggernaut', name: 'JUGGERNAUT',
desc: 'Max 12 damage per hit. Immune to freeze. Lightning partially bypasses cap.',
hp: 280, speed: 0.32, radius: 16, armor: 4,
color: '#bf360c', glowColor: '#ff3d00',
cost: 400, reward: 600,
resistances: {}, weaknesses: { lightning: 1.6 },
element: null, count: 1, minTier: 4,
damageCapPerHit: 12, immuneToFreeze: true,
},
{
id: 'siegebreaker', name: 'SIEGE BREAKER',
desc: 'Regenerates 5 HP/sec. Immune to poison/freeze. Void pauses regen 3s.',
hp: 400, speed: 0.22, radius: 22, armor: 6,
color: '#880e4f', glowColor: '#ff0077',
cost: 500, reward: 900,
resistances: { poison: 0.0 }, weaknesses: {},
element: null, count: 1, minTier: 5,
hpRegenPerSec: 5, immuneToFreeze: true,
},
{
id: 'echo', name: 'ECHO',
desc: 'Splits into 2 copies on single-hit damage >30. Each copy earns a reward.',
hp: 100, speed: 0.96, radius: 8, armor: 0,
color: '#29b6f6', glowColor: '#0288d1',
cost: 180, reward: 250, echoReward: 120,
resistances: {}, weaknesses: { fire: 1.4 },
element: null, count: 1, minPrestige: 1,
},
{
id: 'voidherald', name: 'VOID HERALD',
desc: 'Shield absorbs 60% dmg when 3+ weapons hit per frame. Deploy in crowds.',
hp: 200, speed: 0.68, radius: 12, armor: 0,
color: '#7c4dff', glowColor: '#651fff',
cost: 300, reward: 480,
resistances: {}, weaknesses: { void: 1.5 },
element: 'void', count: 1, minPrestige: 2,
},
];
// ── WEAPON DEFINITIONS ────────────────────────────────────────
@@ -147,14 +204,14 @@ const WEAPON_DEFS = [
name: 'CANNON',
desc: 'Standard projectile. Reliable, upgradeable.',
icon: '💣',
cost: 0, // starting weapon
cost: 100,
defaultElement: 'physical',
targeting: 'nearest',
fireRate: 72, // frames between shots
damage: 4,
projectileSpeed: 4.2,
projectileRadius: 4,
range: 9999,
range: 310,
color: '#c8c8c8',
type: 'projectile',
},
@@ -185,6 +242,7 @@ const WEAPON_DEFS = [
damage: 4,
chains: 3,
chainRange: 120,
range: 340,
color: '#ffe033',
type: 'chain',
},
@@ -200,6 +258,7 @@ const WEAPON_DEFS = [
damage: 12,
aoeRadius: 60,
projectileSpeed: 2.8,
range: 480,
color: '#ff7043',
type: 'mortar',
},
@@ -213,7 +272,7 @@ const WEAPON_DEFS = [
targeting: 'furthest',
fireRate: 10,
damage: 1,
range: 9999,
range: 390,
color: '#ff77e9',
type: 'beam',
},
@@ -230,6 +289,7 @@ const WEAPON_DEFS = [
aoeRadius: 75,
freezeDuration: 180,
projectileSpeed: 2.4,
range: 400,
color: '#7ecfff',
type: 'mortar',
},
@@ -246,6 +306,7 @@ const WEAPON_DEFS = [
armorShred: 5,
projectileSpeed: 1.8,
projectileRadius: 12,
range: 360,
color: '#c77dff',
type: 'projectile',
},
@@ -262,6 +323,7 @@ const WEAPON_DEFS = [
targets: 3,
aoeRadius: 36,
projectileSpeed: 3.6,
range: 450,
color: '#ff4500',
type: 'multi',
},
@@ -277,6 +339,7 @@ const WEAPON_DEFS = [
damage: 2,
amplify: 0.25,
projectileSpeed: 5.8,
range: 280,
color: '#ff77e9',
type: 'projectile',
},
@@ -295,6 +358,7 @@ const WEAPON_DEFS = [
dotDuration: 180,
aoeRadius: 55,
projectileSpeed: 2.2,
range: 350,
color: '#7fff4f',
type: 'mortar',
},
@@ -387,35 +451,19 @@ const TOWER_UPGRADE_TREE = [
},
{
id: 'slot5', label: 'Weapon Slot V', desc: 'Unlock 5th weapon slot',
cost: 7000, requires: ['slot4'], effect: { weaponSlot: 5 },
cost: 7000, requires: ['slot4'], effect: { weaponSlot: 5 }, minTier: 1,
},
{
id: 'slot6', label: 'Weapon Slot VI', desc: 'Unlock 6th weapon slot',
cost: 12000, requires: ['slot5'], effect: { weaponSlot: 6 },
cost: 12000, requires: ['slot5'], effect: { weaponSlot: 6 }, minTier: 2,
},
{
id: 'slot7', label: 'Weapon Slot VII', desc: 'Unlock 7th weapon slot',
cost: 20000, requires: ['slot6'], effect: { weaponSlot: 7 },
cost: 20000, requires: ['slot6'], effect: { weaponSlot: 7 }, minTier: 3,
},
{
id: 'slot8', label: 'Weapon Slot VIII', desc: 'Unlock 8th weapon slot',
cost: 30000, requires: ['slot7'], effect: { weaponSlot: 8 },
},
{
id: 'range1', label: 'Scanner I', desc: '+40 range',
cost: 180, requires: [], effect: { range: 40 },
},
{
id: 'range2', label: 'Scanner II', desc: '+60 range',
cost: 450, requires: ['range1'], effect: { range: 60 },
},
{
id: 'range3', label: 'Scanner III', desc: '+80 range',
cost: 1000, requires: ['range2'], effect: { range: 80 },
},
{
id: 'range4', label: 'Scanner IV', desc: '+100 range — max coverage',
cost: 2400, requires: ['range3'], effect: { range: 100 },
cost: 30000, requires: ['slot7'], effect: { weaponSlot: 8 }, minTier: 4,
},
{
id: 'shield_dome', label: 'Dome Shield', desc: 'Buy dome shield system',
@@ -456,6 +504,10 @@ const WEAPON_UPGRADE_TREES = {
{ id: 'el1', label: 'Infuse: Slot 1', desc: 'Unlock 1st element slot', cost: 300, requires: [], effect: { canInfuse: true }, category: 'Elements' },
{ id: 'el2', label: 'Infuse: Slot 2', desc: 'Unlock 2nd element slot', cost: 800, requires: ['el1'], effect: { canInfuse2: true }, category: 'Elements' },
{ id: 'el3', label: 'Infuse: Slot 3', desc: 'Unlock 3rd element slot', cost: 2000, requires: ['el2'], effect: { canInfuse3: true }, category: 'Elements' },
// Range
{ id: 'range1', label: 'Barrel Ext I', desc: '+50 range', cost: 200, requires: [], effect: { range: 50 }, category: 'Range' },
{ id: 'range2', label: 'Barrel Ext II', desc: '+80 range', cost: 550, requires: ['range1'], effect: { range: 80 }, category: 'Range' },
{ id: 'range3', label: 'Barrel Ext III', desc: '+110 range', cost: 1400, requires: ['range2'], effect: { range: 110 }, category: 'Range' },
],
flamethrower: [
{ id: 'dmg1', label: 'Heat I', desc: '+1 dmg/tick', cost: 120, requires: [], effect: { damage: 1 }, category: 'Damage' },
@@ -510,6 +562,10 @@ const WEAPON_UPGRADE_TREES = {
{ id: 'width2', label: 'Wide Beam II', desc: '+8 hit radius', cost: 700, requires: ['width1'], effect: { projectileRadius: 8 }, category: 'Width' },
{ id: 'el1', label: 'Infuse: Slot 1', desc: 'Unlock 1st element slot', cost: 300, requires: [], effect: { canInfuse: true }, category: 'Elements' },
{ id: 'el2', label: 'Infuse: Slot 2', desc: 'Unlock 2nd element slot', cost: 800, requires: ['el1'], effect: { canInfuse2: true }, category: 'Elements' },
// Range
{ id: 'range1', label: 'Focal Lens I', desc: '+60 range', cost: 250, requires: [], effect: { range: 60 }, category: 'Range' },
{ id: 'range2', label: 'Focal Lens II', desc: '+100 range', cost: 750, requires: ['range1'], effect: { range: 100 }, category: 'Range' },
{ id: 'range3', label: 'Focal Lens III', desc: '+140 range', cost: 1800, requires: ['range2'], effect: { range: 140 }, category: 'Range' },
],
freezebomb: [
{ id: 'dmg1', label: 'Cold I', desc: '+3 damage', cost: 200, requires: [], effect: { damage: 3 }, category: 'Damage' },
@@ -542,8 +598,8 @@ const WEAPON_UPGRADE_TREES = {
{ id: 'dmg2', label: 'Warhead II', desc: '+6 damage', cost: 600, requires: ['dmg1'], effect: { damage: 6 }, category: 'Damage' },
{ id: 'dmg3', label: 'Warhead III',desc: '+10 damage',cost: 1400, requires: ['dmg2'],effect: { damage: 10}, category: 'Damage' },
{ id: 'targets1', label: '+1 Target', desc: 'Fire at 1 more', cost: 500, requires: [], effect: { targets: 1 }, category: 'Targets' },
{ id: 'targets2', label: '+2 Targets',desc: 'Fire at 2 more', cost: 1200, requires: ['targets1'], effect: { targets: 2 }, category: 'Targets' },
{ id: 'targets3', label: '+3 Targets',desc: 'Fire at 3 more', cost: 2800, requires: ['targets2'], effect: { targets: 3 }, category: 'Targets' },
{ id: 'targets2', label: '+2 Targets',desc: 'Fire at 2 more', cost: 1200, requires: ['targets1'], effect: { targets: 2 }, category: 'Targets', minTier: 2 },
{ id: 'targets3', label: '+3 Targets',desc: 'Fire at 3 more', cost: 2800, requires: ['targets2'], effect: { targets: 3 }, category: 'Targets', minTier: 2 },
{ id: 'rate1', label: 'Reload I', desc: '-30 frames', cost: 300, requires: [], effect: { fireRate: -30 }, category: 'Fire Rate' },
{ id: 'rate2', label: 'Reload II', desc: '-40 frames', cost: 700, requires: ['rate1'], effect: { fireRate: -40 }, category: 'Fire Rate' },
{ id: 'speed1', label: 'Velocity I', desc: '+2 proj spd', cost: 300, requires: [], effect: { projectileSpeed: 2 }, category: 'Velocity' },
@@ -553,12 +609,12 @@ const WEAPON_UPGRADE_TREES = {
arcaneturret: [
{ id: 'dmg1', label: 'Potency I', desc: '+1 damage', cost: 120, requires: [], effect: { damage: 1 }, category: 'Damage' },
{ id: 'dmg2', label: 'Potency II', desc: '+2 damage', cost: 300, requires: ['dmg1'], effect: { damage: 2 }, category: 'Damage' },
{ id: 'dmg3', label: 'Potency III',desc: '+3 damage', cost: 700, requires: ['dmg2'], effect: { damage: 3 }, category: 'Damage' },
{ id: 'dmg3', label: 'Potency III',desc: '+3 damage', cost: 700, requires: ['dmg2'], effect: { damage: 3 }, category: 'Damage', minTier: 2 },
{ id: 'rate1', label: 'Frequency I', desc: '-5 frames', cost: 150, requires: [], effect: { fireRate: -5 }, category: 'Fire Rate' },
{ id: 'rate2', label: 'Frequency II', desc: '-5 frames', cost: 380, requires: ['rate1'], effect: { fireRate: -5 }, category: 'Fire Rate' },
{ id: 'rate3', label: 'Frequency III',desc: '-4 frames', cost: 850, requires: ['rate2'], effect: { fireRate: -4 }, category: 'Fire Rate' },
{ id: 'rate3', label: 'Frequency III',desc: '-4 frames', cost: 850, requires: ['rate2'], effect: { fireRate: -4 }, category: 'Fire Rate', minTier: 2 },
{ id: 'amp1', label: 'Amplify I', desc: '+10% amp', cost: 300, requires: ['dmg1'], effect: { amplify: 0.10 }, category: 'Special' },
{ id: 'amp2', label: 'Amplify II', desc: '+15% amp', cost: 700, requires: ['amp1'], effect: { amplify: 0.15 }, category: 'Special' },
{ id: 'amp2', label: 'Amplify II', desc: '+15% amp', cost: 700, requires: ['amp1'], effect: { amplify: 0.15 }, category: 'Special', minTier: 2 },
{ id: 'speed1',label: 'Velocity I', desc: '+3 proj spd',cost: 200, requires: [], effect: { projectileSpeed: 3 }, category: 'Velocity' },
{ id: 'el1', label: 'Infuse: Slot 1', desc: 'Unlock 1st element slot', cost: 300, requires: [], effect: { canInfuse: true }, category: 'Elements' },
{ id: 'el2', label: 'Infuse: Slot 2', desc: 'Unlock 2nd element slot', cost: 800, requires: ['el1'], effect: { canInfuse2: true }, category: 'Elements' },