reaper-arcade-hub 1.0.7 โ 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.html +29 -11
- package/js/app.js +53 -1
- package/js/firebase-client.js +46 -0
- package/js/security-shield.js +126 -0
- package/main/index.html +29 -11
- package/main/js/app.js +53 -1
- package/main/js/firebase-client.js +46 -0
- package/main/js/security-shield.js +126 -0
- package/package.json +4 -3
- package/verify/js/firebase-client.js +46 -0
- package/verify/js/security-shield.js +126 -0
package/index.html
CHANGED
|
@@ -85,20 +85,20 @@
|
|
|
85
85
|
|
|
86
86
|
<div style="font-size: 0.88rem; line-height: 1.7; color: #d0e4ff; display: flex; flex-direction: column; gap: 1rem;">
|
|
87
87
|
<div>
|
|
88
|
-
<strong style="color: #
|
|
89
|
-
<p style="color: #88aacc; font-size: 0.82rem;">
|
|
88
|
+
<strong style="color: #00d2ff; font-size: 1.15rem;">๐ฅ Reaper Hub v1.0.9 is Live!</strong>
|
|
89
|
+
<p style="color: #88aacc; font-size: 0.82rem;">Latest Global Cyber Deployment</p>
|
|
90
90
|
</div>
|
|
91
91
|
|
|
92
|
-
<p>
|
|
93
|
-
Here
|
|
92
|
+
<p style="color: #ffffff; font-weight: 600;">
|
|
93
|
+
Welcome to Reaper Hub! Here are the latest additions and improvements:
|
|
94
94
|
</p>
|
|
95
95
|
|
|
96
|
-
<ul style="padding-left: 1.25rem; display: flex; flex-direction: column; gap: 0.
|
|
97
|
-
<li><strong
|
|
98
|
-
<li><strong
|
|
99
|
-
<li><strong
|
|
100
|
-
<li><strong
|
|
101
|
-
<li><strong
|
|
96
|
+
<ul style="padding-left: 1.25rem; display: flex; flex-direction: column; gap: 0.55rem; color: #e5f0ff;">
|
|
97
|
+
<li><strong>๐ฅ TOP PLAYS Counter & Sort:</strong> Real-time tracking of total plays for every game! Every card displays live play counts (e.g. <code>๐ฅ 1.4k Plays</code>). Click the new <strong>TOP PLAYS</strong> filter pill to see the most popular games ranked!</li>
|
|
98
|
+
<li><strong>๐ก๏ธ Surveillance Spy Honeypot:</strong> If GoGuardian, Securly, or a teacher screen grabber scans your tab, Reaper automatically halts games and cloaks your screen with clean educational study notes.</li>
|
|
99
|
+
<li><strong>๐ฌ Realtime Private DMs & Global Chat:</strong> Start encrypted 1-on-1 direct messages with any player on the network. Press <code>Enter</code> to instantly send messages.</li>
|
|
100
|
+
<li><strong>๐ฎ Perfect Game Centering & Auto-Clean:</strong> Stripped all ad overlays so games are perfectly centered in full 60 FPS with instant WASD/click focus.</li>
|
|
101
|
+
<li><strong>๐ 100 Feel-Good Splash Quotes:</strong> Over 100 motivating, funny, and uplifting quotes rotating smoothly on the cyber startup loader.</li>
|
|
102
102
|
</ul>
|
|
103
103
|
</div>
|
|
104
104
|
</div>
|
|
@@ -215,6 +215,7 @@
|
|
|
215
215
|
|
|
216
216
|
<div class="filter-pills">
|
|
217
217
|
<button class="filter-btn active" data-cat="all">ALL</button>
|
|
218
|
+
<button class="filter-btn" data-cat="top" style="color: #00ffaa; border-color: rgba(0, 255, 170, 0.4); background: rgba(0, 255, 170, 0.1);">๐ฅ TOP PLAYS</button>
|
|
218
219
|
<button class="filter-btn" data-cat="featured">FEATURED</button>
|
|
219
220
|
<button class="filter-btn" data-cat="favorites">FAVORITES</button>
|
|
220
221
|
<button class="filter-btn" data-cat="fnf">FNF (50+)</button>
|
|
@@ -680,7 +681,7 @@
|
|
|
680
681
|
</button>
|
|
681
682
|
</div>
|
|
682
683
|
|
|
683
|
-
<div style="display: flex; justify-content: space-between; align-items: center; background: #040e1e; border: 1px solid var(--blue-border); padding: 0.85rem 1.15rem; border-radius: 8px; margin-bottom:
|
|
684
|
+
<div style="display: flex; justify-content: space-between; align-items: center; background: #040e1e; border: 1px solid var(--blue-border); padding: 0.85rem 1.15rem; border-radius: 8px; margin-bottom: 1rem; flex-wrap: wrap; gap: 1rem;">
|
|
684
685
|
<div style="display: flex; gap: 1.5rem; align-items: center;">
|
|
685
686
|
<div>
|
|
686
687
|
<span style="font-size: 0.7rem; color: #88aacc; text-transform: uppercase; display: block;">SHIELD STATUS</span>
|
|
@@ -703,6 +704,23 @@
|
|
|
703
704
|
</div>
|
|
704
705
|
</div>
|
|
705
706
|
|
|
707
|
+
<!-- Surveillance Honeypot Trap -->
|
|
708
|
+
<div style="background: #040e1e; border: 1.5px solid rgba(255, 170, 0, 0.4); padding: 0.85rem 1.15rem; border-radius: 8px; margin-bottom: 1.25rem; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 0.75rem;">
|
|
709
|
+
<div>
|
|
710
|
+
<strong style="color: #ffd700; font-size: 0.92rem;">๐จ Surveillance Trap & Clean Notes Honeypot</strong>
|
|
711
|
+
<p style="color: #88aacc; font-size: 0.78rem; margin-top: 0.2rem;">If GoGuardian, Securly, or a teacher screen grabber probes this tab, immediately halts games and swaps to educational biology notes.</p>
|
|
712
|
+
</div>
|
|
713
|
+
<div style="display: flex; gap: 0.75rem; align-items: center;">
|
|
714
|
+
<label style="display: flex; align-items: center; gap: 0.4rem; cursor: pointer; color: #fff; font-size: 0.78rem; font-weight: 700;">
|
|
715
|
+
<input type="checkbox" id="auto-decoy-toggle" style="width: 18px; height: 18px; accent-color: #ffd700;" onchange="if(window.reaperShield) window.reaperShield.setAutoDecoy(this.checked)" checked>
|
|
716
|
+
AUTO-SWAP ON PROBE
|
|
717
|
+
</label>
|
|
718
|
+
<button class="btn-stealth" onclick="if(window.reaperShield) window.reaperShield.triggerSurveillanceHoneypot('GoGuardian Live Screen Sniper');" style="padding: 0.35rem 0.75rem; font-size: 0.72rem; color: #ffd700; border-color: #ffaa00;">
|
|
719
|
+
๐งช TEST HONEYPOT
|
|
720
|
+
</button>
|
|
721
|
+
</div>
|
|
722
|
+
</div>
|
|
723
|
+
|
|
706
724
|
<div style="font-size: 0.78rem; color: #88aacc; font-weight: 800; margin-bottom: 0.6rem; letter-spacing: 0.05em; text-transform: uppercase;">
|
|
707
725
|
DETECTED EXTENSIONS & SPY PROBES:
|
|
708
726
|
</div>
|
package/js/app.js
CHANGED
|
@@ -175,6 +175,10 @@ class ReaperHubApp {
|
|
|
175
175
|
this.dmThreads = threads || [];
|
|
176
176
|
this.renderDMThreadsList();
|
|
177
177
|
});
|
|
178
|
+
window.reaperFirebase.listenTopGamePlays((plays) => {
|
|
179
|
+
this.gamePlays = plays || {};
|
|
180
|
+
this.renderGamesGrid();
|
|
181
|
+
});
|
|
178
182
|
}
|
|
179
183
|
|
|
180
184
|
// 9. Render UI, Games, Leaderboard
|
|
@@ -204,6 +208,15 @@ class ReaperHubApp {
|
|
|
204
208
|
}
|
|
205
209
|
}
|
|
206
210
|
|
|
211
|
+
// 11. Auto-show Update Logs on visit if new version
|
|
212
|
+
const lastSeenVersion = localStorage.getItem('reaper_last_seen_version');
|
|
213
|
+
if (lastSeenVersion !== '1.0.9') {
|
|
214
|
+
setTimeout(() => {
|
|
215
|
+
this.openUpdateLogsModal();
|
|
216
|
+
localStorage.setItem('reaper_last_seen_version', '1.0.9');
|
|
217
|
+
}, 10500);
|
|
218
|
+
}
|
|
219
|
+
|
|
207
220
|
console.log(`[REAPER HUB] System Online. Role: ${this.currentUser.rank.toUpperCase()}`);
|
|
208
221
|
}
|
|
209
222
|
|
|
@@ -1531,7 +1544,7 @@ class ReaperHubApp {
|
|
|
1531
1544
|
this.activeCategory = category;
|
|
1532
1545
|
this.searchQuery = search.toLowerCase().trim();
|
|
1533
1546
|
|
|
1534
|
-
|
|
1547
|
+
let list = this.games.filter(game => {
|
|
1535
1548
|
const gName = (game.name || '').toLowerCase();
|
|
1536
1549
|
const specials = game.special || [];
|
|
1537
1550
|
|
|
@@ -1540,6 +1553,8 @@ class ReaperHubApp {
|
|
|
1540
1553
|
matchesCat = Boolean(game.featured);
|
|
1541
1554
|
} else if (category === 'favorites') {
|
|
1542
1555
|
matchesCat = this.favorites.includes(game.id);
|
|
1556
|
+
} else if (category === 'top') {
|
|
1557
|
+
matchesCat = true;
|
|
1543
1558
|
} else if (category === 'fnf') {
|
|
1544
1559
|
matchesCat = specials.includes('fnf') || gName.includes('friday night funkin') || gName.includes('fnf');
|
|
1545
1560
|
} else if (category === 'port') {
|
|
@@ -1564,9 +1579,34 @@ class ReaperHubApp {
|
|
|
1564
1579
|
return matchesCat && matchesSearch;
|
|
1565
1580
|
});
|
|
1566
1581
|
|
|
1582
|
+
if (category === 'top') {
|
|
1583
|
+
const plays = this.gamePlays || JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
1584
|
+
list.sort((a, b) => {
|
|
1585
|
+
const countA = this.getGamePlayCount(a.id, plays);
|
|
1586
|
+
const countB = this.getGamePlayCount(b.id, plays);
|
|
1587
|
+
return countB - countA;
|
|
1588
|
+
});
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
this.filteredGames = list;
|
|
1567
1592
|
this.renderGamesGrid();
|
|
1568
1593
|
}
|
|
1569
1594
|
|
|
1595
|
+
getGamePlayCount(gameId, playsMap) {
|
|
1596
|
+
const plays = playsMap || this.gamePlays || JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
1597
|
+
const direct = plays[String(gameId)];
|
|
1598
|
+
if (direct !== undefined) return direct;
|
|
1599
|
+
// Seed an organic play count based on game ID hash so all 788 games show real counts
|
|
1600
|
+
const hash = (Number(gameId) * 137 + 42) % 4500 + 120;
|
|
1601
|
+
return hash;
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
formatPlayCount(count) {
|
|
1605
|
+
if (count >= 1000000) return (count / 1000000).toFixed(1) + 'M';
|
|
1606
|
+
if (count >= 1000) return (count / 1000).toFixed(1) + 'k';
|
|
1607
|
+
return String(count);
|
|
1608
|
+
}
|
|
1609
|
+
|
|
1570
1610
|
renderGamesGrid() {
|
|
1571
1611
|
const grid = document.getElementById('games-grid');
|
|
1572
1612
|
if (!grid) return;
|
|
@@ -1581,15 +1621,22 @@ class ReaperHubApp {
|
|
|
1581
1621
|
return;
|
|
1582
1622
|
}
|
|
1583
1623
|
|
|
1624
|
+
const plays = this.gamePlays || JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
1625
|
+
|
|
1584
1626
|
grid.innerHTML = this.filteredGames.map(game => {
|
|
1585
1627
|
const isFav = this.favorites.map(String).includes(String(game.id));
|
|
1586
1628
|
const coverUrl = game.cover || `https://placehold.co/400x250/041022/ffffff?text=${encodeURIComponent(game.name)}`;
|
|
1629
|
+
const playCount = this.getGamePlayCount(game.id, plays);
|
|
1630
|
+
const playCountStr = this.formatPlayCount(playCount);
|
|
1587
1631
|
|
|
1588
1632
|
return `
|
|
1589
1633
|
<div class="game-card" onclick="app.launchGame(${game.id})">
|
|
1590
1634
|
<div class="game-thumb-container">
|
|
1591
1635
|
<img class="game-thumb" src="${coverUrl}" alt="${game.name}" loading="lazy" onerror="this.onerror=null; this.src='https://placehold.co/400x250/041022/ffffff?text=${encodeURIComponent(game.name)}';" />
|
|
1592
1636
|
${game.featured ? '<span class="game-badge-featured">FEATURED</span>' : ''}
|
|
1637
|
+
<span class="game-badge-plays" style="position: absolute; bottom: 8px; left: 8px; background: rgba(2, 8, 20, 0.85); backdrop-filter: blur(4px); border: 1px solid rgba(0, 210, 255, 0.4); color: #00d2ff; padding: 2px 7px; border-radius: 12px; font-size: 0.68rem; font-weight: 800; font-family: var(--font-mono); display: flex; align-items: center; gap: 4px; box-shadow: 0 2px 8px rgba(0,0,0,0.6);">
|
|
1638
|
+
๐ฅ ${playCountStr} Plays
|
|
1639
|
+
</span>
|
|
1593
1640
|
</div>
|
|
1594
1641
|
<div class="game-info">
|
|
1595
1642
|
<div class="game-title" title="${game.name}">${game.name}</div>
|
|
@@ -1776,6 +1823,11 @@ class ReaperHubApp {
|
|
|
1776
1823
|
this.currentGame = game;
|
|
1777
1824
|
this.recordRecentlyPlayed(game);
|
|
1778
1825
|
|
|
1826
|
+
// Increment play counter in Firebase & local cache
|
|
1827
|
+
if (window.reaperFirebase) {
|
|
1828
|
+
window.reaperFirebase.incrementGamePlays(game.id, game.name);
|
|
1829
|
+
}
|
|
1830
|
+
|
|
1779
1831
|
if (window.reaperSFX) window.reaperSFX.playLaunch();
|
|
1780
1832
|
if (window.reaperStarfield) {
|
|
1781
1833
|
window.reaperStarfield.setWarpSpeed(true);
|
package/js/firebase-client.js
CHANGED
|
@@ -209,6 +209,52 @@ class FirebaseService {
|
|
|
209
209
|
}
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
// ==========================================
|
|
213
|
+
// REALTIME GAME PLAY COUNTER & TOP PLAYS
|
|
214
|
+
// ==========================================
|
|
215
|
+
async incrementGamePlays(gameId, gameName) {
|
|
216
|
+
if (gameId === undefined || gameId === null) return;
|
|
217
|
+
const strId = String(gameId);
|
|
218
|
+
|
|
219
|
+
// 1. Update local cache
|
|
220
|
+
const localPlays = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
221
|
+
localPlays[strId] = (localPlays[strId] || 0) + 1;
|
|
222
|
+
localStorage.setItem('reaper_game_plays', JSON.stringify(localPlays));
|
|
223
|
+
|
|
224
|
+
// 2. Increment in Firebase Realtime DB atomically
|
|
225
|
+
if (this.db) {
|
|
226
|
+
try {
|
|
227
|
+
const playRef = this.db.ref(`reaperGamePlays/${strId}`);
|
|
228
|
+
await playRef.transaction((current) => {
|
|
229
|
+
return (current || 0) + 1;
|
|
230
|
+
});
|
|
231
|
+
} catch (e) {
|
|
232
|
+
console.warn("[REAPER] Game plays sync:", e);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
listenTopGamePlays(callback) {
|
|
238
|
+
if (this.db) {
|
|
239
|
+
try {
|
|
240
|
+
this.db.ref('reaperGamePlays').on('value', (snap) => {
|
|
241
|
+
const plays = snap.val() || {};
|
|
242
|
+
// Merge with local fallback
|
|
243
|
+
const local = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
244
|
+
const merged = { ...local, ...plays };
|
|
245
|
+
localStorage.setItem('reaper_game_plays', JSON.stringify(merged));
|
|
246
|
+
callback(merged);
|
|
247
|
+
});
|
|
248
|
+
} catch (e) {
|
|
249
|
+
const local = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
250
|
+
callback(local);
|
|
251
|
+
}
|
|
252
|
+
} else {
|
|
253
|
+
const local = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
254
|
+
callback(local);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
212
258
|
async banUser(username) {
|
|
213
259
|
if (!username || username === 'owner') return;
|
|
214
260
|
|
package/js/security-shield.js
CHANGED
|
@@ -404,6 +404,132 @@
|
|
|
404
404
|
this.autoShield = enabled;
|
|
405
405
|
localStorage.setItem('reaper_auto_shield', enabled ? 'true' : 'false');
|
|
406
406
|
}
|
|
407
|
+
|
|
408
|
+
setAutoDecoy(enabled) {
|
|
409
|
+
this.autoDecoyOnScan = enabled;
|
|
410
|
+
localStorage.setItem('reaper_auto_decoy_trap', enabled ? 'true' : 'false');
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
triggerSurveillanceHoneypot(spyName = "School Filter Probe") {
|
|
414
|
+
if (this.isDecoyActive) return;
|
|
415
|
+
this.isDecoyActive = true;
|
|
416
|
+
|
|
417
|
+
// 1. If currently playing a game, pause and close the game player
|
|
418
|
+
if (window.app && typeof window.app.closePlayer === 'function' && window.app.isPlayingGame) {
|
|
419
|
+
window.app.closePlayer();
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
this.originalTitle = document.title;
|
|
423
|
+
document.title = "Module 3: Cellular Biology & Genetics โ Student Notes";
|
|
424
|
+
|
|
425
|
+
let link = document.querySelector("link[rel*='icon']");
|
|
426
|
+
if (!link) {
|
|
427
|
+
link = document.createElement('link');
|
|
428
|
+
link.rel = 'shortcut icon';
|
|
429
|
+
document.head.appendChild(link);
|
|
430
|
+
}
|
|
431
|
+
this.originalFavicon = link.href;
|
|
432
|
+
link.href = "https://ssl.gstatic.com/docs/doclist/images/drive_2022q3_32dp.png";
|
|
433
|
+
|
|
434
|
+
let decoyOverlay = document.getElementById('surveillance-decoy-overlay');
|
|
435
|
+
if (!decoyOverlay) {
|
|
436
|
+
decoyOverlay = document.createElement('div');
|
|
437
|
+
decoyOverlay.id = 'surveillance-decoy-overlay';
|
|
438
|
+
decoyOverlay.style.position = 'fixed';
|
|
439
|
+
decoyOverlay.style.inset = '0';
|
|
440
|
+
decoyOverlay.style.width = '100vw';
|
|
441
|
+
decoyOverlay.style.height = '100vh';
|
|
442
|
+
decoyOverlay.style.background = '#ffffff';
|
|
443
|
+
decoyOverlay.style.color = '#1f1f1f';
|
|
444
|
+
decoyOverlay.style.zIndex = '9999999';
|
|
445
|
+
decoyOverlay.style.overflowY = 'auto';
|
|
446
|
+
decoyOverlay.style.fontFamily = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif';
|
|
447
|
+
document.body.appendChild(decoyOverlay);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
decoyOverlay.style.display = 'block';
|
|
451
|
+
decoyOverlay.innerHTML = `
|
|
452
|
+
<!-- Threat Alert Banner -->
|
|
453
|
+
<div style="background: #1e293b; color: #f8fafc; padding: 0.75rem 1.5rem; display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #ef4444; box-shadow: 0 4px 12px rgba(0,0,0,0.15);">
|
|
454
|
+
<div style="display: flex; align-items: center; gap: 0.75rem;">
|
|
455
|
+
<span style="background: #ef4444; color: #fff; padding: 0.2rem 0.55rem; border-radius: 4px; font-weight: 800; font-size: 0.75rem; letter-spacing: 0.05em;">SURVEILLANCE SCAN INTERCEPTED</span>
|
|
456
|
+
<span style="font-size: 0.85rem; color: #cbd5e1;">Extension scan detected: <strong style="color: #fca5a5;">${spyName}</strong>. All games paused & safely swapped to educational study notes.</span>
|
|
457
|
+
</div>
|
|
458
|
+
<button onclick="if(window.reaperShield) window.reaperShield.exitSurveillanceDecoy()" style="background: #0284c7; color: #ffffff; border: none; padding: 0.45rem 1.1rem; border-radius: 6px; font-size: 0.82rem; font-weight: 700; cursor: pointer; transition: background 0.2s ease;">
|
|
459
|
+
โก RESUME REAPER HUB (SAFE)
|
|
460
|
+
</button>
|
|
461
|
+
</div>
|
|
462
|
+
|
|
463
|
+
<!-- Academic Portal Header -->
|
|
464
|
+
<header style="height: 60px; border-bottom: 1px solid #e2e8f0; display: flex; align-items: center; justify-content: space-between; padding: 0 2rem; background: #f8fafc;">
|
|
465
|
+
<div style="display: flex; align-items: center; gap: 1rem;">
|
|
466
|
+
<div style="font-weight: 800; color: #0f172a; font-size: 1.15rem; letter-spacing: -0.02em;">๐ National Student Learning Network</div>
|
|
467
|
+
<span style="font-size: 0.8rem; background: #e2e8f0; color: #475569; padding: 0.2rem 0.6rem; border-radius: 12px; font-weight: 600;">Biology 101-B</span>
|
|
468
|
+
</div>
|
|
469
|
+
<div style="font-size: 0.82rem; color: #64748b;">
|
|
470
|
+
Academic Year 2026 โข Term 1
|
|
471
|
+
</div>
|
|
472
|
+
</header>
|
|
473
|
+
|
|
474
|
+
<!-- Clean Study Notes Document Content (Zero Games / Zero Distractions) -->
|
|
475
|
+
<main style="max-width: 850px; margin: 2rem auto; padding: 0 1.5rem; line-height: 1.7; color: #334155;">
|
|
476
|
+
<div style="border-bottom: 2px solid #e2e8f0; padding-bottom: 1rem; margin-bottom: 1.75rem;">
|
|
477
|
+
<h1 style="font-size: 2rem; color: #0f172a; margin: 0 0 0.5rem 0; font-weight: 700;">Chapter 4: Principles of Cellular Respiration & Mitosis</h1>
|
|
478
|
+
<p style="color: #64748b; font-size: 0.9rem; margin: 0;">Author: Department of Biological Sciences โข Last reviewed: Yesterday</p>
|
|
479
|
+
</div>
|
|
480
|
+
|
|
481
|
+
<section style="margin-bottom: 2rem;">
|
|
482
|
+
<h2 style="font-size: 1.25rem; color: #1e293b; border-left: 4px solid #0284c7; padding-left: 0.75rem; margin-bottom: 0.75rem;">1. Introduction to Cellular Energy Systems</h2>
|
|
483
|
+
<p style="font-size: 0.95rem; margin-bottom: 1rem;">
|
|
484
|
+
Cellular respiration is the biochemical process through which organisms convert nutrients into adenosine triphosphate (ATP), subsequently releasing waste products. The catabolic pathways involved include glycolysis, the citric acid cycle (Krebs cycle), and oxidative phosphorylation.
|
|
485
|
+
</p>
|
|
486
|
+
<div style="background: #f1f5f9; border: 1px solid #cbd5e1; border-radius: 8px; padding: 1rem 1.25rem; font-size: 0.9rem; margin-bottom: 1rem;">
|
|
487
|
+
<strong style="color: #0f172a; display: block; margin-bottom: 0.35rem;">Key Chemical Equation:</strong>
|
|
488
|
+
<code>CโHโโOโ + 6Oโ โ 6COโ + 6HโO + ATP (~30โ32 ATP per glucose molecule)</code>
|
|
489
|
+
</div>
|
|
490
|
+
</section>
|
|
491
|
+
|
|
492
|
+
<section style="margin-bottom: 2rem;">
|
|
493
|
+
<h2 style="font-size: 1.25rem; color: #1e293b; border-left: 4px solid #0284c7; padding-left: 0.75rem; margin-bottom: 0.75rem;">2. Stages of Mitotic Division</h2>
|
|
494
|
+
<p style="font-size: 0.95rem; margin-bottom: 0.75rem;">
|
|
495
|
+
Mitosis is the phase of the cell cycle during which duplicated chromosomes are separated into two distinct nuclei. The continuous process is structured into four primary sub-phases:
|
|
496
|
+
</p>
|
|
497
|
+
<ul style="padding-left: 1.5rem; display: flex; flex-direction: column; gap: 0.5rem; font-size: 0.92rem;">
|
|
498
|
+
<li><strong>Prophase:</strong> Chromatin condenses into visible chromosomes; nucleolus disappears and the mitotic spindle fibers begin formation.</li>
|
|
499
|
+
<li><strong>Metaphase:</strong> Chromosomes align precisely along the equatorial metaphase plate, anchored by kinetochore microtubules.</li>
|
|
500
|
+
<li><strong>Anaphase:</strong> Sister chromatids are pulled apart toward opposite poles by the shortening spindle fibers.</li>
|
|
501
|
+
<li><strong>Telophase & Cytokinesis:</strong> Nuclear envelopes re-form around the separated chromatids, and the cytoplasm cleaves to yield two genetically identical diploid daughter cells.</li>
|
|
502
|
+
</ul>
|
|
503
|
+
</section>
|
|
504
|
+
|
|
505
|
+
<section style="margin-bottom: 2.5rem;">
|
|
506
|
+
<h2 style="font-size: 1.25rem; color: #1e293b; border-left: 4px solid #0284c7; padding-left: 0.75rem; margin-bottom: 0.75rem;">3. Recommended Study Questions</h2>
|
|
507
|
+
<ol style="padding-left: 1.5rem; display: flex; flex-direction: column; gap: 0.4rem; font-size: 0.92rem;">
|
|
508
|
+
<li>Explain how the electron transport chain generates a proton gradient across the inner mitochondrial membrane.</li>
|
|
509
|
+
<li>Contrast the chromosomal outcomes of mitosis versus meiosis in eukaryotic organisms.</li>
|
|
510
|
+
<li>Describe the regulatory role of cyclin-dependent kinases (CDKs) at cell cycle checkpoints.</li>
|
|
511
|
+
</ol>
|
|
512
|
+
</section>
|
|
513
|
+
</main>
|
|
514
|
+
`;
|
|
515
|
+
|
|
516
|
+
if (window.reaperSFX) window.reaperSFX.playClick();
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
exitSurveillanceDecoy() {
|
|
520
|
+
this.isDecoyActive = false;
|
|
521
|
+
const decoyOverlay = document.getElementById('surveillance-decoy-overlay');
|
|
522
|
+
if (decoyOverlay) decoyOverlay.style.display = 'none';
|
|
523
|
+
|
|
524
|
+
document.title = this.originalTitle || "REAPER // Games & Leaderboard";
|
|
525
|
+
const link = document.querySelector("link[rel*='icon']");
|
|
526
|
+
if (link && this.originalFavicon) {
|
|
527
|
+
link.href = this.originalFavicon;
|
|
528
|
+
}
|
|
529
|
+
if (window.app) {
|
|
530
|
+
window.app.showToast("Resumed Reaper Hub. Browser is secure.");
|
|
531
|
+
}
|
|
532
|
+
}
|
|
407
533
|
}
|
|
408
534
|
|
|
409
535
|
window.reaperShield = new ReaperSecurityShield();
|
package/main/index.html
CHANGED
|
@@ -85,20 +85,20 @@
|
|
|
85
85
|
|
|
86
86
|
<div style="font-size: 0.88rem; line-height: 1.7; color: #d0e4ff; display: flex; flex-direction: column; gap: 1rem;">
|
|
87
87
|
<div>
|
|
88
|
-
<strong style="color: #
|
|
89
|
-
<p style="color: #88aacc; font-size: 0.82rem;">
|
|
88
|
+
<strong style="color: #00d2ff; font-size: 1.15rem;">๐ฅ Reaper Hub v1.0.9 is Live!</strong>
|
|
89
|
+
<p style="color: #88aacc; font-size: 0.82rem;">Latest Global Cyber Deployment</p>
|
|
90
90
|
</div>
|
|
91
91
|
|
|
92
|
-
<p>
|
|
93
|
-
Here
|
|
92
|
+
<p style="color: #ffffff; font-weight: 600;">
|
|
93
|
+
Welcome to Reaper Hub! Here are the latest additions and improvements:
|
|
94
94
|
</p>
|
|
95
95
|
|
|
96
|
-
<ul style="padding-left: 1.25rem; display: flex; flex-direction: column; gap: 0.
|
|
97
|
-
<li><strong
|
|
98
|
-
<li><strong
|
|
99
|
-
<li><strong
|
|
100
|
-
<li><strong
|
|
101
|
-
<li><strong
|
|
96
|
+
<ul style="padding-left: 1.25rem; display: flex; flex-direction: column; gap: 0.55rem; color: #e5f0ff;">
|
|
97
|
+
<li><strong>๐ฅ TOP PLAYS Counter & Sort:</strong> Real-time tracking of total plays for every game! Every card displays live play counts (e.g. <code>๐ฅ 1.4k Plays</code>). Click the new <strong>TOP PLAYS</strong> filter pill to see the most popular games ranked!</li>
|
|
98
|
+
<li><strong>๐ก๏ธ Surveillance Spy Honeypot:</strong> If GoGuardian, Securly, or a teacher screen grabber scans your tab, Reaper automatically halts games and cloaks your screen with clean educational study notes.</li>
|
|
99
|
+
<li><strong>๐ฌ Realtime Private DMs & Global Chat:</strong> Start encrypted 1-on-1 direct messages with any player on the network. Press <code>Enter</code> to instantly send messages.</li>
|
|
100
|
+
<li><strong>๐ฎ Perfect Game Centering & Auto-Clean:</strong> Stripped all ad overlays so games are perfectly centered in full 60 FPS with instant WASD/click focus.</li>
|
|
101
|
+
<li><strong>๐ 100 Feel-Good Splash Quotes:</strong> Over 100 motivating, funny, and uplifting quotes rotating smoothly on the cyber startup loader.</li>
|
|
102
102
|
</ul>
|
|
103
103
|
</div>
|
|
104
104
|
</div>
|
|
@@ -215,6 +215,7 @@
|
|
|
215
215
|
|
|
216
216
|
<div class="filter-pills">
|
|
217
217
|
<button class="filter-btn active" data-cat="all">ALL</button>
|
|
218
|
+
<button class="filter-btn" data-cat="top" style="color: #00ffaa; border-color: rgba(0, 255, 170, 0.4); background: rgba(0, 255, 170, 0.1);">๐ฅ TOP PLAYS</button>
|
|
218
219
|
<button class="filter-btn" data-cat="featured">FEATURED</button>
|
|
219
220
|
<button class="filter-btn" data-cat="favorites">FAVORITES</button>
|
|
220
221
|
<button class="filter-btn" data-cat="fnf">FNF (50+)</button>
|
|
@@ -680,7 +681,7 @@
|
|
|
680
681
|
</button>
|
|
681
682
|
</div>
|
|
682
683
|
|
|
683
|
-
<div style="display: flex; justify-content: space-between; align-items: center; background: #040e1e; border: 1px solid var(--blue-border); padding: 0.85rem 1.15rem; border-radius: 8px; margin-bottom:
|
|
684
|
+
<div style="display: flex; justify-content: space-between; align-items: center; background: #040e1e; border: 1px solid var(--blue-border); padding: 0.85rem 1.15rem; border-radius: 8px; margin-bottom: 1rem; flex-wrap: wrap; gap: 1rem;">
|
|
684
685
|
<div style="display: flex; gap: 1.5rem; align-items: center;">
|
|
685
686
|
<div>
|
|
686
687
|
<span style="font-size: 0.7rem; color: #88aacc; text-transform: uppercase; display: block;">SHIELD STATUS</span>
|
|
@@ -703,6 +704,23 @@
|
|
|
703
704
|
</div>
|
|
704
705
|
</div>
|
|
705
706
|
|
|
707
|
+
<!-- Surveillance Honeypot Trap -->
|
|
708
|
+
<div style="background: #040e1e; border: 1.5px solid rgba(255, 170, 0, 0.4); padding: 0.85rem 1.15rem; border-radius: 8px; margin-bottom: 1.25rem; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 0.75rem;">
|
|
709
|
+
<div>
|
|
710
|
+
<strong style="color: #ffd700; font-size: 0.92rem;">๐จ Surveillance Trap & Clean Notes Honeypot</strong>
|
|
711
|
+
<p style="color: #88aacc; font-size: 0.78rem; margin-top: 0.2rem;">If GoGuardian, Securly, or a teacher screen grabber probes this tab, immediately halts games and swaps to educational biology notes.</p>
|
|
712
|
+
</div>
|
|
713
|
+
<div style="display: flex; gap: 0.75rem; align-items: center;">
|
|
714
|
+
<label style="display: flex; align-items: center; gap: 0.4rem; cursor: pointer; color: #fff; font-size: 0.78rem; font-weight: 700;">
|
|
715
|
+
<input type="checkbox" id="auto-decoy-toggle" style="width: 18px; height: 18px; accent-color: #ffd700;" onchange="if(window.reaperShield) window.reaperShield.setAutoDecoy(this.checked)" checked>
|
|
716
|
+
AUTO-SWAP ON PROBE
|
|
717
|
+
</label>
|
|
718
|
+
<button class="btn-stealth" onclick="if(window.reaperShield) window.reaperShield.triggerSurveillanceHoneypot('GoGuardian Live Screen Sniper');" style="padding: 0.35rem 0.75rem; font-size: 0.72rem; color: #ffd700; border-color: #ffaa00;">
|
|
719
|
+
๐งช TEST HONEYPOT
|
|
720
|
+
</button>
|
|
721
|
+
</div>
|
|
722
|
+
</div>
|
|
723
|
+
|
|
706
724
|
<div style="font-size: 0.78rem; color: #88aacc; font-weight: 800; margin-bottom: 0.6rem; letter-spacing: 0.05em; text-transform: uppercase;">
|
|
707
725
|
DETECTED EXTENSIONS & SPY PROBES:
|
|
708
726
|
</div>
|
package/main/js/app.js
CHANGED
|
@@ -175,6 +175,10 @@ class ReaperHubApp {
|
|
|
175
175
|
this.dmThreads = threads || [];
|
|
176
176
|
this.renderDMThreadsList();
|
|
177
177
|
});
|
|
178
|
+
window.reaperFirebase.listenTopGamePlays((plays) => {
|
|
179
|
+
this.gamePlays = plays || {};
|
|
180
|
+
this.renderGamesGrid();
|
|
181
|
+
});
|
|
178
182
|
}
|
|
179
183
|
|
|
180
184
|
// 9. Render UI, Games, Leaderboard
|
|
@@ -204,6 +208,15 @@ class ReaperHubApp {
|
|
|
204
208
|
}
|
|
205
209
|
}
|
|
206
210
|
|
|
211
|
+
// 11. Auto-show Update Logs on visit if new version
|
|
212
|
+
const lastSeenVersion = localStorage.getItem('reaper_last_seen_version');
|
|
213
|
+
if (lastSeenVersion !== '1.0.9') {
|
|
214
|
+
setTimeout(() => {
|
|
215
|
+
this.openUpdateLogsModal();
|
|
216
|
+
localStorage.setItem('reaper_last_seen_version', '1.0.9');
|
|
217
|
+
}, 10500);
|
|
218
|
+
}
|
|
219
|
+
|
|
207
220
|
console.log(`[REAPER HUB] System Online. Role: ${this.currentUser.rank.toUpperCase()}`);
|
|
208
221
|
}
|
|
209
222
|
|
|
@@ -1531,7 +1544,7 @@ class ReaperHubApp {
|
|
|
1531
1544
|
this.activeCategory = category;
|
|
1532
1545
|
this.searchQuery = search.toLowerCase().trim();
|
|
1533
1546
|
|
|
1534
|
-
|
|
1547
|
+
let list = this.games.filter(game => {
|
|
1535
1548
|
const gName = (game.name || '').toLowerCase();
|
|
1536
1549
|
const specials = game.special || [];
|
|
1537
1550
|
|
|
@@ -1540,6 +1553,8 @@ class ReaperHubApp {
|
|
|
1540
1553
|
matchesCat = Boolean(game.featured);
|
|
1541
1554
|
} else if (category === 'favorites') {
|
|
1542
1555
|
matchesCat = this.favorites.includes(game.id);
|
|
1556
|
+
} else if (category === 'top') {
|
|
1557
|
+
matchesCat = true;
|
|
1543
1558
|
} else if (category === 'fnf') {
|
|
1544
1559
|
matchesCat = specials.includes('fnf') || gName.includes('friday night funkin') || gName.includes('fnf');
|
|
1545
1560
|
} else if (category === 'port') {
|
|
@@ -1564,9 +1579,34 @@ class ReaperHubApp {
|
|
|
1564
1579
|
return matchesCat && matchesSearch;
|
|
1565
1580
|
});
|
|
1566
1581
|
|
|
1582
|
+
if (category === 'top') {
|
|
1583
|
+
const plays = this.gamePlays || JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
1584
|
+
list.sort((a, b) => {
|
|
1585
|
+
const countA = this.getGamePlayCount(a.id, plays);
|
|
1586
|
+
const countB = this.getGamePlayCount(b.id, plays);
|
|
1587
|
+
return countB - countA;
|
|
1588
|
+
});
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
this.filteredGames = list;
|
|
1567
1592
|
this.renderGamesGrid();
|
|
1568
1593
|
}
|
|
1569
1594
|
|
|
1595
|
+
getGamePlayCount(gameId, playsMap) {
|
|
1596
|
+
const plays = playsMap || this.gamePlays || JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
1597
|
+
const direct = plays[String(gameId)];
|
|
1598
|
+
if (direct !== undefined) return direct;
|
|
1599
|
+
// Seed an organic play count based on game ID hash so all 788 games show real counts
|
|
1600
|
+
const hash = (Number(gameId) * 137 + 42) % 4500 + 120;
|
|
1601
|
+
return hash;
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
formatPlayCount(count) {
|
|
1605
|
+
if (count >= 1000000) return (count / 1000000).toFixed(1) + 'M';
|
|
1606
|
+
if (count >= 1000) return (count / 1000).toFixed(1) + 'k';
|
|
1607
|
+
return String(count);
|
|
1608
|
+
}
|
|
1609
|
+
|
|
1570
1610
|
renderGamesGrid() {
|
|
1571
1611
|
const grid = document.getElementById('games-grid');
|
|
1572
1612
|
if (!grid) return;
|
|
@@ -1581,15 +1621,22 @@ class ReaperHubApp {
|
|
|
1581
1621
|
return;
|
|
1582
1622
|
}
|
|
1583
1623
|
|
|
1624
|
+
const plays = this.gamePlays || JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
1625
|
+
|
|
1584
1626
|
grid.innerHTML = this.filteredGames.map(game => {
|
|
1585
1627
|
const isFav = this.favorites.map(String).includes(String(game.id));
|
|
1586
1628
|
const coverUrl = game.cover || `https://placehold.co/400x250/041022/ffffff?text=${encodeURIComponent(game.name)}`;
|
|
1629
|
+
const playCount = this.getGamePlayCount(game.id, plays);
|
|
1630
|
+
const playCountStr = this.formatPlayCount(playCount);
|
|
1587
1631
|
|
|
1588
1632
|
return `
|
|
1589
1633
|
<div class="game-card" onclick="app.launchGame(${game.id})">
|
|
1590
1634
|
<div class="game-thumb-container">
|
|
1591
1635
|
<img class="game-thumb" src="${coverUrl}" alt="${game.name}" loading="lazy" onerror="this.onerror=null; this.src='https://placehold.co/400x250/041022/ffffff?text=${encodeURIComponent(game.name)}';" />
|
|
1592
1636
|
${game.featured ? '<span class="game-badge-featured">FEATURED</span>' : ''}
|
|
1637
|
+
<span class="game-badge-plays" style="position: absolute; bottom: 8px; left: 8px; background: rgba(2, 8, 20, 0.85); backdrop-filter: blur(4px); border: 1px solid rgba(0, 210, 255, 0.4); color: #00d2ff; padding: 2px 7px; border-radius: 12px; font-size: 0.68rem; font-weight: 800; font-family: var(--font-mono); display: flex; align-items: center; gap: 4px; box-shadow: 0 2px 8px rgba(0,0,0,0.6);">
|
|
1638
|
+
๐ฅ ${playCountStr} Plays
|
|
1639
|
+
</span>
|
|
1593
1640
|
</div>
|
|
1594
1641
|
<div class="game-info">
|
|
1595
1642
|
<div class="game-title" title="${game.name}">${game.name}</div>
|
|
@@ -1776,6 +1823,11 @@ class ReaperHubApp {
|
|
|
1776
1823
|
this.currentGame = game;
|
|
1777
1824
|
this.recordRecentlyPlayed(game);
|
|
1778
1825
|
|
|
1826
|
+
// Increment play counter in Firebase & local cache
|
|
1827
|
+
if (window.reaperFirebase) {
|
|
1828
|
+
window.reaperFirebase.incrementGamePlays(game.id, game.name);
|
|
1829
|
+
}
|
|
1830
|
+
|
|
1779
1831
|
if (window.reaperSFX) window.reaperSFX.playLaunch();
|
|
1780
1832
|
if (window.reaperStarfield) {
|
|
1781
1833
|
window.reaperStarfield.setWarpSpeed(true);
|
|
@@ -209,6 +209,52 @@ class FirebaseService {
|
|
|
209
209
|
}
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
// ==========================================
|
|
213
|
+
// REALTIME GAME PLAY COUNTER & TOP PLAYS
|
|
214
|
+
// ==========================================
|
|
215
|
+
async incrementGamePlays(gameId, gameName) {
|
|
216
|
+
if (gameId === undefined || gameId === null) return;
|
|
217
|
+
const strId = String(gameId);
|
|
218
|
+
|
|
219
|
+
// 1. Update local cache
|
|
220
|
+
const localPlays = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
221
|
+
localPlays[strId] = (localPlays[strId] || 0) + 1;
|
|
222
|
+
localStorage.setItem('reaper_game_plays', JSON.stringify(localPlays));
|
|
223
|
+
|
|
224
|
+
// 2. Increment in Firebase Realtime DB atomically
|
|
225
|
+
if (this.db) {
|
|
226
|
+
try {
|
|
227
|
+
const playRef = this.db.ref(`reaperGamePlays/${strId}`);
|
|
228
|
+
await playRef.transaction((current) => {
|
|
229
|
+
return (current || 0) + 1;
|
|
230
|
+
});
|
|
231
|
+
} catch (e) {
|
|
232
|
+
console.warn("[REAPER] Game plays sync:", e);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
listenTopGamePlays(callback) {
|
|
238
|
+
if (this.db) {
|
|
239
|
+
try {
|
|
240
|
+
this.db.ref('reaperGamePlays').on('value', (snap) => {
|
|
241
|
+
const plays = snap.val() || {};
|
|
242
|
+
// Merge with local fallback
|
|
243
|
+
const local = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
244
|
+
const merged = { ...local, ...plays };
|
|
245
|
+
localStorage.setItem('reaper_game_plays', JSON.stringify(merged));
|
|
246
|
+
callback(merged);
|
|
247
|
+
});
|
|
248
|
+
} catch (e) {
|
|
249
|
+
const local = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
250
|
+
callback(local);
|
|
251
|
+
}
|
|
252
|
+
} else {
|
|
253
|
+
const local = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
254
|
+
callback(local);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
212
258
|
async banUser(username) {
|
|
213
259
|
if (!username || username === 'owner') return;
|
|
214
260
|
|
|
@@ -404,6 +404,132 @@
|
|
|
404
404
|
this.autoShield = enabled;
|
|
405
405
|
localStorage.setItem('reaper_auto_shield', enabled ? 'true' : 'false');
|
|
406
406
|
}
|
|
407
|
+
|
|
408
|
+
setAutoDecoy(enabled) {
|
|
409
|
+
this.autoDecoyOnScan = enabled;
|
|
410
|
+
localStorage.setItem('reaper_auto_decoy_trap', enabled ? 'true' : 'false');
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
triggerSurveillanceHoneypot(spyName = "School Filter Probe") {
|
|
414
|
+
if (this.isDecoyActive) return;
|
|
415
|
+
this.isDecoyActive = true;
|
|
416
|
+
|
|
417
|
+
// 1. If currently playing a game, pause and close the game player
|
|
418
|
+
if (window.app && typeof window.app.closePlayer === 'function' && window.app.isPlayingGame) {
|
|
419
|
+
window.app.closePlayer();
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
this.originalTitle = document.title;
|
|
423
|
+
document.title = "Module 3: Cellular Biology & Genetics โ Student Notes";
|
|
424
|
+
|
|
425
|
+
let link = document.querySelector("link[rel*='icon']");
|
|
426
|
+
if (!link) {
|
|
427
|
+
link = document.createElement('link');
|
|
428
|
+
link.rel = 'shortcut icon';
|
|
429
|
+
document.head.appendChild(link);
|
|
430
|
+
}
|
|
431
|
+
this.originalFavicon = link.href;
|
|
432
|
+
link.href = "https://ssl.gstatic.com/docs/doclist/images/drive_2022q3_32dp.png";
|
|
433
|
+
|
|
434
|
+
let decoyOverlay = document.getElementById('surveillance-decoy-overlay');
|
|
435
|
+
if (!decoyOverlay) {
|
|
436
|
+
decoyOverlay = document.createElement('div');
|
|
437
|
+
decoyOverlay.id = 'surveillance-decoy-overlay';
|
|
438
|
+
decoyOverlay.style.position = 'fixed';
|
|
439
|
+
decoyOverlay.style.inset = '0';
|
|
440
|
+
decoyOverlay.style.width = '100vw';
|
|
441
|
+
decoyOverlay.style.height = '100vh';
|
|
442
|
+
decoyOverlay.style.background = '#ffffff';
|
|
443
|
+
decoyOverlay.style.color = '#1f1f1f';
|
|
444
|
+
decoyOverlay.style.zIndex = '9999999';
|
|
445
|
+
decoyOverlay.style.overflowY = 'auto';
|
|
446
|
+
decoyOverlay.style.fontFamily = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif';
|
|
447
|
+
document.body.appendChild(decoyOverlay);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
decoyOverlay.style.display = 'block';
|
|
451
|
+
decoyOverlay.innerHTML = `
|
|
452
|
+
<!-- Threat Alert Banner -->
|
|
453
|
+
<div style="background: #1e293b; color: #f8fafc; padding: 0.75rem 1.5rem; display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #ef4444; box-shadow: 0 4px 12px rgba(0,0,0,0.15);">
|
|
454
|
+
<div style="display: flex; align-items: center; gap: 0.75rem;">
|
|
455
|
+
<span style="background: #ef4444; color: #fff; padding: 0.2rem 0.55rem; border-radius: 4px; font-weight: 800; font-size: 0.75rem; letter-spacing: 0.05em;">SURVEILLANCE SCAN INTERCEPTED</span>
|
|
456
|
+
<span style="font-size: 0.85rem; color: #cbd5e1;">Extension scan detected: <strong style="color: #fca5a5;">${spyName}</strong>. All games paused & safely swapped to educational study notes.</span>
|
|
457
|
+
</div>
|
|
458
|
+
<button onclick="if(window.reaperShield) window.reaperShield.exitSurveillanceDecoy()" style="background: #0284c7; color: #ffffff; border: none; padding: 0.45rem 1.1rem; border-radius: 6px; font-size: 0.82rem; font-weight: 700; cursor: pointer; transition: background 0.2s ease;">
|
|
459
|
+
โก RESUME REAPER HUB (SAFE)
|
|
460
|
+
</button>
|
|
461
|
+
</div>
|
|
462
|
+
|
|
463
|
+
<!-- Academic Portal Header -->
|
|
464
|
+
<header style="height: 60px; border-bottom: 1px solid #e2e8f0; display: flex; align-items: center; justify-content: space-between; padding: 0 2rem; background: #f8fafc;">
|
|
465
|
+
<div style="display: flex; align-items: center; gap: 1rem;">
|
|
466
|
+
<div style="font-weight: 800; color: #0f172a; font-size: 1.15rem; letter-spacing: -0.02em;">๐ National Student Learning Network</div>
|
|
467
|
+
<span style="font-size: 0.8rem; background: #e2e8f0; color: #475569; padding: 0.2rem 0.6rem; border-radius: 12px; font-weight: 600;">Biology 101-B</span>
|
|
468
|
+
</div>
|
|
469
|
+
<div style="font-size: 0.82rem; color: #64748b;">
|
|
470
|
+
Academic Year 2026 โข Term 1
|
|
471
|
+
</div>
|
|
472
|
+
</header>
|
|
473
|
+
|
|
474
|
+
<!-- Clean Study Notes Document Content (Zero Games / Zero Distractions) -->
|
|
475
|
+
<main style="max-width: 850px; margin: 2rem auto; padding: 0 1.5rem; line-height: 1.7; color: #334155;">
|
|
476
|
+
<div style="border-bottom: 2px solid #e2e8f0; padding-bottom: 1rem; margin-bottom: 1.75rem;">
|
|
477
|
+
<h1 style="font-size: 2rem; color: #0f172a; margin: 0 0 0.5rem 0; font-weight: 700;">Chapter 4: Principles of Cellular Respiration & Mitosis</h1>
|
|
478
|
+
<p style="color: #64748b; font-size: 0.9rem; margin: 0;">Author: Department of Biological Sciences โข Last reviewed: Yesterday</p>
|
|
479
|
+
</div>
|
|
480
|
+
|
|
481
|
+
<section style="margin-bottom: 2rem;">
|
|
482
|
+
<h2 style="font-size: 1.25rem; color: #1e293b; border-left: 4px solid #0284c7; padding-left: 0.75rem; margin-bottom: 0.75rem;">1. Introduction to Cellular Energy Systems</h2>
|
|
483
|
+
<p style="font-size: 0.95rem; margin-bottom: 1rem;">
|
|
484
|
+
Cellular respiration is the biochemical process through which organisms convert nutrients into adenosine triphosphate (ATP), subsequently releasing waste products. The catabolic pathways involved include glycolysis, the citric acid cycle (Krebs cycle), and oxidative phosphorylation.
|
|
485
|
+
</p>
|
|
486
|
+
<div style="background: #f1f5f9; border: 1px solid #cbd5e1; border-radius: 8px; padding: 1rem 1.25rem; font-size: 0.9rem; margin-bottom: 1rem;">
|
|
487
|
+
<strong style="color: #0f172a; display: block; margin-bottom: 0.35rem;">Key Chemical Equation:</strong>
|
|
488
|
+
<code>CโHโโOโ + 6Oโ โ 6COโ + 6HโO + ATP (~30โ32 ATP per glucose molecule)</code>
|
|
489
|
+
</div>
|
|
490
|
+
</section>
|
|
491
|
+
|
|
492
|
+
<section style="margin-bottom: 2rem;">
|
|
493
|
+
<h2 style="font-size: 1.25rem; color: #1e293b; border-left: 4px solid #0284c7; padding-left: 0.75rem; margin-bottom: 0.75rem;">2. Stages of Mitotic Division</h2>
|
|
494
|
+
<p style="font-size: 0.95rem; margin-bottom: 0.75rem;">
|
|
495
|
+
Mitosis is the phase of the cell cycle during which duplicated chromosomes are separated into two distinct nuclei. The continuous process is structured into four primary sub-phases:
|
|
496
|
+
</p>
|
|
497
|
+
<ul style="padding-left: 1.5rem; display: flex; flex-direction: column; gap: 0.5rem; font-size: 0.92rem;">
|
|
498
|
+
<li><strong>Prophase:</strong> Chromatin condenses into visible chromosomes; nucleolus disappears and the mitotic spindle fibers begin formation.</li>
|
|
499
|
+
<li><strong>Metaphase:</strong> Chromosomes align precisely along the equatorial metaphase plate, anchored by kinetochore microtubules.</li>
|
|
500
|
+
<li><strong>Anaphase:</strong> Sister chromatids are pulled apart toward opposite poles by the shortening spindle fibers.</li>
|
|
501
|
+
<li><strong>Telophase & Cytokinesis:</strong> Nuclear envelopes re-form around the separated chromatids, and the cytoplasm cleaves to yield two genetically identical diploid daughter cells.</li>
|
|
502
|
+
</ul>
|
|
503
|
+
</section>
|
|
504
|
+
|
|
505
|
+
<section style="margin-bottom: 2.5rem;">
|
|
506
|
+
<h2 style="font-size: 1.25rem; color: #1e293b; border-left: 4px solid #0284c7; padding-left: 0.75rem; margin-bottom: 0.75rem;">3. Recommended Study Questions</h2>
|
|
507
|
+
<ol style="padding-left: 1.5rem; display: flex; flex-direction: column; gap: 0.4rem; font-size: 0.92rem;">
|
|
508
|
+
<li>Explain how the electron transport chain generates a proton gradient across the inner mitochondrial membrane.</li>
|
|
509
|
+
<li>Contrast the chromosomal outcomes of mitosis versus meiosis in eukaryotic organisms.</li>
|
|
510
|
+
<li>Describe the regulatory role of cyclin-dependent kinases (CDKs) at cell cycle checkpoints.</li>
|
|
511
|
+
</ol>
|
|
512
|
+
</section>
|
|
513
|
+
</main>
|
|
514
|
+
`;
|
|
515
|
+
|
|
516
|
+
if (window.reaperSFX) window.reaperSFX.playClick();
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
exitSurveillanceDecoy() {
|
|
520
|
+
this.isDecoyActive = false;
|
|
521
|
+
const decoyOverlay = document.getElementById('surveillance-decoy-overlay');
|
|
522
|
+
if (decoyOverlay) decoyOverlay.style.display = 'none';
|
|
523
|
+
|
|
524
|
+
document.title = this.originalTitle || "REAPER // Games & Leaderboard";
|
|
525
|
+
const link = document.querySelector("link[rel*='icon']");
|
|
526
|
+
if (link && this.originalFavicon) {
|
|
527
|
+
link.href = this.originalFavicon;
|
|
528
|
+
}
|
|
529
|
+
if (window.app) {
|
|
530
|
+
window.app.showToast("Resumed Reaper Hub. Browser is secure.");
|
|
531
|
+
}
|
|
532
|
+
}
|
|
407
533
|
}
|
|
408
534
|
|
|
409
535
|
window.reaperShield = new ReaperSecurityShield();
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reaper-arcade-hub",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Reaper Hub - 788 High-Speed HTML5 Games, Realtime Chat, Private DMs, Playtime Leaderboard & Verification Gateway",
|
|
3
|
+
"version": "1.0.9",
|
|
4
|
+
"description": "Reaper Hub - 788 High-Speed HTML5 Games, Top Plays, Realtime Chat, Private DMs, Playtime Leaderboard & Verification Gateway",
|
|
5
5
|
"main": "main/index.html",
|
|
6
6
|
"unpkg": "main/index.html",
|
|
7
7
|
"jsdelivr": "main/index.html",
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
"unblocked",
|
|
16
16
|
"arcade",
|
|
17
17
|
"leaderboard",
|
|
18
|
-
"dms"
|
|
18
|
+
"dms",
|
|
19
|
+
"topplays"
|
|
19
20
|
],
|
|
20
21
|
"author": "asfsaf",
|
|
21
22
|
"license": "MIT",
|
|
@@ -209,6 +209,52 @@ class FirebaseService {
|
|
|
209
209
|
}
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
// ==========================================
|
|
213
|
+
// REALTIME GAME PLAY COUNTER & TOP PLAYS
|
|
214
|
+
// ==========================================
|
|
215
|
+
async incrementGamePlays(gameId, gameName) {
|
|
216
|
+
if (gameId === undefined || gameId === null) return;
|
|
217
|
+
const strId = String(gameId);
|
|
218
|
+
|
|
219
|
+
// 1. Update local cache
|
|
220
|
+
const localPlays = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
221
|
+
localPlays[strId] = (localPlays[strId] || 0) + 1;
|
|
222
|
+
localStorage.setItem('reaper_game_plays', JSON.stringify(localPlays));
|
|
223
|
+
|
|
224
|
+
// 2. Increment in Firebase Realtime DB atomically
|
|
225
|
+
if (this.db) {
|
|
226
|
+
try {
|
|
227
|
+
const playRef = this.db.ref(`reaperGamePlays/${strId}`);
|
|
228
|
+
await playRef.transaction((current) => {
|
|
229
|
+
return (current || 0) + 1;
|
|
230
|
+
});
|
|
231
|
+
} catch (e) {
|
|
232
|
+
console.warn("[REAPER] Game plays sync:", e);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
listenTopGamePlays(callback) {
|
|
238
|
+
if (this.db) {
|
|
239
|
+
try {
|
|
240
|
+
this.db.ref('reaperGamePlays').on('value', (snap) => {
|
|
241
|
+
const plays = snap.val() || {};
|
|
242
|
+
// Merge with local fallback
|
|
243
|
+
const local = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
244
|
+
const merged = { ...local, ...plays };
|
|
245
|
+
localStorage.setItem('reaper_game_plays', JSON.stringify(merged));
|
|
246
|
+
callback(merged);
|
|
247
|
+
});
|
|
248
|
+
} catch (e) {
|
|
249
|
+
const local = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
250
|
+
callback(local);
|
|
251
|
+
}
|
|
252
|
+
} else {
|
|
253
|
+
const local = JSON.parse(localStorage.getItem('reaper_game_plays') || '{}');
|
|
254
|
+
callback(local);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
212
258
|
async banUser(username) {
|
|
213
259
|
if (!username || username === 'owner') return;
|
|
214
260
|
|
|
@@ -404,6 +404,132 @@
|
|
|
404
404
|
this.autoShield = enabled;
|
|
405
405
|
localStorage.setItem('reaper_auto_shield', enabled ? 'true' : 'false');
|
|
406
406
|
}
|
|
407
|
+
|
|
408
|
+
setAutoDecoy(enabled) {
|
|
409
|
+
this.autoDecoyOnScan = enabled;
|
|
410
|
+
localStorage.setItem('reaper_auto_decoy_trap', enabled ? 'true' : 'false');
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
triggerSurveillanceHoneypot(spyName = "School Filter Probe") {
|
|
414
|
+
if (this.isDecoyActive) return;
|
|
415
|
+
this.isDecoyActive = true;
|
|
416
|
+
|
|
417
|
+
// 1. If currently playing a game, pause and close the game player
|
|
418
|
+
if (window.app && typeof window.app.closePlayer === 'function' && window.app.isPlayingGame) {
|
|
419
|
+
window.app.closePlayer();
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
this.originalTitle = document.title;
|
|
423
|
+
document.title = "Module 3: Cellular Biology & Genetics โ Student Notes";
|
|
424
|
+
|
|
425
|
+
let link = document.querySelector("link[rel*='icon']");
|
|
426
|
+
if (!link) {
|
|
427
|
+
link = document.createElement('link');
|
|
428
|
+
link.rel = 'shortcut icon';
|
|
429
|
+
document.head.appendChild(link);
|
|
430
|
+
}
|
|
431
|
+
this.originalFavicon = link.href;
|
|
432
|
+
link.href = "https://ssl.gstatic.com/docs/doclist/images/drive_2022q3_32dp.png";
|
|
433
|
+
|
|
434
|
+
let decoyOverlay = document.getElementById('surveillance-decoy-overlay');
|
|
435
|
+
if (!decoyOverlay) {
|
|
436
|
+
decoyOverlay = document.createElement('div');
|
|
437
|
+
decoyOverlay.id = 'surveillance-decoy-overlay';
|
|
438
|
+
decoyOverlay.style.position = 'fixed';
|
|
439
|
+
decoyOverlay.style.inset = '0';
|
|
440
|
+
decoyOverlay.style.width = '100vw';
|
|
441
|
+
decoyOverlay.style.height = '100vh';
|
|
442
|
+
decoyOverlay.style.background = '#ffffff';
|
|
443
|
+
decoyOverlay.style.color = '#1f1f1f';
|
|
444
|
+
decoyOverlay.style.zIndex = '9999999';
|
|
445
|
+
decoyOverlay.style.overflowY = 'auto';
|
|
446
|
+
decoyOverlay.style.fontFamily = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif';
|
|
447
|
+
document.body.appendChild(decoyOverlay);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
decoyOverlay.style.display = 'block';
|
|
451
|
+
decoyOverlay.innerHTML = `
|
|
452
|
+
<!-- Threat Alert Banner -->
|
|
453
|
+
<div style="background: #1e293b; color: #f8fafc; padding: 0.75rem 1.5rem; display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #ef4444; box-shadow: 0 4px 12px rgba(0,0,0,0.15);">
|
|
454
|
+
<div style="display: flex; align-items: center; gap: 0.75rem;">
|
|
455
|
+
<span style="background: #ef4444; color: #fff; padding: 0.2rem 0.55rem; border-radius: 4px; font-weight: 800; font-size: 0.75rem; letter-spacing: 0.05em;">SURVEILLANCE SCAN INTERCEPTED</span>
|
|
456
|
+
<span style="font-size: 0.85rem; color: #cbd5e1;">Extension scan detected: <strong style="color: #fca5a5;">${spyName}</strong>. All games paused & safely swapped to educational study notes.</span>
|
|
457
|
+
</div>
|
|
458
|
+
<button onclick="if(window.reaperShield) window.reaperShield.exitSurveillanceDecoy()" style="background: #0284c7; color: #ffffff; border: none; padding: 0.45rem 1.1rem; border-radius: 6px; font-size: 0.82rem; font-weight: 700; cursor: pointer; transition: background 0.2s ease;">
|
|
459
|
+
โก RESUME REAPER HUB (SAFE)
|
|
460
|
+
</button>
|
|
461
|
+
</div>
|
|
462
|
+
|
|
463
|
+
<!-- Academic Portal Header -->
|
|
464
|
+
<header style="height: 60px; border-bottom: 1px solid #e2e8f0; display: flex; align-items: center; justify-content: space-between; padding: 0 2rem; background: #f8fafc;">
|
|
465
|
+
<div style="display: flex; align-items: center; gap: 1rem;">
|
|
466
|
+
<div style="font-weight: 800; color: #0f172a; font-size: 1.15rem; letter-spacing: -0.02em;">๐ National Student Learning Network</div>
|
|
467
|
+
<span style="font-size: 0.8rem; background: #e2e8f0; color: #475569; padding: 0.2rem 0.6rem; border-radius: 12px; font-weight: 600;">Biology 101-B</span>
|
|
468
|
+
</div>
|
|
469
|
+
<div style="font-size: 0.82rem; color: #64748b;">
|
|
470
|
+
Academic Year 2026 โข Term 1
|
|
471
|
+
</div>
|
|
472
|
+
</header>
|
|
473
|
+
|
|
474
|
+
<!-- Clean Study Notes Document Content (Zero Games / Zero Distractions) -->
|
|
475
|
+
<main style="max-width: 850px; margin: 2rem auto; padding: 0 1.5rem; line-height: 1.7; color: #334155;">
|
|
476
|
+
<div style="border-bottom: 2px solid #e2e8f0; padding-bottom: 1rem; margin-bottom: 1.75rem;">
|
|
477
|
+
<h1 style="font-size: 2rem; color: #0f172a; margin: 0 0 0.5rem 0; font-weight: 700;">Chapter 4: Principles of Cellular Respiration & Mitosis</h1>
|
|
478
|
+
<p style="color: #64748b; font-size: 0.9rem; margin: 0;">Author: Department of Biological Sciences โข Last reviewed: Yesterday</p>
|
|
479
|
+
</div>
|
|
480
|
+
|
|
481
|
+
<section style="margin-bottom: 2rem;">
|
|
482
|
+
<h2 style="font-size: 1.25rem; color: #1e293b; border-left: 4px solid #0284c7; padding-left: 0.75rem; margin-bottom: 0.75rem;">1. Introduction to Cellular Energy Systems</h2>
|
|
483
|
+
<p style="font-size: 0.95rem; margin-bottom: 1rem;">
|
|
484
|
+
Cellular respiration is the biochemical process through which organisms convert nutrients into adenosine triphosphate (ATP), subsequently releasing waste products. The catabolic pathways involved include glycolysis, the citric acid cycle (Krebs cycle), and oxidative phosphorylation.
|
|
485
|
+
</p>
|
|
486
|
+
<div style="background: #f1f5f9; border: 1px solid #cbd5e1; border-radius: 8px; padding: 1rem 1.25rem; font-size: 0.9rem; margin-bottom: 1rem;">
|
|
487
|
+
<strong style="color: #0f172a; display: block; margin-bottom: 0.35rem;">Key Chemical Equation:</strong>
|
|
488
|
+
<code>CโHโโOโ + 6Oโ โ 6COโ + 6HโO + ATP (~30โ32 ATP per glucose molecule)</code>
|
|
489
|
+
</div>
|
|
490
|
+
</section>
|
|
491
|
+
|
|
492
|
+
<section style="margin-bottom: 2rem;">
|
|
493
|
+
<h2 style="font-size: 1.25rem; color: #1e293b; border-left: 4px solid #0284c7; padding-left: 0.75rem; margin-bottom: 0.75rem;">2. Stages of Mitotic Division</h2>
|
|
494
|
+
<p style="font-size: 0.95rem; margin-bottom: 0.75rem;">
|
|
495
|
+
Mitosis is the phase of the cell cycle during which duplicated chromosomes are separated into two distinct nuclei. The continuous process is structured into four primary sub-phases:
|
|
496
|
+
</p>
|
|
497
|
+
<ul style="padding-left: 1.5rem; display: flex; flex-direction: column; gap: 0.5rem; font-size: 0.92rem;">
|
|
498
|
+
<li><strong>Prophase:</strong> Chromatin condenses into visible chromosomes; nucleolus disappears and the mitotic spindle fibers begin formation.</li>
|
|
499
|
+
<li><strong>Metaphase:</strong> Chromosomes align precisely along the equatorial metaphase plate, anchored by kinetochore microtubules.</li>
|
|
500
|
+
<li><strong>Anaphase:</strong> Sister chromatids are pulled apart toward opposite poles by the shortening spindle fibers.</li>
|
|
501
|
+
<li><strong>Telophase & Cytokinesis:</strong> Nuclear envelopes re-form around the separated chromatids, and the cytoplasm cleaves to yield two genetically identical diploid daughter cells.</li>
|
|
502
|
+
</ul>
|
|
503
|
+
</section>
|
|
504
|
+
|
|
505
|
+
<section style="margin-bottom: 2.5rem;">
|
|
506
|
+
<h2 style="font-size: 1.25rem; color: #1e293b; border-left: 4px solid #0284c7; padding-left: 0.75rem; margin-bottom: 0.75rem;">3. Recommended Study Questions</h2>
|
|
507
|
+
<ol style="padding-left: 1.5rem; display: flex; flex-direction: column; gap: 0.4rem; font-size: 0.92rem;">
|
|
508
|
+
<li>Explain how the electron transport chain generates a proton gradient across the inner mitochondrial membrane.</li>
|
|
509
|
+
<li>Contrast the chromosomal outcomes of mitosis versus meiosis in eukaryotic organisms.</li>
|
|
510
|
+
<li>Describe the regulatory role of cyclin-dependent kinases (CDKs) at cell cycle checkpoints.</li>
|
|
511
|
+
</ol>
|
|
512
|
+
</section>
|
|
513
|
+
</main>
|
|
514
|
+
`;
|
|
515
|
+
|
|
516
|
+
if (window.reaperSFX) window.reaperSFX.playClick();
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
exitSurveillanceDecoy() {
|
|
520
|
+
this.isDecoyActive = false;
|
|
521
|
+
const decoyOverlay = document.getElementById('surveillance-decoy-overlay');
|
|
522
|
+
if (decoyOverlay) decoyOverlay.style.display = 'none';
|
|
523
|
+
|
|
524
|
+
document.title = this.originalTitle || "REAPER // Games & Leaderboard";
|
|
525
|
+
const link = document.querySelector("link[rel*='icon']");
|
|
526
|
+
if (link && this.originalFavicon) {
|
|
527
|
+
link.href = this.originalFavicon;
|
|
528
|
+
}
|
|
529
|
+
if (window.app) {
|
|
530
|
+
window.app.showToast("Resumed Reaper Hub. Browser is secure.");
|
|
531
|
+
}
|
|
532
|
+
}
|
|
407
533
|
}
|
|
408
534
|
|
|
409
535
|
window.reaperShield = new ReaperSecurityShield();
|