alexrsworld 1.0.0 → 1.0.2
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/Apps/codeeditor.html +163 -0
- package/Games/WAflash/vex.html +1 -1
- package/Games/emulated/GBA/mariokartsupercircuit.html +30 -0
- package/Games/emulated/GBA/mother.html +30 -0
- package/Games/emulated/GBA/mother3.html +30 -0
- package/Games/emulated/GBA/pacmanworld.html +30 -0
- package/Games/emulated/GBA/sonicadvance.html +30 -0
- package/Games/emulated/GBA/sonicadvance2.html +30 -0
- package/Games/emulated/GBA/sonicadvance3.html +30 -0
- package/Games/emulated/GBA/superstarsaga.html +30 -0
- package/Games/emulated/N64/majorasmask.html +31 -0
- package/Games/emulated/N64/ocarinaoftime.html +31 -0
- package/Games/emulated/SNES/donkeykongcountry.html +31 -0
- package/Games/emulated/SNES/donkeykongcountry2.html +30 -0
- package/Games/emulated/SNES/donkeykongcountry3.html +31 -0
- package/Games/emulated/SNES/linktothepast.html +31 -0
- package/Games/ruffle/bcubed.html +40 -0
- package/Games/ruffle/hobo.html +41 -0
- package/Games/ruffle/maxdirtbike.html +40 -0
- package/Games/ruffle/raftwars2.html +40 -0
- package/Games/ruffle/useboxmen.html +40 -0
- package/Games/ruffle/whackyourboss.html +40 -0
- package/Games/ruffle/whackyourex.html +40 -0
- package/Games/singlefile.html +2322 -54
- package/Games/standalone/amongus.html +1 -0
- package/Games/standalone/bendy.html +141 -0
- package/Games/standalone/chess.html +204 -0
- package/Games/standalone/gdremastered.html +247 -0
- package/Games/standalone/highwayracer3D.html +50 -0
- package/Games/standalone/omnomrun.html +45 -0
- package/Games/standalone/retrobowlcollege.html +0 -65
- package/Games/standalone/slope2player.html +76 -0
- package/Games/standalone/soniccd.html +229 -0
- package/Games/standalone/station141.html +25 -8
- package/Games/standalone/tanukisunset.html +19 -0
- package/Games/standalone/ultrakill.html +108 -0
- package/games.json +130 -3
- package/iframetrue.json +2622 -0
- package/index.html +298 -147
- package/package.json +2 -2
- package/singlefilegames.json +7 -0
- package/singleiframetrue.json +2581 -0
- package/start.html +25 -0
- package/test.html +132 -0
- package/port.html +0 -0
package/index.html
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Alexr's World</title>
|
|
7
|
+
<link rel="icon" href="new logo.png">
|
|
7
8
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
|
8
9
|
<style>
|
|
9
10
|
|
|
@@ -817,6 +818,58 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
|
|
|
817
818
|
.tab-btn { display: inline-block; font-size: 0.95rem; }
|
|
818
819
|
.library-overlay .lib-header, .otherOverlay .lib-header { padding-left: 10px; padding-right: 10px; }
|
|
819
820
|
}
|
|
821
|
+
|
|
822
|
+
.lib-card.dragging {
|
|
823
|
+
opacity: 0.4;
|
|
824
|
+
transform: scale(0.95);
|
|
825
|
+
}
|
|
826
|
+
.lib-card.drag-over {
|
|
827
|
+
outline: 3px solid var(--ps-light-blue);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
|
|
831
|
+
/* ===== TV-ONLY FIX: DO NOT AFFECT DESKTOP ===== */
|
|
832
|
+
|
|
833
|
+
/* Samsung TV fails to render transformed flex rows */
|
|
834
|
+
body.tv-detected .carousel-container {
|
|
835
|
+
transform: none !important;
|
|
836
|
+
overflow: visible !important;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
/* Ensure carousel area has height */
|
|
840
|
+
body.tv-detected .main-stage {
|
|
841
|
+
min-height: 220px;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
/* Ensure cards are paintable */
|
|
845
|
+
body.tv-detected .card {
|
|
846
|
+
min-width: var(--card-size);
|
|
847
|
+
min-height: var(--card-size);
|
|
848
|
+
flex-shrink: 0;
|
|
849
|
+
visibility: visible;
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
/* Force images to paint on Tizen */
|
|
853
|
+
body.tv-detected .card img {
|
|
854
|
+
display: block;
|
|
855
|
+
width: 100%;
|
|
856
|
+
height: 100%;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
/* Tizen does not support flex gap */
|
|
860
|
+
body.tv-detected .social-icons a {
|
|
861
|
+
margin-right: 14px;
|
|
862
|
+
}
|
|
863
|
+
body.tv-detected .social-icons a:last-child {
|
|
864
|
+
margin-right: 0;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
/* Focus outline for TV */
|
|
868
|
+
body.tv-detected .card:focus {
|
|
869
|
+
outline: 5px solid var(--ps-light-blue);
|
|
870
|
+
outline-offset: 4px;
|
|
871
|
+
}
|
|
872
|
+
|
|
820
873
|
</style>
|
|
821
874
|
</head>
|
|
822
875
|
<body>
|
|
@@ -824,7 +877,7 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
|
|
|
824
877
|
|
|
825
878
|
<div class="top-bar">
|
|
826
879
|
<div class="site-title-group">
|
|
827
|
-
<div class="site-title"><img src="
|
|
880
|
+
<div class="site-title"><img src="new logo.png" alt="Alexr's World Logo"> Alexr's World</div>
|
|
828
881
|
</div>
|
|
829
882
|
|
|
830
883
|
<div class="nav-hint" id="navHint">Navigate with ←→ Arrow Keys or Mouse</div>
|
|
@@ -894,7 +947,10 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
|
|
|
894
947
|
</div>
|
|
895
948
|
|
|
896
949
|
<div id="other_changelog">
|
|
897
|
-
<p>12-14-25: Beta release</p>
|
|
950
|
+
<p>12-14-25 Beta V1: Beta release</p>
|
|
951
|
+
<p>12-15-25 Beta V2: Bug Fixes and implemented pokemon games and more!</p>
|
|
952
|
+
<p>12-17-25: Beta V3: More bug fixes and implement FNAF 4 Halloween and Ultimate Custom Night</p>
|
|
953
|
+
<p>12-18-25: V1.0: RELEASE! You can now drag and drop cards on menu. Added Donkey Kong Country 1-3.</p>
|
|
898
954
|
</div>
|
|
899
955
|
|
|
900
956
|
<div id="other_proxy" style="display:none;">
|
|
@@ -957,7 +1013,7 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
|
|
|
957
1013
|
</div>
|
|
958
1014
|
|
|
959
1015
|
<p style="font-size:0.85rem; color:#aaa; margin-top:15px;">
|
|
960
|
-
Sound effects include card hovers, selection, and
|
|
1016
|
+
Sound effects include card hovers, selection, and the PS4 Menu Music.
|
|
961
1017
|
</p>
|
|
962
1018
|
|
|
963
1019
|
<hr style="margin:20px 0; border-color:rgba(255,255,255,0.1);">
|
|
@@ -975,6 +1031,9 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
|
|
|
975
1031
|
</div>
|
|
976
1032
|
|
|
977
1033
|
<script>
|
|
1034
|
+
|
|
1035
|
+
let draggedLibTitle = null;
|
|
1036
|
+
|
|
978
1037
|
const carousel = document.getElementById('carousel');
|
|
979
1038
|
const infoArea = document.getElementById('infoArea');
|
|
980
1039
|
const libOverlay = document.getElementById('libraryOverlay');
|
|
@@ -986,9 +1045,7 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
|
|
|
986
1045
|
const gameSuggestionsDatalist = document.getElementById('game-suggestions');
|
|
987
1046
|
const subContent = document.querySelector('.sub-content');
|
|
988
1047
|
|
|
989
|
-
// Play select sound when interacting with the library/favorites search input
|
|
990
1048
|
if (libSearchInput) {
|
|
991
|
-
// Use focus and Enter; avoid click to prevent double-trigger (focus + click) on some browsers
|
|
992
1049
|
libSearchInput.addEventListener('focus', () => playSound('select'));
|
|
993
1050
|
libSearchInput.addEventListener('keydown', (e) => {
|
|
994
1051
|
if (e.key === 'Enter') {
|
|
@@ -1237,71 +1294,74 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
|
|
|
1237
1294
|
}
|
|
1238
1295
|
|
|
1239
1296
|
|
|
1240
|
-
|
|
1241
|
-
|
|
1297
|
+
async function loadGames() {
|
|
1298
|
+
loadFavorites();
|
|
1242
1299
|
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
allGamesData = Array.isArray(data) ? data : data.allGamesData || [];
|
|
1300
|
+
localStorage.removeItem('alexrGames_allGamesData');
|
|
1301
|
+
|
|
1302
|
+
try {
|
|
1303
|
+
const response = await fetch('https://raw.githubusercontent.com/dskjfoisjfsjio/alexrsworld/main/games.json?t=' + Date.now());
|
|
1304
|
+
if (!response.ok) {
|
|
1305
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
1306
|
+
}
|
|
1307
|
+
const data = await response.json();
|
|
1308
|
+
|
|
1309
|
+
allGamesData = Array.isArray(data) ? data : data.allGamesData || [];
|
|
1256
1310
|
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1311
|
+
allGamesData.sort((a, b) => {
|
|
1312
|
+
return a.title.localeCompare(b.title, undefined, {
|
|
1313
|
+
numeric: true,
|
|
1314
|
+
sensitivity: 'base'
|
|
1315
|
+
});
|
|
1316
|
+
});
|
|
1260
1317
|
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
}
|
|
1290
|
-
allGamesData = reordered;
|
|
1318
|
+
if (allGamesData.length === 0) {
|
|
1319
|
+
console.warn('games.json was empty or incorrectly formatted.');
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
try {
|
|
1323
|
+
const savedCustom = JSON.parse(localStorage.getItem('alexrGames_customOrder') || '[]');
|
|
1324
|
+
if (Array.isArray(savedCustom) && savedCustom.length) {
|
|
1325
|
+
const map = new Map(allGamesData.map(g => [g.title, g]));
|
|
1326
|
+
const reordered = [];
|
|
1327
|
+
savedCustom.forEach(title => {
|
|
1328
|
+
if (map.has(title)) {
|
|
1329
|
+
reordered.push(map.get(title));
|
|
1330
|
+
map.delete(title);
|
|
1331
|
+
}
|
|
1332
|
+
});
|
|
1333
|
+
for (const g of allGamesData) {
|
|
1334
|
+
if (map.has(g.title)) reordered.push(g);
|
|
1335
|
+
}
|
|
1336
|
+
allGamesData = reordered;
|
|
1337
|
+
} else {
|
|
1338
|
+
const savedRecent = JSON.parse(localStorage.getItem('alexrGames_recent') || '[]');
|
|
1339
|
+
if (Array.isArray(savedRecent) && savedRecent.length) {
|
|
1340
|
+
const map = new Map(allGamesData.map(g => [g.title, g]));
|
|
1341
|
+
const reordered = [];
|
|
1342
|
+
savedRecent.forEach(title => {
|
|
1343
|
+
if (map.has(title)) {
|
|
1344
|
+
reordered.push(map.get(title));
|
|
1345
|
+
map.delete(title);
|
|
1291
1346
|
}
|
|
1347
|
+
});
|
|
1348
|
+
for (const g of allGamesData) {
|
|
1349
|
+
if (map.has(g.title)) reordered.push(g);
|
|
1292
1350
|
}
|
|
1293
|
-
|
|
1294
|
-
console.warn('Failed to apply saved ordering:', e);
|
|
1351
|
+
allGamesData = reordered;
|
|
1295
1352
|
}
|
|
1296
|
-
|
|
1297
|
-
} catch(e) {
|
|
1298
|
-
console.error("Failed to fetch games.json. Please ensure the file exists and is valid JSON.", e);
|
|
1299
|
-
allGamesData = [];
|
|
1300
1353
|
}
|
|
1301
|
-
|
|
1302
|
-
|
|
1354
|
+
} catch (e) {
|
|
1355
|
+
console.warn('Failed to apply saved ordering:', e);
|
|
1303
1356
|
}
|
|
1304
1357
|
|
|
1358
|
+
} catch(e) {
|
|
1359
|
+
console.error("Failed to fetch games.json. Please ensure the file exists and is valid JSON.", e);
|
|
1360
|
+
allGamesData = [];
|
|
1361
|
+
}
|
|
1362
|
+
|
|
1363
|
+
buildLists();
|
|
1364
|
+
}
|
|
1305
1365
|
function buildLists() {
|
|
1306
1366
|
const firstSix = allGamesData.slice(0, 6);
|
|
1307
1367
|
|
|
@@ -1517,79 +1577,120 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
|
|
|
1517
1577
|
renderOverlayGrid();
|
|
1518
1578
|
}
|
|
1519
1579
|
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1580
|
+
function renderOverlayGrid() {
|
|
1581
|
+
libGrid.innerHTML = '';
|
|
1582
|
+
let gamesToShow = [];
|
|
1523
1583
|
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
});
|
|
1584
|
+
if (currentOverlayMode === 'library') {
|
|
1585
|
+
libraryTitle.textContent = 'All Games';
|
|
1586
|
+
gamesToShow = allGamesData;
|
|
1587
|
+
|
|
1588
|
+
const searchTerm = libSearchInput.value.toLowerCase().trim();
|
|
1589
|
+
|
|
1590
|
+
gamesToShow = gamesToShow.filter(game => {
|
|
1591
|
+
const matchesSearch = !searchTerm || game.title.toLowerCase().includes(searchTerm);
|
|
1592
|
+
const matchesCategory = currentCategoryFilter === 'All' || game.category === currentCategoryFilter;
|
|
1593
|
+
return matchesSearch && matchesCategory;
|
|
1594
|
+
});
|
|
1536
1595
|
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1596
|
+
} else {
|
|
1597
|
+
libraryTitle.textContent = 'Your Favorites';
|
|
1598
|
+
gamesToShow = allGamesData.filter(g => favoritesSet.has(g.title));
|
|
1599
|
+
|
|
1600
|
+
const searchTerm = libSearchInput.value.toLowerCase().trim();
|
|
1601
|
+
gamesToShow = gamesToShow.filter(game => {
|
|
1602
|
+
const matchesSearch = !searchTerm || game.title.toLowerCase().includes(searchTerm);
|
|
1603
|
+
const matchesCategory = currentCategoryFilter === 'All' || game.category === currentCategoryFilter;
|
|
1604
|
+
return matchesSearch && matchesCategory;
|
|
1605
|
+
});
|
|
1606
|
+
}
|
|
1548
1607
|
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
card.innerHTML = `
|
|
1553
|
-
<img src="${game.img || ''}" onerror="this.style.display='none'">
|
|
1554
|
-
<button class="lib-fav-btn" aria-label="${favoritesSet.has(game.title) ? 'Unfavorite' : 'Favorite'}">
|
|
1555
|
-
<i class="${favoritesSet.has(game.title) ? 'fas' : 'far'} fa-heart"></i>
|
|
1556
|
-
</button>
|
|
1557
|
-
<div class="lib-card-title">${game.title}</div>
|
|
1558
|
-
`;
|
|
1559
|
-
|
|
1560
|
-
const favBtn = card.querySelector('.lib-fav-btn');
|
|
1561
|
-
if (favBtn) {
|
|
1562
|
-
if (favoritesSet.has(game.title)) favBtn.classList.add('favorited');
|
|
1563
|
-
favBtn.addEventListener('click', (e) => {
|
|
1564
|
-
e.stopPropagation();
|
|
1565
|
-
if (favoritesSet.has(game.title)) {
|
|
1566
|
-
favoritesSet.delete(game.title);
|
|
1567
|
-
favBtn.classList.remove('favorited');
|
|
1568
|
-
const icon = favBtn.querySelector('i'); if (icon) icon.className = 'far fa-heart';
|
|
1569
|
-
favBtn.setAttribute('aria-label','Favorite');
|
|
1570
|
-
} else {
|
|
1571
|
-
favoritesSet.add(game.title);
|
|
1572
|
-
favBtn.classList.add('favorited');
|
|
1573
|
-
const icon = favBtn.querySelector('i'); if (icon) icon.className = 'fas fa-heart';
|
|
1574
|
-
favBtn.setAttribute('aria-label','Unfavorite');
|
|
1575
|
-
}
|
|
1576
|
-
saveFavorites();
|
|
1577
|
-
playSound('select');
|
|
1608
|
+
gamesToShow.forEach((game) => {
|
|
1609
|
+
const card = document.createElement('div');
|
|
1610
|
+
card.draggable = true;
|
|
1578
1611
|
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1612
|
+
card.addEventListener('dragstart', () => {
|
|
1613
|
+
draggedLibTitle = game.title;
|
|
1614
|
+
card.classList.add('dragging');
|
|
1615
|
+
playSound('hover');
|
|
1616
|
+
});
|
|
1617
|
+
|
|
1618
|
+
card.addEventListener('dragend', () => {
|
|
1619
|
+
draggedLibTitle = null;
|
|
1620
|
+
card.classList.remove('dragging');
|
|
1621
|
+
document.querySelectorAll('.lib-card').forEach(c => c.classList.remove('drag-over'));
|
|
1622
|
+
});
|
|
1623
|
+
|
|
1624
|
+
card.addEventListener('dragover', (e) => {
|
|
1625
|
+
e.preventDefault();
|
|
1626
|
+
card.classList.add('drag-over');
|
|
1627
|
+
});
|
|
1628
|
+
|
|
1629
|
+
card.addEventListener('dragleave', () => {
|
|
1630
|
+
card.classList.remove('drag-over');
|
|
1631
|
+
});
|
|
1632
|
+
|
|
1633
|
+
card.addEventListener('drop', (e) => {
|
|
1634
|
+
e.preventDefault();
|
|
1635
|
+
card.classList.remove('drag-over');
|
|
1636
|
+
|
|
1637
|
+
if (!draggedLibTitle || draggedLibTitle === game.title) return;
|
|
1638
|
+
|
|
1639
|
+
const fromIndex = allGamesData.findIndex(g => g.title === draggedLibTitle);
|
|
1640
|
+
const toIndex = allGamesData.findIndex(g => g.title === game.title);
|
|
1641
|
+
|
|
1642
|
+
if (fromIndex === -1 || toIndex === -1) return;
|
|
1643
|
+
|
|
1644
|
+
const [moved] = allGamesData.splice(fromIndex, 1);
|
|
1645
|
+
allGamesData.splice(toIndex, 0, moved);
|
|
1646
|
+
|
|
1647
|
+
playSound('select');
|
|
1648
|
+
saveGameOrder();
|
|
1649
|
+
renderOverlayGrid();
|
|
1650
|
+
});
|
|
1651
|
+
|
|
1652
|
+
card.className = 'lib-card';
|
|
1653
|
+
card.innerHTML = `
|
|
1654
|
+
<img src="${game.img || ''}" onerror="this.style.display='none'">
|
|
1655
|
+
<button class="lib-fav-btn" aria-label="${favoritesSet.has(game.title) ? 'Unfavorite' : 'Favorite'}">
|
|
1656
|
+
<i class="${favoritesSet.has(game.title) ? 'fas' : 'far'} fa-heart"></i>
|
|
1657
|
+
</button>
|
|
1658
|
+
<div class="lib-card-title">${game.title}</div>
|
|
1659
|
+
`;
|
|
1660
|
+
|
|
1661
|
+
const favBtn = card.querySelector('.lib-fav-btn');
|
|
1662
|
+
if (favBtn) {
|
|
1663
|
+
if (favoritesSet.has(game.title)) favBtn.classList.add('favorited');
|
|
1664
|
+
favBtn.addEventListener('click', (e) => {
|
|
1665
|
+
e.stopPropagation();
|
|
1666
|
+
if (favoritesSet.has(game.title)) {
|
|
1667
|
+
favoritesSet.delete(game.title);
|
|
1668
|
+
favBtn.classList.remove('favorited');
|
|
1669
|
+
const icon = favBtn.querySelector('i'); if (icon) icon.className = 'far fa-heart';
|
|
1670
|
+
favBtn.setAttribute('aria-label','Favorite');
|
|
1671
|
+
} else {
|
|
1672
|
+
favoritesSet.add(game.title);
|
|
1673
|
+
favBtn.classList.add('favorited');
|
|
1674
|
+
const icon = favBtn.querySelector('i'); if (icon) icon.className = 'fas fa-heart';
|
|
1675
|
+
favBtn.setAttribute('aria-label','Unfavorite');
|
|
1582
1676
|
}
|
|
1677
|
+
saveFavorites();
|
|
1678
|
+
playSound('select');
|
|
1583
1679
|
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
toggleOverlay(false);
|
|
1587
|
-
launchGame(game);
|
|
1588
|
-
};
|
|
1589
|
-
libGrid.appendChild(card);
|
|
1680
|
+
if (currentOverlayMode === 'favorites') renderOverlayGrid();
|
|
1681
|
+
try { updateFavoriteTile(displayList[selectedIndex]); } catch(e) {}
|
|
1590
1682
|
});
|
|
1591
1683
|
}
|
|
1592
1684
|
|
|
1685
|
+
card.onclick = () => {
|
|
1686
|
+
playSound('select');
|
|
1687
|
+
toggleOverlay(false);
|
|
1688
|
+
launchGame(game);
|
|
1689
|
+
};
|
|
1690
|
+
libGrid.appendChild(card);
|
|
1691
|
+
});
|
|
1692
|
+
}
|
|
1693
|
+
|
|
1593
1694
|
function updateSelection(index) {
|
|
1594
1695
|
if(isLibraryOpen || isOtherOpen || document.querySelector('.game-modal')) return;
|
|
1595
1696
|
if(index < 0) index = 0;
|
|
@@ -2190,33 +2291,38 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
|
|
|
2190
2291
|
|
|
2191
2292
|
loadCloak();
|
|
2192
2293
|
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
window.addEventListener('wheel', (e) => {
|
|
2196
|
-
try {
|
|
2197
|
-
if (isLibraryOpen || isOtherOpen) return;
|
|
2198
|
-
if (document.querySelector('.game-modal')) return;
|
|
2294
|
+
let lastWheelTime = 0;
|
|
2295
|
+
const wheelCooldownMs = 120;
|
|
2199
2296
|
|
|
2200
|
-
|
|
2201
|
-
|
|
2297
|
+
window.addEventListener('wheel', (e) => {
|
|
2298
|
+
try {
|
|
2299
|
+
if (isLibraryOpen || isOtherOpen) return;
|
|
2300
|
+
if (document.querySelector('.game-modal')) return;
|
|
2202
2301
|
|
|
2203
|
-
|
|
2204
|
-
|
|
2302
|
+
const now = Date.now();
|
|
2303
|
+
if (now - lastWheelTime < wheelCooldownMs) return;
|
|
2205
2304
|
|
|
2206
|
-
|
|
2305
|
+
const delta = e.deltaY || e.wheelDelta || 0;
|
|
2306
|
+
if (Math.abs(delta) < 5) return;
|
|
2207
2307
|
|
|
2208
|
-
|
|
2209
|
-
updateSelection(Math.min(displayList.length - 1, selectedIndex + 1));
|
|
2210
|
-
} else {
|
|
2211
|
-
updateSelection(Math.max(0, selectedIndex - 1));
|
|
2212
|
-
}
|
|
2308
|
+
if (e.preventDefault) e.preventDefault();
|
|
2213
2309
|
|
|
2214
|
-
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
}
|
|
2310
|
+
let nextIndex;
|
|
2311
|
+
if (delta > 0) {
|
|
2312
|
+
nextIndex = (selectedIndex >= displayList.length - 1) ? 0 : selectedIndex + 1;
|
|
2313
|
+
} else {
|
|
2314
|
+
nextIndex = (selectedIndex <= 0) ? displayList.length - 1 : selectedIndex - 1;
|
|
2315
|
+
}
|
|
2316
|
+
|
|
2317
|
+
updateSelection(nextIndex);
|
|
2318
|
+
|
|
2319
|
+
playSound('hover');
|
|
2320
|
+
|
|
2321
|
+
lastWheelTime = now;
|
|
2322
|
+
} catch (err) {
|
|
2323
|
+
console.warn('Wheel navigation error:', err);
|
|
2324
|
+
}
|
|
2325
|
+
}, { passive: false });
|
|
2220
2326
|
|
|
2221
2327
|
(function(){
|
|
2222
2328
|
let touchStartX = 0;
|
|
@@ -2296,6 +2402,51 @@ body.theme-red {
|
|
|
2296
2402
|
linear-gradient(135deg, #3a0000, #7a0000) !important;
|
|
2297
2403
|
--ps-light-blue: #ff4d4d !important;
|
|
2298
2404
|
}
|
|
2405
|
+
|
|
2406
|
+
.lib-card.dragging {
|
|
2407
|
+
opacity: 0.4;
|
|
2408
|
+
transform: scale(0.95);
|
|
2409
|
+
}
|
|
2410
|
+
.lib-card.drag-over {
|
|
2411
|
+
outline: 3px solid var(--ps-light-blue);
|
|
2412
|
+
}
|
|
2413
|
+
|
|
2414
|
+
|
|
2415
|
+
|
|
2416
|
+
body.tv-detected .carousel-container {
|
|
2417
|
+
transform: none !important;
|
|
2418
|
+
overflow: visible !important;
|
|
2419
|
+
}
|
|
2420
|
+
|
|
2421
|
+
body.tv-detected .main-stage {
|
|
2422
|
+
min-height: 220px;
|
|
2423
|
+
}
|
|
2424
|
+
|
|
2425
|
+
body.tv-detected .card {
|
|
2426
|
+
min-width: var(--card-size);
|
|
2427
|
+
min-height: var(--card-size);
|
|
2428
|
+
flex-shrink: 0;
|
|
2429
|
+
visibility: visible;
|
|
2430
|
+
}
|
|
2431
|
+
|
|
2432
|
+
body.tv-detected .card img {
|
|
2433
|
+
display: block;
|
|
2434
|
+
width: 100%;
|
|
2435
|
+
height: 100%;
|
|
2436
|
+
}
|
|
2437
|
+
|
|
2438
|
+
body.tv-detected .social-icons a {
|
|
2439
|
+
margin-right: 14px;
|
|
2440
|
+
}
|
|
2441
|
+
body.tv-detected .social-icons a:last-child {
|
|
2442
|
+
margin-right: 0;
|
|
2443
|
+
}
|
|
2444
|
+
|
|
2445
|
+
body.tv-detected .card:focus {
|
|
2446
|
+
outline: 5px solid var(--ps-light-blue);
|
|
2447
|
+
outline-offset: 4px;
|
|
2448
|
+
}
|
|
2449
|
+
|
|
2299
2450
|
</style>
|
|
2300
2451
|
|
|
2301
2452
|
</body>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alexrsworld",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "Released! Will improve overtime.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "echo \"Error: no test specified\" && exit 1"
|
package/singlefilegames.json
CHANGED
|
@@ -2231,6 +2231,10 @@
|
|
|
2231
2231
|
"category": "Arcade",
|
|
2232
2232
|
"iframe": false
|
|
2233
2233
|
},
|
|
2234
|
+
|
|
2235
|
+
|
|
2236
|
+
|
|
2237
|
+
|
|
2234
2238
|
{
|
|
2235
2239
|
"title": "Soundboard",
|
|
2236
2240
|
"img": "https://raw.githubusercontent.com/dskjfoisjfsjio/dskjfoisjfsjio.github.io/main/assets/game%20images/soundboard.png",
|
|
@@ -2264,3 +2268,6 @@
|
|
|
2264
2268
|
"iframe": false
|
|
2265
2269
|
}
|
|
2266
2270
|
]
|
|
2271
|
+
|
|
2272
|
+
|
|
2273
|
+
// DONT USE THIS
|