Skip to content

Commit a646eca

Browse files
authored
Sys optimize; skill mining; level XP and progress (#247)
1 parent dd4c87f commit a646eca

File tree

4 files changed

+126
-75
lines changed

4 files changed

+126
-75
lines changed

src/_includes/footer.njk

Lines changed: 35 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -45,69 +45,53 @@
4545
</div>
4646
</footer>
4747

48-
<div id="dev-tools" class="fixed bottom-6 left-6 z-[5000] hidden bg-slate-900 border-2 border-accent p-6 rounded-2xl shadow-2xl backdrop-blur-xl w-64 font-mono">
49-
<div class="flex justify-between items-center mb-4">
50-
<h3 class="text-accent text-xs font-black uppercase tracking-tighter">System Override</h3>
51-
<span class="text-[9px] bg-accent/20 text-accent px-1.5 py-0.5 rounded">v1.0.4</span>
48+
<div id="dev-tools" class="fixed bottom-6 left-6 z-[5000] hidden bg-slate-950/90 border border-accent/40 p-3 rounded-xl shadow-2xl backdrop-blur-md w-64 font-mono">
49+
<div class="flex justify-between items-center mb-2 pb-2 border-b border-white/10">
50+
<h3 class="text-accent text-[9px] font-black uppercase tracking-widest">System Override</h3>
51+
<span class="text-[8px] text-white/40">v1.0.4</span>
5252
</div>
5353

54-
<div class="space-y-3">
55-
<button onclick="triggerSecretUnlock('matrix')" class="w-full py-2 bg-white/5 hover:bg-green-500/20 text-green-500 text-[10px] border border-green-500/30 rounded-lg transition-all flex justify-between px-3">
56-
<span>RUN_MATRIX.exe</span>
57-
<span class="opacity-50">+1 LVL</span>
54+
<div class="grid grid-cols-2 gap-1.5 mb-2">
55+
<button onclick="triggerSecretUnlock('matrix')" class="py-1.5 bg-green-500/5 hover:bg-green-500/20 text-green-500 text-[8px] border border-green-500/20 rounded transition-all">
56+
MATRIX
5857
</button>
59-
60-
<button onclick="triggerSecretUnlock('konami')" class="w-full py-2 bg-white/5 hover:bg-yellow-500/20 text-yellow-500 text-[10px] border border-yellow-500/30 rounded-lg transition-all flex justify-between px-3">
61-
<span>TRIGGER_KONAMI</span>
62-
<span class="opacity-50">+1 LVL</span>
58+
<button onclick="triggerSecretUnlock('konami')" class="py-1.5 bg-yellow-500/5 hover:bg-yellow-500/20 text-yellow-500 text-[8px] border border-yellow-500/20 rounded transition-all">
59+
KONAMI
6360
</button>
64-
65-
<button onclick="triggerSecretUnlock('gravity')" class="w-full py-2 bg-white/5 hover:bg-red-500/20 text-red-500 text-[10px] border border-red-500/30 rounded-lg transition-all flex justify-between px-3">
66-
<span>INIT_GRAVITY</span>
67-
<span class="opacity-50">+1 LVL</span>
61+
<button onclick="triggerSecretUnlock('gravity')" class="py-1.5 bg-red-500/5 hover:bg-red-500/20 text-red-500 text-[8px] border border-red-500/20 rounded transition-all">
62+
GRAVITY
6863
</button>
69-
70-
<button onclick="triggerSecretUnlock('badge_click')" class="w-full py-2 bg-white/5 hover:bg-purple-500/20 text-purple-400 text-[10px] border border-purple-500/30 rounded-lg transition-all flex justify-between px-3">
71-
<span>UNLOCK_BADGE_XP</span>
72-
<span class="opacity-50">+1 LVL</span>
64+
<button onclick="triggerSecretUnlock('badge_click')" class="py-1.5 bg-purple-500/5 hover:bg-purple-500/20 text-purple-400 text-[8px] border border-purple-500/20 rounded transition-all">
65+
BADGE_XP
7366
</button>
74-
75-
<div class="flex flex-col gap-2 mt-4 pt-4 border-t border-white/10">
76-
<button
77-
onclick="addExperience(5)"
78-
class="w-full flex justify-between items-center p-2 rounded-md border border-cyan-500/30 bg-cyan-500/5 text-[10px] font-mono text-cyan-400 hover:bg-cyan-500/20 hover:border-cyan-400 transition-all cursor-pointer"
79-
>
80-
<span class="flex items-center gap-2">💎 SIMULATE SKILL MINING</span>
81-
<span class="opacity-60">+5 XP</span>
82-
</button>
83-
84-
<button
85-
onclick="toggleScreenshotMode()"
86-
class="w-full flex justify-between items-center p-2 rounded-md border border-white/5 bg-white/5 text-[10px] font-mono text-slate-400 hover:bg-white/10 hover:border-slate-400 transition-all cursor-pointer"
87-
>
88-
<span class="flex items-center gap-2">📸 SCREENSHOT MODE</span>
89-
<span class="opacity-40">[5S]</span>
90-
</button>
91-
</div>
92-
93-
<div class="pt-2">
94-
<button onclick="localStorage.clear(); location.reload();" class="w-full py-3 bg-blue-600/20 hover:bg-blue-600/40 text-blue-400 text-[10px] font-bold border border-blue-500/30 rounded-lg transition-all">
95-
RESET_PLAYER_DATA
96-
</button>
97-
</div>
9867
</div>
9968

100-
<div class="relative group">
101-
<button id="self-destruct-btn" onclick="startSelfDestruct()" class="w-full py-2 bg-red-600/20 hover:bg-red-600/40 text-red-500 text-[10px] border border-red-500/50 rounded-lg transition-all flex justify-between px-3 overflow-hidden">
102-
<span id="destruct-text">SYS_SELF_DESTRUCT</span>
103-
<span id="destruct-timer" class="font-black"></span>
69+
<div class="space-y-1 mb-2">
70+
<button onclick="addExperience(5)" class="w-full flex justify-between px-2 py-1 bg-cyan-500/5 text-cyan-400 text-[8px] border border-cyan-500/20 rounded">
71+
<span>💎 SKILL_MINER</span>
72+
<span class="opacity-50">+5</span>
73+
</button>
74+
<button onclick="addExperience(15); playSound('restore');" class="w-full flex justify-between px-2 py-1 bg-pink-500/5 text-pink-400 text-[8px] border border-pink-500/20 rounded">
75+
<span>🛠️ SYS_OPTIMIZE</span>
76+
<span class="opacity-50">+15</span>
77+
</button>
78+
<button onclick="toggleScreenshotMode()" class="w-full flex justify-between px-2 py-1 bg-white/5 text-slate-400 text-[8px] border border-white/10 rounded">
79+
<span>📸 SCREENSHOT</span>
80+
<span class="opacity-50">5S</span>
10481
</button>
105-
<div id="destruct-bar" class="absolute bottom-0 left-0 h-[2px] bg-red-500 w-0 transition-all"></div>
10682
</div>
10783

108-
<div class="mt-4 pt-4 border-t border-white/10">
109-
<p class="text-[9px] text-slate-500 leading-tight">Secret Console: <span class="text-white">'D'</span></p>
84+
<div class="flex gap-1.5 pt-2 border-t border-white/10">
85+
<button id="self-destruct-btn" onclick="startSelfDestruct()" class="flex-1 py-1.5 bg-red-600/10 hover:bg-red-600/30 text-red-500 text-[8px] border border-red-500/30 rounded flex justify-center gap-1">
86+
<span id="destruct-text">DESTRUCT</span>
87+
<span id="destruct-timer"></span>
88+
</button>
89+
<button onclick="localStorage.clear(); location.reload();" class="px-2 py-1.5 bg-blue-600/10 hover:bg-blue-600/30 text-blue-400 text-[8px] border border-blue-500/20 rounded uppercase">
90+
Reset
91+
</button>
11092
</div>
93+
94+
<p class="mt-2 text-[7px] text-slate-600 text-center uppercase tracking-tighter">Press <span class="text-slate-400">'D'</span> to toggle</p>
11195
</div>
11296

11397
<div id="matrix-overlay" class="fixed inset-0 bg-black hidden z-[9999]">

src/_includes/header.njk

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,24 @@
4343
{% endif %}
4444

4545
<div id="game-stats" class="flex items-center gap-3 md:gap-4 px-3 py-1.5 md:px-4 md:py-2 bg-[var(--bg-card)] border border-[var(--border-color)] rounded-2xl shadow-sm">
46-
<div id="level-badge" onclick="handleLevelClick()" class="w-8 h-8 md:w-10 md:h-10 flex items-center justify-center rounded-xl text-lg md:text-xl bg-black/5 dark:bg-white/5">🐣</div>
46+
<div id="level-badge" onclick="handleLevelClick()" class="w-8 h-8 md:w-10 md:h-10 flex items-center justify-center rounded-xl text-lg md:text-xl bg-black/5 dark:bg-white/5 relative">
47+
🐣
48+
</div>
4749

48-
<div class="hidden sm:flex flex-col">
49-
<div class="flex items-center gap-2">
50-
<span id="level-name" class="text-[9px] md:text-[10px] font-black uppercase tracking-widest text-[var(--text-main)]">Newbie</span>
51-
<span class="text-[8px] md:text-[9px] opacity-60 font-bold bg-black/5 dark:bg-white/10 px-1.5 py-0.5 rounded">LVL <span id="level-number">0</span></span>
52-
</div>
53-
<div class="w-20 md:w-28 h-1 md:h-1.5 bg-black/10 dark:bg-white/10 rounded-full mt-1.5 md:mt-2 overflow-hidden">
54-
<div id="level-progress" class="h-full bg-accent transition-all duration-1000" style="width: 0%"></div>
55-
</div>
56-
</div>
50+
<div class="hidden sm:flex flex-col">
51+
<div class="flex items-center gap-2">
52+
<span id="level-name" class="text-[9px] md:text-[10px] font-black uppercase tracking-widest text-[var(--text-main)]">Newbie</span>
53+
<span class="text-[8px] font-mono font-bold text-accent bg-accent/10 px-1.5 py-0.5 rounded">
54+
XP: <span id="total-xp-display">0</span>
55+
</span>
56+
<span class="text-[8px] md:text-[9px] opacity-60 font-bold bg-black/5 dark:bg-white/10 px-1.5 py-0.5 rounded">
57+
LVL <span id="level-number">0</span>
58+
</span>
59+
</div>
60+
<div class="w-20 md:w-28 h-1 md:h-1.5 bg-black/10 dark:bg-white/10 rounded-full mt-1.5 md:mt-2 overflow-hidden">
61+
<div id="level-progress" class="h-full bg-accent transition-all duration-1000" style="width: 0%"></div>
62+
</div>
63+
</div>
5764

5865
<div class="w-px h-6 md:h-8 bg-[var(--border-color)]"></div>
5966

src/assets/css/style.css

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,3 +391,34 @@ body[data-level="5"] .skill-item {
391391
.skill-item {
392392
cursor: crosshair; /* Makes it feel like you are "mining" */
393393
}
394+
/* Level 6 Visuals */
395+
body[data-level="6"] .user-card {
396+
border-color: rgba(236, 72, 153, 0.3);
397+
}
398+
399+
body[data-level="6"]::after {
400+
content: "";
401+
position: fixed;
402+
top: 0;
403+
left: 0;
404+
width: 100vw;
405+
height: 100vh;
406+
background: linear-gradient(
407+
rgba(18, 16, 16, 0) 50%,
408+
rgba(0, 0, 0, 0.1) 50%
409+
);
410+
background-size: 100% 4px;
411+
z-index: 9999;
412+
pointer-events: none;
413+
opacity: 0.2; /* Very subtle scanlines */
414+
}
415+
#total-xp-display {
416+
display: inline-block;
417+
transition: transform 0.1s ease;
418+
}
419+
420+
/* Added via JS when XP increases */
421+
.xp-pulse {
422+
transform: scale(1.3);
423+
color: white !important;
424+
}

src/assets/js/script.js

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -104,22 +104,26 @@ function updateGameUI() {
104104
const levelIndex = Math.min(eggCount, LEVELS.length - 1);
105105
const rank = LEVELS[levelIndex];
106106

107+
// 1. Level Elements
107108
const badge = document.getElementById('level-badge');
108109
const nameLabel = document.getElementById('level-name');
109110
const numLabel = document.getElementById('level-number');
110111
const progressBar = document.getElementById('level-progress');
111112

113+
// 2. XP Display Element
114+
const xpDisplay = document.getElementById('total-xp-display');
115+
if (xpDisplay) {
116+
// Show current XP toward next level (or cumulative if you prefer)
117+
xpDisplay.innerText = currentXP;
118+
}
119+
112120
if (levelIndex >= 10) {
113121
document.body.classList.add('level-architect');
114-
} else {
115-
document.body.classList.remove('level-architect');
116122
}
117123

118124
if (badge) {
119125
badge.innerText = rank.emoji;
120126
badge.style.backgroundColor = rank.color;
121-
badge.classList.add('animate-bounce');
122-
setTimeout(() => badge.classList.remove('animate-bounce'), 1000);
123127
}
124128

125129
if (nameLabel) {
@@ -130,7 +134,9 @@ function updateGameUI() {
130134
if (numLabel) numLabel.innerText = levelIndex;
131135

132136
if (progressBar) {
133-
const progressPercent = (levelIndex / (LEVELS.length - 1)) * 100;
137+
// Logic for progress bar between levels
138+
// currentXP / XP_PER_LEVEL gives the % toward NEXT level
139+
const progressPercent = (currentXP / XP_PER_LEVEL) * 100;
134140
progressBar.style.width = `${progressPercent}%`;
135141
progressBar.style.backgroundColor = rank.color;
136142
}
@@ -214,6 +220,9 @@ function toggleTheme() {
214220
const current = localStorage.getItem('theme') || 'light';
215221
const next = current === 'light' ? 'dark' : (current === 'dark' ? 'random' : 'light');
216222
applyTheme(next);
223+
224+
// Maintenance XP Trigger
225+
addMaintenanceXP();
217226
}
218227

219228
function updateThemeIcon(theme) {
@@ -535,13 +544,19 @@ document.addEventListener('DOMContentLoaded', () => {
535544
* 9. ENHANCED XP & SKILL MINING SYSTEM
536545
*/
537546
let currentXP = JSON.parse(localStorage.getItem('userXP')) || 0;
538-
const XP_PER_LEVEL = 20; // Adjust this to make leveling harder/easier
547+
const XP_PER_LEVEL = 45; // Adjust this to make leveling harder/easier
539548

540549
function addExperience(amount) {
541550
// Stop XP if at Max Level or if system is locked (Self-Destruct)
542551
const isLocked = document.getElementById('dev-tools')?.hasAttribute('data-lock');
543552
if (unlockedEggs.length >= LEVELS.length - 1 || isLocked) return;
544553

554+
const xpNum = document.getElementById('total-xp-display');
555+
if (xpNum) {
556+
xpNum.classList.add('xp-pulse');
557+
setTimeout(() => xpNum.classList.remove('xp-pulse'), 100);
558+
}
559+
545560
currentXP += amount;
546561

547562
// Check for Level Up
@@ -555,24 +570,24 @@ function addExperience(amount) {
555570
updateGameUI();
556571
}
557572

558-
function createFloatingXP(event) {
573+
function createFloatingXP(event, type = "skill") {
559574
const float = document.createElement('div');
560-
// Color matches Level 5 "Data Miner" Cyan
561-
const levelColor = LEVELS[unlockedEggs.length]?.color || '#06b6d4';
575+
const levelIndex = unlockedEggs.length;
576+
const rankColor = LEVELS[levelIndex]?.color || '#06b6d4';
577+
578+
float.innerText = type === "maintenance" ? "+5 XP (MAINT)" : "+1 XP";
562579

563-
float.innerText = '+1 XP';
564580
float.style.cssText = `
565581
position: fixed;
566582
left: ${event.clientX}px;
567583
top: ${event.clientY}px;
568-
color: ${levelColor};
569-
font-family: monospace;
584+
color: ${rankColor};
585+
font-family: 'JetBrains Mono', monospace;
570586
font-weight: 900;
571-
font-size: 14px;
587+
font-size: ${type === "maintenance" ? '14px' : '12px'};
572588
pointer-events: none;
573589
z-index: 10000;
574590
animation: float-up 0.8s ease-out forwards;
575-
text-shadow: 0 0 10px rgba(0,0,0,0.5);
576591
`;
577592

578593
document.body.appendChild(float);
@@ -602,3 +617,17 @@ function initSkillXP() {
602617

603618
// Re-initialize skills after Surprise scroll or any DOM changes
604619
window.addEventListener('DOMContentLoaded', initSkillXP);
620+
621+
/**
622+
* SYS ADMIN XP (Level 6 Mechanic)
623+
*/
624+
function addMaintenanceXP() {
625+
// Sys Admins get more XP for system-level interactions
626+
const bonus = unlockedEggs.length >= 6 ? 5 : 2;
627+
addExperience(bonus);
628+
629+
// Console log for that "hacker" feel
630+
if (unlockedEggs.length >= 6) {
631+
console.log("%c [SYS_ADMIN] System optimized: +5 XP", "color: #ec4899; font-weight: bold;");
632+
}
633+
}

0 commit comments

Comments
 (0)