@ywkrlerche/richardwho 0.0.0-stage → 1.0.22

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/app.js ADDED
@@ -0,0 +1,336 @@
1
+ (() => {
2
+ "use strict";
3
+
4
+ const CFG = window.RUG_CONFIG || {};
5
+ const RECENT_KEY = "rug-recent";
6
+ const CLOCK_KEY = "rug-clock24";
7
+ const THEME_KEY = "rug-theme";
8
+ const MAX_RECENT = 6;
9
+
10
+ const TAG_EMOJI = {
11
+ Minecraft: "⛏️", Racing: "🏎️", Sports: "⚽", Shooter: "🎯", Horror: "👻", Clicker: "👆",
12
+ Cooking: "🍔", Puzzle: "🧩", Strategy: "🏰", IO: "🌐", Platformer: "🏃", Arcade: "👾",
13
+ };
14
+
15
+ const $ = (id) => document.getElementById(id);
16
+ const els = {
17
+ grid: $("grid"), recentGrid: $("recent-grid"), recentSection: $("recent-section"),
18
+ search: $("search"), chips: $("chips"), count: $("count"), empty: $("empty"),
19
+ allTitle: $("all-title"), footerCount: $("footer-count"),
20
+ home: $("home"), player: $("player"), frame: $("game-frame"), playerTitle: $("player-title"),
21
+ loader: $("loader"), loaderName: $("loader-name"), loaderThumb: $("loader-thumb"),
22
+ barFill: $("bar-fill"), loaderStatus: $("loader-status"), retryBtn: $("retry-btn"),
23
+ };
24
+
25
+ // localStorage can throw (private mode, blocked storage) - never let that break the page
26
+ const store = {
27
+ get(k, fallback) { try { const v = localStorage.getItem(k); return v === null ? fallback : JSON.parse(v); } catch { return fallback; } },
28
+ set(k, v) { try { localStorage.setItem(k, JSON.stringify(v)); } catch {} },
29
+ };
30
+
31
+ let games = [];
32
+ let byId = new Map();
33
+ let activeTag = "All";
34
+ let currentLoad = null; // { controller, id }
35
+
36
+ // ---------- Helpers ----------
37
+ function hash(str) {
38
+ let h = 2166136261;
39
+ for (let i = 0; i < str.length; i++) { h ^= str.charCodeAt(i); h = Math.imul(h, 16777619); }
40
+ return h >>> 0;
41
+ }
42
+ function thumbStyle(game) {
43
+ const h = hash(game.id);
44
+ const a = h % 360, b = (a + 40 + (h >> 9) % 80) % 360;
45
+ return `background: linear-gradient(135deg, hsl(${a} 75% 52%), hsl(${b} 80% 38%))`;
46
+ }
47
+ function initials(name) {
48
+ const words = name.replace(/\(.*?\)/g, "").split(/\s+/).filter(Boolean);
49
+ if (words.length === 1) return words[0].slice(0, 3).toUpperCase();
50
+ return words.slice(0, 3).map((w) => w[0]).join("").toUpperCase();
51
+ }
52
+ function fmtMB(bytes) {
53
+ const mb = bytes / 1048576;
54
+ return mb < 1 ? `${Math.max(1, Math.round(bytes / 1024))} KB` : `${mb < 10 ? mb.toFixed(1) : Math.round(mb)} MB`;
55
+ }
56
+ function gameUrls(game) {
57
+ const base = CFG.localBase
58
+ ? `${CFG.localBase}/${game.repo}`
59
+ : `https://cdn.jsdelivr.net/gh/${CFG.githubUser}/${game.repo}@${CFG.branch || "main"}`;
60
+ const url = `${base}/${game.path}`;
61
+ if (!game.parts) return [url];
62
+ return Array.from({ length: game.parts }, (_, i) => `${url}.part${i}`);
63
+ }
64
+ function escapeHtml(s) {
65
+ return s.replace(/[&<>"']/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }[c]));
66
+ }
67
+
68
+ // ---------- Rendering ----------
69
+ function cardHtml(game) {
70
+ return `<button class="card" type="button" data-id="${escapeHtml(game.id)}" title="${escapeHtml(game.name)}">
71
+ <div class="thumb" style="${thumbStyle(game)}">${escapeHtml(initials(game.name))}<span class="emoji">${TAG_EMOJI[game.tag] || "👾"}</span><span class="play">▶</span></div>
72
+ <div class="card-body">
73
+ <span class="card-name">${escapeHtml(game.name)}</span>
74
+ <span class="card-meta"><span>${escapeHtml(game.tag)}</span><span>${fmtMB(game.size)}</span></span>
75
+ </div>
76
+ </button>`;
77
+ }
78
+
79
+ function renderChips() {
80
+ const counts = { All: games.length };
81
+ games.forEach((g) => { counts[g.tag] = (counts[g.tag] || 0) + 1; });
82
+ const tags = ["All", ...Object.keys(counts).filter((t) => t !== "All").sort((a, b) => counts[b] - counts[a])];
83
+ els.chips.innerHTML = tags.map((t) =>
84
+ `<button class="chip" role="tab" type="button" data-tag="${escapeHtml(t)}" aria-selected="${t === activeTag}">${t === "All" ? "All" : (TAG_EMOJI[t] || "") + " " + escapeHtml(t)}<small>${counts[t]}</small></button>`
85
+ ).join("");
86
+ }
87
+
88
+ function renderGrid() {
89
+ const q = els.search.value.trim().toLowerCase();
90
+ const terms = q.split(/\s+/).filter(Boolean);
91
+ const list = games.filter((g) => {
92
+ if (activeTag !== "All" && g.tag !== activeTag) return false;
93
+ const hay = (g.name + " " + g.id + " " + g.tag).toLowerCase();
94
+ return terms.every((t) => hay.includes(t));
95
+ });
96
+ els.grid.innerHTML = list.map(cardHtml).join("");
97
+ els.empty.hidden = list.length > 0;
98
+ els.count.textContent = `${list.length} game${list.length === 1 ? "" : "s"}`;
99
+ els.allTitle.textContent = q ? `Results for “${els.search.value.trim()}”` : activeTag === "All" ? "All Games" : `${activeTag} Games`;
100
+ }
101
+
102
+ function renderRecent() {
103
+ const recent = store.get(RECENT_KEY, []).map((id) => byId.get(id)).filter(Boolean);
104
+ els.recentSection.hidden = recent.length === 0;
105
+ els.recentGrid.innerHTML = recent.map(cardHtml).join("");
106
+ }
107
+
108
+ function addRecent(id) {
109
+ const list = store.get(RECENT_KEY, []).filter((x) => x !== id);
110
+ list.unshift(id);
111
+ store.set(RECENT_KEY, list.slice(0, MAX_RECENT));
112
+ renderRecent();
113
+ }
114
+
115
+ // ---------- Game loading ----------
116
+ // jsDelivr serves .html as text/plain (so it can't be iframed directly), and caps files at 20 MB.
117
+ // So we fetch the file (or all its .partN pieces), join them, and write the HTML into a blank iframe.
118
+ // Writing (instead of a blob: URL) gives the game a normal https:// address, which many games need
119
+ // to work out paths (Unity, Ruffle/Flash and others crash on blob: URLs).
120
+ async function loadGame(game) {
121
+ stopGame();
122
+ const controller = new AbortController();
123
+ currentLoad = { controller, id: game.id };
124
+
125
+ els.playerTitle.textContent = game.name;
126
+ els.loaderName.textContent = game.name;
127
+ els.loaderThumb.setAttribute("style", thumbStyle(game));
128
+ els.loaderThumb.textContent = initials(game.name);
129
+ els.loader.hidden = false;
130
+ els.retryBtn.hidden = true;
131
+ els.barFill.style.width = "0%";
132
+ els.loaderStatus.textContent = "Connecting…";
133
+ document.title = `${game.name} · Richards Unblocked Games`;
134
+
135
+ const urls = gameUrls(game);
136
+ const loaded = new Array(urls.length).fill(0);
137
+ const total = game.size || 1;
138
+ const update = () => {
139
+ const got = loaded.reduce((a, b) => a + b, 0);
140
+ els.barFill.style.width = `${Math.min(100, (got / total) * 100).toFixed(1)}%`;
141
+ els.loaderStatus.textContent = `${fmtMB(got)} / ${fmtMB(total)}${urls.length > 1 ? ` · ${urls.length} parts` : ""}`;
142
+ };
143
+
144
+ try {
145
+ const pieces = await Promise.all(urls.map(async (url, i) => {
146
+ const res = await fetch(url, { signal: controller.signal });
147
+ if (!res.ok) throw new Error(`HTTP ${res.status} for ${url.split("/").pop()}`);
148
+ if (!res.body) { const b = await res.arrayBuffer(); loaded[i] = b.byteLength; update(); return [b]; }
149
+ const reader = res.body.getReader();
150
+ const chunks = [];
151
+ for (;;) {
152
+ const { done, value } = await reader.read();
153
+ if (done) break;
154
+ chunks.push(value);
155
+ loaded[i] += value.byteLength;
156
+ update();
157
+ }
158
+ return chunks;
159
+ }));
160
+ if (currentLoad?.id !== game.id) return;
161
+ els.loaderStatus.textContent = "Starting…";
162
+ const html = await new Blob(pieces.flat()).text();
163
+ if (currentLoad?.id !== game.id) return;
164
+ const doc = freshFrame().contentDocument;
165
+ doc.open();
166
+ doc.write(html);
167
+ doc.close();
168
+ els.loader.hidden = true;
169
+ hookFrameKeys();
170
+ try { els.frame.contentWindow.focus(); } catch {}
171
+ } catch (err) {
172
+ if (err.name === "AbortError") return;
173
+ console.error(err);
174
+ els.loaderStatus.textContent = `Couldn't load this game (${err.message}).`;
175
+ els.retryBtn.hidden = false;
176
+ }
177
+ }
178
+
179
+ function stopGame() {
180
+ if (!currentLoad) return;
181
+ currentLoad.controller.abort();
182
+ currentLoad = null;
183
+ freshFrame();
184
+ }
185
+
186
+ // Swap in a brand-new blank iframe (same attributes, including sandbox) so nothing from the last game lingers
187
+ function freshFrame() {
188
+ const fresh = els.frame.cloneNode(false);
189
+ els.frame.replaceWith(fresh);
190
+ els.frame = fresh;
191
+ return fresh;
192
+ }
193
+
194
+ // The blob: page is same-origin, so we can listen for the panic keys inside the game too
195
+ function hookFrameKeys() {
196
+ try {
197
+ const win = els.frame.contentWindow;
198
+ win.addEventListener("keydown", onKey, true);
199
+ } catch {}
200
+ }
201
+
202
+ // ---------- Routing (#play/<id>) so the back button works ----------
203
+ function route() {
204
+ const m = location.hash.match(/^#play\/(.+)$/);
205
+ const game = m && byId.get(decodeURIComponent(m[1]));
206
+ if (game) {
207
+ els.player.hidden = false;
208
+ document.body.classList.add("playing");
209
+ addRecent(game.id);
210
+ if (currentLoad?.id !== game.id) loadGame(game);
211
+ } else {
212
+ stopGame();
213
+ els.player.hidden = true;
214
+ document.body.classList.remove("playing");
215
+ document.title = "Richards Unblocked Games";
216
+ }
217
+ }
218
+ function play(id) { location.hash = `#play/${encodeURIComponent(id)}`; }
219
+ function goHome() {
220
+ if (location.hash.startsWith("#play/")) history.length > 1 ? history.back() : (location.hash = "");
221
+ }
222
+
223
+ // ---------- Utilities ----------
224
+ // When opened through index.svg the site runs inside a frame, so redirect the whole tab
225
+ function panic() {
226
+ const url = CFG.panicUrl || "https://classroom.google.com/";
227
+ try { window.top.location.replace(url); } catch { location.replace(url); }
228
+ }
229
+
230
+ function onKey(e) {
231
+ const keys = CFG.panicKeys || ["`", "]"];
232
+ if (keys.includes(e.key)) { e.preventDefault(); panic(); return; }
233
+ if (e.key === "/" && document.activeElement !== els.search && els.player.hidden) {
234
+ e.preventDefault(); els.search.focus();
235
+ }
236
+ if (e.key === "Escape" && document.activeElement === els.search) { els.search.value = ""; renderGrid(); els.search.blur(); }
237
+ }
238
+
239
+ function randomGame() {
240
+ const pool = activeTag === "All" ? games : games.filter((g) => g.tag === activeTag);
241
+ if (pool.length) play(pool[Math.floor(Math.random() * pool.length)].id);
242
+ }
243
+
244
+ function startClock() {
245
+ let is24 = store.get(CLOCK_KEY, false);
246
+ const timeEl = $("clock-time"), metaEl = $("clock-meta");
247
+ const tick = () => {
248
+ const d = new Date();
249
+ let h = d.getHours();
250
+ const m = String(d.getMinutes()).padStart(2, "0");
251
+ const s = String(d.getSeconds()).padStart(2, "0");
252
+ if (is24) { timeEl.textContent = `${String(h).padStart(2, "0")}:${m}:${s}`; metaEl.textContent = "24H"; }
253
+ else { const ap = h >= 12 ? "PM" : "AM"; h = h % 12 || 12; timeEl.textContent = `${h}:${m}:${s}`; metaEl.textContent = ap; }
254
+ };
255
+ $("clock").addEventListener("click", () => { is24 = !is24; store.set(CLOCK_KEY, is24); tick(); });
256
+ tick();
257
+ setInterval(tick, 1000);
258
+ }
259
+
260
+ function initTheme() {
261
+ const btn = $("theme-btn");
262
+ const apply = (t) => {
263
+ document.documentElement.dataset.theme = t;
264
+ btn.textContent = t === "dark" ? "🌙" : "☀️";
265
+ btn.title = t === "dark" ? "Switch to light mode" : "Switch to dark mode";
266
+ };
267
+ apply(document.documentElement.dataset.theme === "light" ? "light" : "dark");
268
+ btn.addEventListener("click", () => {
269
+ const next = document.documentElement.dataset.theme === "dark" ? "light" : "dark";
270
+ apply(next);
271
+ try { localStorage.setItem(THEME_KEY, next); } catch {}
272
+ });
273
+ }
274
+
275
+ // ---------- Wire up ----------
276
+ function bind() {
277
+ document.addEventListener("keydown", onKey, true);
278
+ const onCard = (e) => { const c = e.target.closest(".card"); if (c) play(c.dataset.id); };
279
+ els.grid.addEventListener("click", onCard);
280
+ els.recentGrid.addEventListener("click", onCard);
281
+ els.search.addEventListener("input", renderGrid);
282
+ els.chips.addEventListener("click", (e) => {
283
+ const chip = e.target.closest(".chip"); if (!chip) return;
284
+ activeTag = chip.dataset.tag;
285
+ els.chips.querySelectorAll(".chip").forEach((c) => c.setAttribute("aria-selected", c === chip));
286
+ renderGrid();
287
+ });
288
+ // index.svg adds a <base> pointing at jsDelivr, so a plain href="#" would leave the page
289
+ document.querySelector(".brand").addEventListener("click", (e) => {
290
+ e.preventDefault();
291
+ els.search.value = "";
292
+ renderGrid();
293
+ goHome();
294
+ window.scrollTo(0, 0);
295
+ });
296
+ $("clear-recent").addEventListener("click", () => { store.set(RECENT_KEY, []); renderRecent(); });
297
+ $("random-btn").addEventListener("click", randomGame);
298
+ $("panic-btn").addEventListener("click", panic);
299
+ $("panic-btn-2").addEventListener("click", panic);
300
+ $("back-btn").addEventListener("click", goHome);
301
+ $("reload-btn").addEventListener("click", () => {
302
+ const g = currentLoad && byId.get(currentLoad.id);
303
+ if (g) loadGame(g);
304
+ });
305
+ els.retryBtn.addEventListener("click", () => { const id = currentLoad?.id; if (id) loadGame(byId.get(id)); });
306
+ $("fullscreen-btn").addEventListener("click", () => {
307
+ const el = els.frame;
308
+ (el.requestFullscreen || el.webkitRequestFullscreen)?.call(el);
309
+ });
310
+ window.addEventListener("hashchange", route);
311
+ }
312
+
313
+ async function init() {
314
+ initTheme();
315
+ startClock();
316
+ bind();
317
+ try {
318
+ const res = await fetch("games.json", { cache: "no-cache" });
319
+ const data = await res.json();
320
+ games = data.games.slice().sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true }));
321
+ byId = new Map(games.map((g) => [g.id, g]));
322
+ } catch (err) {
323
+ console.error(err);
324
+ els.empty.hidden = false;
325
+ els.empty.textContent = "Couldn't load the game list (games.json).";
326
+ return;
327
+ }
328
+ els.footerCount.textContent = `${games.length} games`;
329
+ renderChips();
330
+ renderGrid();
331
+ renderRecent();
332
+ route();
333
+ }
334
+
335
+ init();
336
+ })();
package/config.js ADDED
@@ -0,0 +1,20 @@
1
+ // ===== Richards Unblocked Games: settings =====
2
+ // The only file you normally need to edit.
3
+ window.RUG_CONFIG = {
4
+ // Your GitHub username (the account that owns the rug-games-N repos)
5
+ githubUser: "Kingston5390",
6
+
7
+ // Branch the games live on. jsDelivr caches branches for up to 12h;
8
+ // use a tag like "v1" here if you want instant, permanent URLs.
9
+ branch: "main",
10
+
11
+ // Where the panic button sends you
12
+ panicUrl: "https://classroom.google.com/",
13
+
14
+ // Keys that trigger panic (KeyboardEvent.key values)
15
+ panicKeys: ["`", "]"],
16
+
17
+ // For local testing only: load games from a folder on a local server
18
+ // instead of jsDelivr, e.g. "/repos". Leave null when published.
19
+ localBase: null,
20
+ };
package/games.json ADDED
@@ -0,0 +1 @@
1
+ {"generated":"2026-10-21","games":[{"id":"1.12","name":"Eaglercraft 1.12","tag":"Minecraft","repo":"rug-games-1","path":"games/1.12.html","parts":2,"size":33734289},{"id":"1.12_WASM","name":"Eaglercraft 1.12 (WASM)","tag":"Minecraft","repo":"rug-games-1","path":"games/1.12_WASM.html","parts":2,"size":25065711},{"id":"1.5","name":"Eaglercraft 1.5","tag":"Minecraft","repo":"rug-games-1","path":"games/1.5.html","parts":0,"size":16523203},{"id":"1.8","name":"Eaglercraft 1.8","tag":"Minecraft","repo":"rug-games-1","path":"games/1.8.html","parts":0,"size":18459213},{"id":"1.8_WASM","name":"Eaglercraft 1.8 (WASM)","tag":"Minecraft","repo":"rug-games-1","path":"games/1.8_WASM.html","parts":0,"size":15132456},{"id":"10-minutes-till-dawn","name":"10 Minutes Till Dawn","tag":"Shooter","repo":"rug-games-1","path":"games/10-minutes-till-dawn.html","parts":2,"size":33455644},{"id":"12-mini-battles","name":"12 Mini Battles","tag":"Shooter","repo":"rug-games-1","path":"games/12-mini-battles.html","parts":0,"size":11745625},{"id":"1-on-1-soccer","name":"1 on 1 Soccer","tag":"Sports","repo":"rug-games-1","path":"games/1-on-1-soccer.html","parts":0,"size":7204081},{"id":"1-on-1-tennis","name":"1 on 1 Tennis","tag":"Sports","repo":"rug-games-1","path":"games/1-on-1-tennis.html","parts":0,"size":7670973},{"id":"1v1.lol","name":"1v1.LOL","tag":"Shooter","repo":"rug-games-1","path":"games/1v1.lol.html","parts":2,"size":38600173},{"id":"2048","name":"2048","tag":"Puzzle","repo":"rug-games-1","path":"games/2048.html","parts":0,"size":46342},{"id":"2048-cupcakes","name":"2048 Cupcakes","tag":"Puzzle","repo":"rug-games-1","path":"games/2048-cupcakes.html","parts":0,"size":2605649},{"id":"3D-flight-simulator","name":"3D Flight Simulator","tag":"Arcade","repo":"rug-games-1","path":"games/3D-flight-simulator.html","parts":3,"size":43867047},{"id":"3d-free-kick","name":"3D Free Kick","tag":"Sports","repo":"rug-games-1","path":"games/3d-free-kick.html","parts":0,"size":8390545},{"id":"8-ball-classic","name":"8 Ball Classic","tag":"Sports","repo":"rug-games-1","path":"games/8-ball-classic.html","parts":0,"size":8815098},{"id":"9007199254740992","name":"9007199254740992 (2048)","tag":"Puzzle","repo":"rug-games-1","path":"games/9007199254740992.html","parts":0,"size":131117},{"id":"agar-io-lite","name":"Agar IO Lite","tag":"IO","repo":"rug-games-1","path":"games/agar-io-lite.html","parts":0,"size":107555},{"id":"age-of-war","name":"Age of War","tag":"Shooter","repo":"rug-games-1","path":"games/age-of-war.html","parts":0,"size":11642663},{"id":"age-of-war-2","name":"Age of War 2","tag":"Shooter","repo":"rug-games-1","path":"games/age-of-war-2.html","parts":2,"size":22024655},{"id":"ages-of-conflict","name":"Ages of Conflict","tag":"Strategy","repo":"rug-games-1","path":"games/ages-of-conflict.html","parts":0,"size":16215246},{"id":"Alpha_1.2.6","name":"Eaglercraft Alpha 1.2.6","tag":"Minecraft","repo":"rug-games-1","path":"games/Alpha_1.2.6.html","parts":0,"size":8621988},{"id":"among-us","name":"Among Us","tag":"Arcade","repo":"rug-games-1","path":"games/among-us.html","parts":0,"size":7870674},{"id":"angry-birds","name":"Angry Birds","tag":"Arcade","repo":"rug-games-1","path":"games/angry-birds.html","parts":0,"size":14147188},{"id":"angry-birds-showdown","name":"Angry Birds Showdown","tag":"Arcade","repo":"rug-games-1","path":"games/angry-birds-showdown.html","parts":2,"size":25879779},{"id":"angry-birds-space","name":"Angry Birds Space","tag":"Arcade","repo":"rug-games-1","path":"games/angry-birds-space.html","parts":2,"size":21412951},{"id":"awesome-tanks","name":"Awesome Tanks","tag":"Shooter","repo":"rug-games-1","path":"games/awesome-tanks.html","parts":0,"size":9825398},{"id":"awesome-tanks-2","name":"Awesome Tanks 2","tag":"Shooter","repo":"rug-games-1","path":"games/awesome-tanks-2.html","parts":0,"size":13004415},{"id":"backrooms","name":"Backrooms","tag":"Horror","repo":"rug-games-1","path":"games/backrooms.html","parts":2,"size":24724337},{"id":"bacon-may-die","name":"Bacon May Die","tag":"Arcade","repo":"rug-games-1","path":"games/bacon-may-die.html","parts":0,"size":6131725},{"id":"bad-ice-cream","name":"Bad Ice Cream","tag":"Arcade","repo":"rug-games-1","path":"games/bad-ice-cream.html","parts":0,"size":9217334},{"id":"bad-ice-cream-2","name":"Bad Ice Cream 2","tag":"Arcade","repo":"rug-games-1","path":"games/bad-ice-cream-2.html","parts":0,"size":4313677},{"id":"bad-ice-cream-3","name":"Bad Ice Cream 3","tag":"Arcade","repo":"rug-games-1","path":"games/bad-ice-cream-3.html","parts":0,"size":5069609},{"id":"bad-parenting","name":"Bad Parenting","tag":"Arcade","repo":"rug-games-1","path":"games/bad-parenting.html","parts":3,"size":59294054},{"id":"bad-piggies","name":"Bad Piggies","tag":"Arcade","repo":"rug-games-1","path":"games/bad-piggies.html","parts":0,"size":10002011},{"id":"bad-time-simulator","name":"Bad Time Simulator","tag":"Puzzle","repo":"rug-games-1","path":"games/bad-time-simulator.html","parts":0,"size":4283299},{"id":"baldis-basics","name":"Baldis Basics","tag":"Horror","repo":"rug-games-1","path":"games/baldis-basics.html","parts":3,"size":49694490},{"id":"bank-robbery-2","name":"Bank Robbery 2","tag":"Arcade","repo":"rug-games-1","path":"games/bank-robbery-2.html","parts":2,"size":39360242},{"id":"bank-robbery-3","name":"Bank Robbery 3","tag":"Arcade","repo":"rug-games-1","path":"games/bank-robbery-3.html","parts":3,"size":41775908},{"id":"baseball-bros","name":"Baseball Bros","tag":"Sports","repo":"rug-games-1","path":"games/baseball-bros.html","parts":2,"size":21473671},{"id":"basketball-legends","name":"Basketball Legends","tag":"Sports","repo":"rug-games-1","path":"games/basketball-legends.html","parts":0,"size":8134654},{"id":"basketball-stars","name":"Basketball Stars","tag":"Sports","repo":"rug-games-1","path":"games/basketball-stars.html","parts":0,"size":11793563},{"id":"basket-bros","name":"Basket Bros","tag":"Sports","repo":"rug-games-1","path":"games/basket-bros.html","parts":0,"size":10892562},{"id":"basket-random","name":"Basket Random","tag":"Sports","repo":"rug-games-1","path":"games/basket-random.html","parts":0,"size":5055174},{"id":"Beta_1.3","name":"Eaglercraft Beta 1.3","tag":"Minecraft","repo":"rug-games-1","path":"games/Beta_1.3.html","parts":0,"size":4513066},{"id":"big-ice-tower-tiny-square","name":"Big Ice Tower Tiny Square","tag":"Platformer","repo":"rug-games-1","path":"games/big-ice-tower-tiny-square.html","parts":0,"size":2848224},{"id":"big-neon-tower-tiny-square","name":"Big Neon Tower Tiny Square","tag":"Platformer","repo":"rug-games-1","path":"games/big-neon-tower-tiny-square.html","parts":0,"size":5112619},{"id":"big-tower-tiny-square","name":"Big Tower Tiny Square","tag":"Platformer","repo":"rug-games-1","path":"games/big-tower-tiny-square.html","parts":0,"size":4131130},{"id":"big-tower-tiny-square-2","name":"Big Tower Tiny Square 2","tag":"Platformer","repo":"rug-games-1","path":"games/big-tower-tiny-square-2.html","parts":0,"size":6199013},{"id":"bitlife","name":"BitLife","tag":"Arcade","repo":"rug-games-1","path":"games/bitlife.html","parts":2,"size":27216225},{"id":"bit-planes","name":"Bit Planes","tag":"Arcade","repo":"rug-games-1","path":"games/bit-planes.html","parts":0,"size":757322},{"id":"blocky-snakes","name":"Blocky Snakes","tag":"Arcade","repo":"rug-games-1","path":"games/blocky-snakes.html","parts":0,"size":15580416},{"id":"bloons-TD","name":"Bloons TD","tag":"Strategy","repo":"rug-games-1","path":"games/bloons-TD.html","parts":0,"size":7512645},{"id":"bloons-TD-2","name":"Bloons TD 2","tag":"Strategy","repo":"rug-games-1","path":"games/bloons-TD-2.html","parts":0,"size":7852517},{"id":"bloons-TD-3","name":"Bloons TD 3","tag":"Strategy","repo":"rug-games-1","path":"games/bloons-TD-3.html","parts":0,"size":8665053},{"id":"bloons-TD-4","name":"Bloons TD 4","tag":"Strategy","repo":"rug-games-1","path":"games/bloons-TD-4.html","parts":0,"size":11144029},{"id":"bloons-TD-5","name":"Bloons TD 5","tag":"Strategy","repo":"rug-games-1","path":"games/bloons-TD-5.html","parts":2,"size":21674453},{"id":"bloxorz","name":"Bloxorz","tag":"Puzzle","repo":"rug-games-1","path":"games/bloxorz.html","parts":0,"size":9824296},{"id":"blumgi-racers","name":"Blumgi Racers","tag":"Racing","repo":"rug-games-1","path":"games/blumgi-racers.html","parts":0,"size":5060517},{"id":"blumgi-rocket","name":"Blumgi Rocket","tag":"Arcade","repo":"rug-games-1","path":"games/blumgi-rocket.html","parts":0,"size":3637881},{"id":"bob-the-robber","name":"Bob the Robber","tag":"Platformer","repo":"rug-games-1","path":"games/bob-the-robber.html","parts":0,"size":19089263},{"id":"bob-the-robber-2","name":"Bob the Robber 2","tag":"Platformer","repo":"rug-games-1","path":"games/bob-the-robber-2.html","parts":0,"size":12403762},{"id":"bob-the-robber-5","name":"Bob the Robber 5","tag":"Platformer","repo":"rug-games-1","path":"games/bob-the-robber-5.html","parts":0,"size":11899747},{"id":"bouncy-motors","name":"Bouncy Motors","tag":"Racing","repo":"rug-games-2","path":"games/bouncy-motors.html","parts":2,"size":36326027},{"id":"bow-masters","name":"Bow Masters","tag":"Shooter","repo":"rug-games-2","path":"games/bow-masters.html","parts":2,"size":27568357},{"id":"boxel-rebound","name":"Boxel Rebound","tag":"Arcade","repo":"rug-games-2","path":"games/boxel-rebound.html","parts":0,"size":2381221},{"id":"boxing-random","name":"Boxing Random","tag":"Sports","repo":"rug-games-2","path":"games/boxing-random.html","parts":0,"size":4675009},{"id":"breaking-the-bank","name":"Breaking the Bank","tag":"Platformer","repo":"rug-games-2","path":"games/breaking-the-bank.html","parts":0,"size":11042240},{"id":"bubble-shooter","name":"Bubble Shooter","tag":"Shooter","repo":"rug-games-2","path":"games/bubble-shooter.html","parts":0,"size":7076246},{"id":"burrito-bison-launcha-libre","name":"Burrito Bison Launcha Libre","tag":"Arcade","repo":"rug-games-2","path":"games/burrito-bison-launcha-libre.html","parts":2,"size":35918273},{"id":"candy-crush","name":"Candy Crush","tag":"Arcade","repo":"rug-games-2","path":"games/candy-crush.html","parts":0,"size":4528176},{"id":"capybara-clicker","name":"Capybara Clicker","tag":"Clicker","repo":"rug-games-2","path":"games/capybara-clicker.html","parts":0,"size":13528719},{"id":"car-drawing","name":"Car Drawing","tag":"Racing","repo":"rug-games-2","path":"games/car-drawing.html","parts":0,"size":17967878},{"id":"car-king-arena","name":"Car King Arena","tag":"Racing","repo":"rug-games-2","path":"games/car-king-arena.html","parts":0,"size":16532396},{"id":"chaos-faction-2","name":"Chaos Faction 2","tag":"Shooter","repo":"rug-games-2","path":"games/chaos-faction-2.html","parts":2,"size":23720180},{"id":"chess","name":"Chess","tag":"Puzzle","repo":"rug-games-2","path":"games/chess.html","parts":0,"size":6914845},{"id":"choppy-orc","name":"Choppy Orc","tag":"Arcade","repo":"rug-games-2","path":"games/choppy-orc.html","parts":0,"size":3718607},{"id":"circloO","name":"circloO","tag":"Arcade","repo":"rug-games-2","path":"games/circloO.html","parts":0,"size":3299500},{"id":"circloO-2","name":"circloO 2","tag":"Arcade","repo":"rug-games-2","path":"games/circloO-2.html","parts":0,"size":5841295},{"id":"clash-of-vikings","name":"Clash of Vikings","tag":"Strategy","repo":"rug-games-2","path":"games/clash-of-vikings.html","parts":0,"size":3788303},{"id":"cleanup-io","name":"Cleanup IO","tag":"IO","repo":"rug-games-2","path":"games/cleanup-io.html","parts":0,"size":17957174},{"id":"cluster-rush","name":"Cluster Rush","tag":"Arcade","repo":"rug-games-2","path":"games/cluster-rush.html","parts":0,"size":16052302},{"id":"cookie-clicker","name":"Cookie Clicker","tag":"Clicker","repo":"rug-games-2","path":"games/cookie-clicker.html","parts":0,"size":7648852},{"id":"coreball","name":"Coreball","tag":"Arcade","repo":"rug-games-2","path":"games/coreball.html","parts":0,"size":62683},{"id":"crazy-cars","name":"Crazy Cars","tag":"Racing","repo":"rug-games-2","path":"games/crazy-cars.html","parts":0,"size":13810085},{"id":"crazy-cattle-3D","name":"Crazy Cattle 3D","tag":"Arcade","repo":"rug-games-2","path":"games/crazy-cattle-3D.html","parts":3,"size":52035023},{"id":"crazy-crash-landing","name":"Crazy Crash Landing","tag":"Arcade","repo":"rug-games-2","path":"games/crazy-crash-landing.html","parts":2,"size":32835688},{"id":"crazy-motorcycle","name":"Crazy Motorcycle","tag":"Racing","repo":"rug-games-2","path":"games/crazy-motorcycle.html","parts":0,"size":16699988},{"id":"crossy-road","name":"Crossy Road","tag":"Racing","repo":"rug-games-2","path":"games/crossy-road.html","parts":0,"size":3250987},{"id":"cut-the-rope","name":"Cut the Rope","tag":"Puzzle","repo":"rug-games-2","path":"games/cut-the-rope.html","parts":2,"size":29922924},{"id":"cut-the-rope-2","name":"Cut the Rope 2","tag":"Puzzle","repo":"rug-games-2","path":"games/cut-the-rope-2.html","parts":2,"size":27412994},{"id":"cut-the-rope-holiday-gift","name":"Cut the Rope Holiday Gift","tag":"Puzzle","repo":"rug-games-2","path":"games/cut-the-rope-holiday-gift.html","parts":0,"size":11316954},{"id":"cut-the-rope-time-travel","name":"Cut the Rope Time Travel","tag":"Puzzle","repo":"rug-games-2","path":"games/cut-the-rope-time-travel.html","parts":2,"size":29681799},{"id":"dadish","name":"Dadish","tag":"Platformer","repo":"rug-games-2","path":"games/dadish.html","parts":0,"size":8869262},{"id":"dadish-2","name":"Dadish 2","tag":"Platformer","repo":"rug-games-2","path":"games/dadish-2.html","parts":0,"size":8945907},{"id":"dadish-3","name":"Dadish 3","tag":"Platformer","repo":"rug-games-2","path":"games/dadish-3.html","parts":0,"size":6197234},{"id":"deadly-descent","name":"Deadly Descent","tag":"Horror","repo":"rug-games-2","path":"games/deadly-descent.html","parts":2,"size":26719656},{"id":"death-chase","name":"Death Chase","tag":"Arcade","repo":"rug-games-2","path":"games/death-chase.html","parts":2,"size":33063078},{"id":"death-run-3D","name":"Death Run 3D","tag":"Platformer","repo":"rug-games-2","path":"games/death-run-3D.html","parts":0,"size":8436780},{"id":"demolition-derby-crash-racing","name":"Demolition Derby Crash Racing","tag":"Racing","repo":"rug-games-2","path":"games/demolition-derby-crash-racing.html","parts":2,"size":29012667},{"id":"doodle-jump","name":"Doodle Jump","tag":"Platformer","repo":"rug-games-2","path":"games/doodle-jump.html","parts":0,"size":422608},{"id":"draw-climber","name":"Draw Climber","tag":"Arcade","repo":"rug-games-2","path":"games/draw-climber.html","parts":0,"size":1830296},{"id":"dreadhead-parkour","name":"Dreadhead Parkour","tag":"Platformer","repo":"rug-games-2","path":"games/dreadhead-parkour.html","parts":0,"size":8032920},{"id":"drift-boss","name":"Drift Boss","tag":"Racing","repo":"rug-games-2","path":"games/drift-boss.html","parts":0,"size":8989853},{"id":"drift-hunters-pro","name":"Drift Hunters Pro","tag":"Racing","repo":"rug-games-2","path":"games/drift-hunters-pro.html","parts":3,"size":56784308},{"id":"drive-mad","name":"Drive Mad","tag":"Racing","repo":"rug-games-2","path":"games/drive-mad.html","parts":0,"size":4999037},{"id":"duck-life","name":"Duck Life","tag":"Arcade","repo":"rug-games-2","path":"games/duck-life.html","parts":0,"size":8590717},{"id":"duck-life-2","name":"Duck Life 2","tag":"Arcade","repo":"rug-games-2","path":"games/duck-life-2.html","parts":0,"size":9415925},{"id":"duck-life-3","name":"Duck Life 3","tag":"Arcade","repo":"rug-games-2","path":"games/duck-life-3.html","parts":0,"size":14855224},{"id":"duck-life-4","name":"Duck Life 4","tag":"Arcade","repo":"rug-games-2","path":"games/duck-life-4.html","parts":0,"size":18711049},{"id":"duck-life-5","name":"Duck Life 5","tag":"Arcade","repo":"rug-games-2","path":"games/duck-life-5.html","parts":0,"size":14093313},{"id":"ducklings-io","name":"Ducklings IO","tag":"IO","repo":"rug-games-2","path":"games/ducklings-io.html","parts":0,"size":10003334},{"id":"eagle-ride","name":"Eagle Ride","tag":"Arcade","repo":"rug-games-2","path":"games/eagle-ride.html","parts":0,"size":14031747},{"id":"earn-to-die","name":"Earn to Die","tag":"Arcade","repo":"rug-games-2","path":"games/earn-to-die.html","parts":0,"size":12081965},{"id":"earn-to-die-2","name":"Earn to Die 2","tag":"Arcade","repo":"rug-games-2","path":"games/earn-to-die-2.html","parts":0,"size":16772153},{"id":"eggy-car","name":"Eggy Car","tag":"Racing","repo":"rug-games-2","path":"games/eggy-car.html","parts":0,"size":6784286},{"id":"elastic-face","name":"Elastic Face","tag":"Arcade","repo":"rug-games-2","path":"games/elastic-face.html","parts":0,"size":655762},{"id":"escape-road","name":"Escape Road","tag":"Racing","repo":"rug-games-2","path":"games/escape-road.html","parts":2,"size":37332659},{"id":"escape-road-2","name":"Escape Road 2","tag":"Racing","repo":"rug-games-2","path":"games/escape-road-2.html","parts":2,"size":33569947},{"id":"escape-road-3","name":"Escape Road 3","tag":"Racing","repo":"rug-games-2","path":"games/escape-road-3.html","parts":3,"size":41406961},{"id":"escaping-the-prison","name":"Escaping the Prison","tag":"Arcade","repo":"rug-games-3","path":"games/escaping-the-prison.html","parts":0,"size":19784328},{"id":"eugenes-life","name":"Eugenes Life","tag":"Arcade","repo":"rug-games-3","path":"games/eugenes-life.html","parts":2,"size":35494713},{"id":"evil-glitch","name":"Evil Glitch","tag":"Arcade","repo":"rug-games-3","path":"games/evil-glitch.html","parts":0,"size":33033},{"id":"fancy-pants-adventure","name":"Fancy Pants Adventure","tag":"Platformer","repo":"rug-games-3","path":"games/fancy-pants-adventure.html","parts":0,"size":9096894},{"id":"fancy-pants-adventure-2","name":"Fancy Pants Adventure 2","tag":"Platformer","repo":"rug-games-3","path":"games/fancy-pants-adventure-2.html","parts":2,"size":21462423},{"id":"fireblob","name":"Fireblob","tag":"Arcade","repo":"rug-games-3","path":"games/fireblob.html","parts":0,"size":1718281},{"id":"fireboy-and-watergirl","name":"Fireboy and Watergirl","tag":"Platformer","repo":"rug-games-3","path":"games/fireboy-and-watergirl.html","parts":0,"size":9279226},{"id":"fireboy-and-watergirl-2","name":"Fireboy and Watergirl 2","tag":"Platformer","repo":"rug-games-3","path":"games/fireboy-and-watergirl-2.html","parts":0,"size":9720912},{"id":"fireboy-and-watergirl-3","name":"Fireboy and Watergirl 3","tag":"Platformer","repo":"rug-games-3","path":"games/fireboy-and-watergirl-3.html","parts":0,"size":9490651},{"id":"fireboy-and-watergirl-4","name":"Fireboy and Watergirl 4","tag":"Platformer","repo":"rug-games-3","path":"games/fireboy-and-watergirl-4.html","parts":0,"size":9214888},{"id":"flappy-bird","name":"Flappy Bird","tag":"Arcade","repo":"rug-games-3","path":"games/flappy-bird.html","parts":0,"size":4341092},{"id":"fleeing-the-complex","name":"Fleeing the Complex","tag":"Platformer","repo":"rug-games-3","path":"games/fleeing-the-complex.html","parts":3,"size":49326730},{"id":"flood-runner-2","name":"Flood Runner 2","tag":"Platformer","repo":"rug-games-3","path":"games/flood-runner-2.html","parts":0,"size":9256313},{"id":"flood-runner-3","name":"Flood Runner 3","tag":"Platformer","repo":"rug-games-3","path":"games/flood-runner-3.html","parts":0,"size":11490761},{"id":"flood-runner-4","name":"Flood Runner 4","tag":"Platformer","repo":"rug-games-3","path":"games/flood-runner-4.html","parts":0,"size":13896641},{"id":"fnaf","name":"FNAF","tag":"Horror","repo":"rug-games-3","path":"games/fnaf.html","parts":0,"size":19627678},{"id":"fnaf-2","name":"FNAF 2","tag":"Horror","repo":"rug-games-3","path":"games/fnaf-2.html","parts":2,"size":26368271},{"id":"fnaf-3","name":"FNAF 3","tag":"Horror","repo":"rug-games-3","path":"games/fnaf-3.html","parts":2,"size":26263694},{"id":"fnaf-4","name":"FNAF 4","tag":"Horror","repo":"rug-games-3","path":"games/fnaf-4.html","parts":2,"size":23273034},{"id":"fnaf-sister-location","name":"FNAF Sister Location","tag":"Horror","repo":"rug-games-3","path":"games/fnaf-sister-location.html","parts":3,"size":58482639},{"id":"football-bros","name":"Football Bros","tag":"Sports","repo":"rug-games-3","path":"games/football-bros.html","parts":0,"size":17513036},{"id":"football-legends","name":"Football Legends","tag":"Sports","repo":"rug-games-3","path":"games/football-legends.html","parts":0,"size":3645415},{"id":"free-rider-3","name":"Free Rider 3","tag":"Racing","repo":"rug-games-3","path":"games/free-rider-3.html","parts":0,"size":8174213},{"id":"friday-night-funkin","name":"Friday Night Funkin","tag":"Arcade","repo":"rug-games-3","path":"games/friday-night-funkin.html","parts":4,"size":60024665},{"id":"fruit-ninja","name":"Fruit Ninja","tag":"Arcade","repo":"rug-games-3","path":"games/fruit-ninja.html","parts":0,"size":8404819},{"id":"funny-battle","name":"Funny Battle","tag":"Shooter","repo":"rug-games-3","path":"games/funny-battle.html","parts":0,"size":10725522},{"id":"funny-battle-2","name":"Funny Battle 2","tag":"Shooter","repo":"rug-games-3","path":"games/funny-battle-2.html","parts":0,"size":15470320},{"id":"funny-mad-racing","name":"Funny Mad Racing","tag":"Racing","repo":"rug-games-3","path":"games/funny-mad-racing.html","parts":3,"size":55963926},{"id":"funny-shooter-2","name":"Funny Shooter 2","tag":"Shooter","repo":"rug-games-3","path":"games/funny-shooter-2.html","parts":3,"size":46416958},{"id":"geometry-dash","name":"Geometry Dash","tag":"Platformer","repo":"rug-games-3","path":"games/geometry-dash.html","parts":0,"size":13389848},{"id":"geometry-dash-lite","name":"Geometry Dash Lite","tag":"Platformer","repo":"rug-games-3","path":"games/geometry-dash-lite.html","parts":3,"size":56611066},{"id":"geometry-vibes","name":"Geometry Vibes","tag":"Platformer","repo":"rug-games-3","path":"games/geometry-vibes.html","parts":2,"size":25800070},{"id":"getaway-shootout","name":"Getaway Shootout","tag":"Shooter","repo":"rug-games-3","path":"games/getaway-shootout.html","parts":0,"size":8402032},{"id":"get-on-top","name":"Get on Top","tag":"Arcade","repo":"rug-games-3","path":"games/get-on-top.html","parts":0,"size":1558693},{"id":"gladi-hoppers","name":"Gladi Hoppers","tag":"Arcade","repo":"rug-games-3","path":"games/gladi-hoppers.html","parts":2,"size":37177723},{"id":"google-baseball","name":"Google Baseball","tag":"Sports","repo":"rug-games-3","path":"games/google-baseball.html","parts":0,"size":2951367},{"id":"google-dino","name":"Google Dino","tag":"Arcade","repo":"rug-games-3","path":"games/google-dino.html","parts":0,"size":115940},{"id":"granny","name":"Granny","tag":"Horror","repo":"rug-games-3","path":"games/granny.html","parts":3,"size":58315696},{"id":"granny-2","name":"Granny 2","tag":"Horror","repo":"rug-games-3","path":"games/granny-2.html","parts":3,"size":59689855},{"id":"guess-their-answer","name":"Guess Their Answer","tag":"Puzzle","repo":"rug-games-3","path":"games/guess-their-answer.html","parts":0,"size":14087517},{"id":"hanger-2","name":"Hanger 2","tag":"Arcade","repo":"rug-games-3","path":"games/hanger-2.html","parts":0,"size":3515346},{"id":"happy-wheels","name":"Happy Wheels","tag":"Racing","repo":"rug-games-3","path":"games/happy-wheels.html","parts":0,"size":12677623},{"id":"helix-jump","name":"Helix Jump","tag":"Platformer","repo":"rug-games-3","path":"games/helix-jump.html","parts":0,"size":10506701},{"id":"highway-traffic","name":"Highway Traffic","tag":"Racing","repo":"rug-games-3","path":"games/highway-traffic.html","parts":2,"size":36836247},{"id":"hill-climb-racing-lite","name":"Hill Climb Racing Lite","tag":"Racing","repo":"rug-games-4","path":"games/hill-climb-racing-lite.html","parts":0,"size":8742889},{"id":"hole-io","name":"Hole IO","tag":"IO","repo":"rug-games-4","path":"games/hole-io.html","parts":2,"size":24734327},{"id":"house-of-hazards","name":"House of Hazards","tag":"Arcade","repo":"rug-games-4","path":"games/house-of-hazards.html","parts":0,"size":17371118},{"id":"hover-racer-drive","name":"Hover Racer Drive","tag":"Racing","repo":"rug-games-4","path":"games/hover-racer-drive.html","parts":2,"size":21679173},{"id":"ice-dodo","name":"Ice Dodo","tag":"Arcade","repo":"rug-games-4","path":"games/ice-dodo.html","parts":0,"size":11925195},{"id":"idle-breakout","name":"Idle Breakout","tag":"Clicker","repo":"rug-games-4","path":"games/idle-breakout.html","parts":0,"size":2052721},{"id":"idle-dice","name":"Idle Dice","tag":"Clicker","repo":"rug-games-4","path":"games/idle-dice.html","parts":0,"size":8798496},{"id":"Indev","name":"Eaglercraft Indev","tag":"Minecraft","repo":"rug-games-4","path":"games/Indev.html","parts":0,"size":1140663},{"id":"infiltrating-the-airship","name":"Infiltrating the Airship","tag":"Platformer","repo":"rug-games-4","path":"games/infiltrating-the-airship.html","parts":3,"size":46585041},{"id":"iron-snout","name":"Iron Snout","tag":"Arcade","repo":"rug-games-4","path":"games/iron-snout.html","parts":0,"size":5950790},{"id":"jacksmith","name":"Jacksmith","tag":"Arcade","repo":"rug-games-4","path":"games/jacksmith.html","parts":0,"size":15289277},{"id":"jetpack-joyride","name":"Jetpack Joyride","tag":"Arcade","repo":"rug-games-4","path":"games/jetpack-joyride.html","parts":2,"size":21990169},{"id":"johnny-trigger","name":"Johnny Trigger","tag":"Shooter","repo":"rug-games-4","path":"games/johnny-trigger.html","parts":0,"size":1427111},{"id":"jumping-shell","name":"Jumping Shell","tag":"Platformer","repo":"rug-games-4","path":"games/jumping-shell.html","parts":0,"size":3253052},{"id":"karate-bros","name":"Karate Bros","tag":"Sports","repo":"rug-games-4","path":"games/karate-bros.html","parts":0,"size":11327593},{"id":"kart-bros","name":"Kart Bros","tag":"Racing","repo":"rug-games-4","path":"games/kart-bros.html","parts":2,"size":31163433},{"id":"kittytoy","name":"Kittytoy","tag":"Arcade","repo":"rug-games-4","path":"games/kittytoy.html","parts":0,"size":9271991},{"id":"learn-to-fly","name":"Learn to Fly","tag":"Arcade","repo":"rug-games-4","path":"games/learn-to-fly.html","parts":0,"size":7994335},{"id":"learn-to-fly-2","name":"Learn to Fly 2","tag":"Arcade","repo":"rug-games-4","path":"games/learn-to-fly-2.html","parts":0,"size":14044831},{"id":"learn-to-fly-3","name":"Learn to Fly 3","tag":"Arcade","repo":"rug-games-4","path":"games/learn-to-fly-3.html","parts":2,"size":30094951},{"id":"learn-to-fly-idle","name":"Learn to Fly Idle","tag":"Clicker","repo":"rug-games-4","path":"games/learn-to-fly-idle.html","parts":0,"size":11034269},{"id":"level-devil","name":"Level Devil","tag":"Platformer","repo":"rug-games-4","path":"games/level-devil.html","parts":0,"size":6800668},{"id":"little-alchemy-2","name":"Little Alchemy 2","tag":"Puzzle","repo":"rug-games-4","path":"games/little-alchemy-2.html","parts":2,"size":27437947},{"id":"madalin-stunt-cars-2","name":"Madalin Stunt Cars 2","tag":"Racing","repo":"rug-games-4","path":"games/madalin-stunt-cars-2.html","parts":3,"size":52469873},{"id":"madness-project-nexus","name":"Madness Project Nexus","tag":"Arcade","repo":"rug-games-4","path":"games/madness-project-nexus.html","parts":2,"size":26082566},{"id":"melon-playground","name":"Melon Playground","tag":"Arcade","repo":"rug-games-4","path":"games/melon-playground.html","parts":2,"size":21586797},{"id":"merge-round-racers","name":"Merge Round Racers","tag":"Racing","repo":"rug-games-4","path":"games/merge-round-racers.html","parts":0,"size":5026792},{"id":"minesweeper","name":"Minesweeper","tag":"Puzzle","repo":"rug-games-4","path":"games/minesweeper.html","parts":0,"size":1230108},{"id":"monkey-mart","name":"Monkey Mart","tag":"Cooking","repo":"rug-games-4","path":"games/monkey-mart.html","parts":0,"size":14041634},{"id":"monster-tracks","name":"Monster Tracks","tag":"Racing","repo":"rug-games-4","path":"games/monster-tracks.html","parts":0,"size":3505235},{"id":"motherload","name":"Motherload","tag":"Arcade","repo":"rug-games-4","path":"games/motherload.html","parts":0,"size":11773843},{"id":"moto-x3m","name":"Moto X3M","tag":"Racing","repo":"rug-games-4","path":"games/moto-x3m.html","parts":0,"size":11675580},{"id":"moto-x3m-2","name":"Moto X3m 2","tag":"Racing","repo":"rug-games-4","path":"games/moto-x3m-2.html","parts":0,"size":9837708},{"id":"moto-x3m-3","name":"Moto X3m 3","tag":"Racing","repo":"rug-games-4","path":"games/moto-x3m-3.html","parts":0,"size":10593685},{"id":"moto-x3m-pool-party","name":"Moto X3m Pool Party","tag":"Racing","repo":"rug-games-4","path":"games/moto-x3m-pool-party.html","parts":0,"size":5105520},{"id":"moto-x3m-spooky-land","name":"Moto X3m Spooky Land","tag":"Racing","repo":"rug-games-4","path":"games/moto-x3m-spooky-land.html","parts":0,"size":5945904},{"id":"moto-x3m-winter","name":"Moto X3m Winter","tag":"Racing","repo":"rug-games-4","path":"games/moto-x3m-winter.html","parts":0,"size":7994311},{"id":"murder","name":"Murder","tag":"Horror","repo":"rug-games-4","path":"games/murder.html","parts":0,"size":16620807},{"id":"noob-miner","name":"Noob Miner","tag":"Arcade","repo":"rug-games-4","path":"games/noob-miner.html","parts":0,"size":2599751},{"id":"openTTD","name":"OpenTTD","tag":"Strategy","repo":"rug-games-4","path":"games/openTTD.html","parts":3,"size":42416846},{"id":"opposite-day","name":"Opposite Day","tag":"Arcade","repo":"rug-games-4","path":"games/opposite-day.html","parts":0,"size":165415},{"id":"ovo","name":"OvO","tag":"Platformer","repo":"rug-games-4","path":"games/ovo.html","parts":0,"size":7269406},{"id":"ovo-2","name":"OvO 2","tag":"Platformer","repo":"rug-games-4","path":"games/ovo-2.html","parts":0,"size":2410032},{"id":"ovo-3-dimensions","name":"OvO 3 Dimensions","tag":"Platformer","repo":"rug-games-4","path":"games/ovo-3-dimensions.html","parts":2,"size":34517196},{"id":"pac-man","name":"Pac Man","tag":"Arcade","repo":"rug-games-4","path":"games/pac-man.html","parts":0,"size":3364269},{"id":"papas-bakeria","name":"Papa\u0027s Bakeria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-bakeria.html","parts":2,"size":26134049},{"id":"papas-burgeria","name":"Papa\u0027s Burgeria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-burgeria.html","parts":0,"size":11966742},{"id":"papas-cheeseria","name":"Papa\u0027s Cheeseria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-cheeseria.html","parts":2,"size":23333745},{"id":"papas-cupcakeria","name":"Papa\u0027s Cupcakeria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-cupcakeria.html","parts":0,"size":18768481},{"id":"papas-donuteria","name":"Papa\u0027s Donuteria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-donuteria.html","parts":2,"size":23162618},{"id":"papas-freezeria","name":"Papa\u0027s Freezeria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-freezeria.html","parts":0,"size":14503865},{"id":"papas-hot-doggeria","name":"Papa\u0027s Hot Doggeria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-hot-doggeria.html","parts":0,"size":18471173},{"id":"papas-pancakeria","name":"Papa\u0027s Pancakeria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-pancakeria.html","parts":0,"size":15007781},{"id":"papas-pastaria","name":"Papa\u0027s Pastaria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-pastaria.html","parts":2,"size":21470849},{"id":"papas-pizzeria","name":"Papa\u0027s Pizzeria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-pizzeria.html","parts":0,"size":10594161},{"id":"papas-scooperia","name":"Papa\u0027s Scooperia","tag":"Cooking","repo":"rug-games-4","path":"games/papas-scooperia.html","parts":2,"size":34498545},{"id":"papas-sushiria","name":"Papa\u0027s Sushiria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-sushiria.html","parts":2,"size":27658825},{"id":"papas-taco-mia","name":"Papa\u0027s Taco Mia","tag":"Cooking","repo":"rug-games-4","path":"games/papas-taco-mia.html","parts":0,"size":13996893},{"id":"papas-wingeria","name":"Papa\u0027s Wingeria","tag":"Cooking","repo":"rug-games-4","path":"games/papas-wingeria.html","parts":0,"size":17177374},{"id":"paper-io-2","name":"Paper IO 2","tag":"IO","repo":"rug-games-4","path":"games/paper-io-2.html","parts":0,"size":648963},{"id":"parking-fury","name":"Parking Fury","tag":"Arcade","repo":"rug-games-4","path":"games/parking-fury.html","parts":0,"size":6886906},{"id":"parking-fury-2","name":"Parking Fury 2","tag":"Arcade","repo":"rug-games-4","path":"games/parking-fury-2.html","parts":0,"size":8566580},{"id":"parking-fury-3","name":"Parking Fury 3","tag":"Arcade","repo":"rug-games-4","path":"games/parking-fury-3.html","parts":0,"size":8825152},{"id":"picos-school","name":"Picos School","tag":"Arcade","repo":"rug-games-5","path":"games/picos-school.html","parts":0,"size":9555915},{"id":"ping-pong-chaos","name":"Ping Pong Chaos","tag":"Sports","repo":"rug-games-5","path":"games/ping-pong-chaos.html","parts":0,"size":11189767},{"id":"pixel-speedrun","name":"Pixel Speedrun","tag":"Platformer","repo":"rug-games-5","path":"games/pixel-speedrun.html","parts":0,"size":1101368},{"id":"plants-vs-zombies","name":"Plants vs Zombies","tag":"Shooter","repo":"rug-games-5","path":"games/plants-vs-zombies.html","parts":2,"size":21035113},{"id":"plonky","name":"Plonky","tag":"Arcade","repo":"rug-games-5","path":"games/plonky.html","parts":0,"size":5380850},{"id":"polytrack","name":"Polytrack","tag":"Arcade","repo":"rug-games-5","path":"games/polytrack.html","parts":0,"size":10101883},{"id":"poor-bunny","name":"Poor Bunny","tag":"Arcade","repo":"rug-games-5","path":"games/poor-bunny.html","parts":0,"size":5969971},{"id":"pou","name":"Pou","tag":"Arcade","repo":"rug-games-5","path":"games/pou.html","parts":0,"size":11540151},{"id":"ragdoll-archers","name":"Ragdoll Archers","tag":"Shooter","repo":"rug-games-5","path":"games/ragdoll-archers.html","parts":0,"size":10074984},{"id":"ragdoll-hit","name":"Ragdoll Hit","tag":"Arcade","repo":"rug-games-5","path":"games/ragdoll-hit.html","parts":0,"size":19654523},{"id":"ragdoll-soccer","name":"Ragdoll Soccer","tag":"Sports","repo":"rug-games-5","path":"games/ragdoll-soccer.html","parts":2,"size":22469887},{"id":"red-ball-4-vol-1","name":"Red Ball 4 Vol 1","tag":"Platformer","repo":"rug-games-5","path":"games/red-ball-4-vol-1.html","parts":0,"size":19171782},{"id":"red-ball-4-vol-2","name":"Red Ball 4 Vol 2","tag":"Platformer","repo":"rug-games-5","path":"games/red-ball-4-vol-2.html","parts":0,"size":15233386},{"id":"red-ball-4-vol-3","name":"Red Ball 4 Vol 3","tag":"Platformer","repo":"rug-games-5","path":"games/red-ball-4-vol-3.html","parts":0,"size":14189317},{"id":"retro-bowl","name":"Retro Bowl","tag":"Sports","repo":"rug-games-5","path":"games/retro-bowl.html","parts":0,"size":7253470},{"id":"retro-bowl-college","name":"Retro Bowl College","tag":"Sports","repo":"rug-games-5","path":"games/retro-bowl-college.html","parts":0,"size":8215975},{"id":"retro-highway","name":"Retro Highway","tag":"Racing","repo":"rug-games-5","path":"games/retro-highway.html","parts":0,"size":4962847},{"id":"retro-ping-pong","name":"Retro Ping Pong","tag":"Sports","repo":"rug-games-5","path":"games/retro-ping-pong.html","parts":0,"size":3520774},{"id":"riddle-school","name":"Riddle School","tag":"Puzzle","repo":"rug-games-5","path":"games/riddle-school.html","parts":0,"size":7641687},{"id":"riddle-school-2","name":"Riddle School 2","tag":"Puzzle","repo":"rug-games-5","path":"games/riddle-school-2.html","parts":0,"size":8799087},{"id":"riddle-school-3","name":"Riddle School 3","tag":"Puzzle","repo":"rug-games-5","path":"games/riddle-school-3.html","parts":0,"size":17073847},{"id":"riddle-school-4","name":"Riddle School 4","tag":"Puzzle","repo":"rug-games-5","path":"games/riddle-school-4.html","parts":0,"size":15028503},{"id":"riddle-school-5","name":"Riddle School 5","tag":"Puzzle","repo":"rug-games-5","path":"games/riddle-school-5.html","parts":2,"size":26190663},{"id":"riddle-transfer","name":"Riddle Transfer","tag":"Puzzle","repo":"rug-games-5","path":"games/riddle-transfer.html","parts":2,"size":27665039},{"id":"riddle-transfer-2","name":"Riddle Transfer 2","tag":"Puzzle","repo":"rug-games-5","path":"games/riddle-transfer-2.html","parts":2,"size":31275743},{"id":"rocket-soccer-derby","name":"Rocket Soccer Derby","tag":"Racing","repo":"rug-games-5","path":"games/rocket-soccer-derby.html","parts":2,"size":37769861},{"id":"rooftop-run","name":"Rooftop Run","tag":"Platformer","repo":"rug-games-5","path":"games/rooftop-run.html","parts":2,"size":29317306},{"id":"rooftop-snipers","name":"Rooftop Snipers","tag":"Shooter","repo":"rug-games-5","path":"games/rooftop-snipers.html","parts":0,"size":15178876},{"id":"rooftop-snipers-2","name":"Rooftop Snipers 2","tag":"Shooter","repo":"rug-games-5","path":"games/rooftop-snipers-2.html","parts":0,"size":13579108},{"id":"run","name":"Run","tag":"Platformer","repo":"rug-games-5","path":"games/run.html","parts":0,"size":8895652},{"id":"run-2","name":"Run 2","tag":"Platformer","repo":"rug-games-5","path":"games/run-2.html","parts":0,"size":8097620},{"id":"run-3","name":"Run 3","tag":"Platformer","repo":"rug-games-5","path":"games/run-3.html","parts":2,"size":22339104},{"id":"sandbox-city","name":"Sandbox City","tag":"Arcade","repo":"rug-games-5","path":"games/sandbox-city.html","parts":4,"size":59809137},{"id":"sand-game","name":"Sand Game","tag":"Arcade","repo":"rug-games-5","path":"games/sand-game.html","parts":0,"size":60215},{"id":"short-life","name":"Short Life","tag":"Arcade","repo":"rug-games-5","path":"games/short-life.html","parts":2,"size":21868929},{"id":"six-cats-under","name":"Six Cats Under","tag":"Horror","repo":"rug-games-5","path":"games/six-cats-under.html","parts":0,"size":19298286},{"id":"slope","name":"Slope","tag":"Racing","repo":"rug-games-5","path":"games/slope.html","parts":2,"size":25985716},{"id":"slope-2-player","name":"Slope 2 Player","tag":"Racing","repo":"rug-games-5","path":"games/slope-2-player.html","parts":0,"size":10274649},{"id":"slope-3","name":"Slope 3","tag":"Racing","repo":"rug-games-5","path":"games/slope-3.html","parts":2,"size":33821420},{"id":"slow-roads","name":"Slow Roads","tag":"Racing","repo":"rug-games-5","path":"games/slow-roads.html","parts":0,"size":16960668},{"id":"sm-63","name":"Super Mario 63","tag":"Platformer","repo":"rug-games-5","path":"games/sm-63.html","parts":2,"size":27208114},{"id":"sm-64","name":"Super Mario 64","tag":"Platformer","repo":"rug-games-5","path":"games/sm-64.html","parts":0,"size":8376747},{"id":"snail-bob","name":"Snail Bob","tag":"Platformer","repo":"rug-games-5","path":"games/snail-bob.html","parts":0,"size":12933676},{"id":"snail-bob-2","name":"Snail Bob 2","tag":"Platformer","repo":"rug-games-5","path":"games/snail-bob-2.html","parts":0,"size":14855884},{"id":"snail-bob-3","name":"Snail Bob 3","tag":"Platformer","repo":"rug-games-5","path":"games/snail-bob-3.html","parts":0,"size":17257440},{"id":"snail-bob-4","name":"Snail Bob 4","tag":"Platformer","repo":"rug-games-5","path":"games/snail-bob-4.html","parts":0,"size":15314076},{"id":"snail-bob-5","name":"Snail Bob 5","tag":"Platformer","repo":"rug-games-5","path":"games/snail-bob-5.html","parts":2,"size":20188865},{"id":"snail-bob-6","name":"Snail Bob 6","tag":"Platformer","repo":"rug-games-5","path":"games/snail-bob-6.html","parts":2,"size":20122513},{"id":"snail-bob-7","name":"Snail Bob 7","tag":"Platformer","repo":"rug-games-5","path":"games/snail-bob-7.html","parts":0,"size":18413568},{"id":"snail-bob-8","name":"Snail Bob 8","tag":"Platformer","repo":"rug-games-5","path":"games/snail-bob-8.html","parts":2,"size":23072697},{"id":"snowball-io","name":"Snowball IO","tag":"IO","repo":"rug-games-5","path":"games/snowball-io.html","parts":2,"size":20721296},{"id":"snow-rider","name":"Snow Rider","tag":"Racing","repo":"rug-games-5","path":"games/snow-rider.html","parts":0,"size":19841418},{"id":"snow-road","name":"Snow Road","tag":"Racing","repo":"rug-games-5","path":"games/snow-road.html","parts":2,"size":22877945},{"id":"soccer-bros","name":"Soccer Bros","tag":"Sports","repo":"rug-games-5","path":"games/soccer-bros.html","parts":0,"size":13094977},{"id":"soccer-random","name":"Soccer Random","tag":"Sports","repo":"rug-games-5","path":"games/soccer-random.html","parts":0,"size":2675207},{"id":"spacebar-clicker","name":"Spacebar Clicker","tag":"Clicker","repo":"rug-games-5","path":"games/spacebar-clicker.html","parts":0,"size":108678},{"id":"space-is-key","name":"Space is Key","tag":"Platformer","repo":"rug-games-5","path":"games/space-is-key.html","parts":0,"size":8247101},{"id":"space-is-key-2","name":"Space is Key 2","tag":"Platformer","repo":"rug-games-5","path":"games/space-is-key-2.html","parts":0,"size":10156649},{"id":"space-waves","name":"Space Waves","tag":"Arcade","repo":"rug-games-6","path":"games/space-waves.html","parts":0,"size":14644555},{"id":"speed-stars","name":"Speed Stars","tag":"Sports","repo":"rug-games-6","path":"games/speed-stars.html","parts":2,"size":20209582},{"id":"sprunki","name":"Sprunki","tag":"Platformer","repo":"rug-games-6","path":"games/sprunki.html","parts":0,"size":18156899},{"id":"stack","name":"Stack","tag":"Puzzle","repo":"rug-games-6","path":"games/stack.html","parts":0,"size":628576},{"id":"stacktris","name":"Stacktris","tag":"Puzzle","repo":"rug-games-6","path":"games/stacktris.html","parts":0,"size":3746707},{"id":"state-io","name":"State IO","tag":"Strategy","repo":"rug-games-6","path":"games/state-io.html","parts":0,"size":4692450},{"id":"stealing-the-diamond","name":"Stealing the Diamond","tag":"Platformer","repo":"rug-games-6","path":"games/stealing-the-diamond.html","parts":2,"size":26361403},{"id":"stick-archers-battle","name":"Stick Archers Battle","tag":"Shooter","repo":"rug-games-6","path":"games/stick-archers-battle.html","parts":0,"size":4459162},{"id":"stick-fighter","name":"Stick Fighter","tag":"Arcade","repo":"rug-games-6","path":"games/stick-fighter.html","parts":0,"size":6044320},{"id":"stickman-hook","name":"Stickman Hook","tag":"Platformer","repo":"rug-games-6","path":"games/stickman-hook.html","parts":0,"size":4602862},{"id":"stick-merge","name":"Stick Merge","tag":"Arcade","repo":"rug-games-6","path":"games/stick-merge.html","parts":0,"size":8285402},{"id":"subway-surfers-beijing","name":"Subway Surfers Beijing","tag":"Arcade","repo":"rug-games-6","path":"games/subway-surfers-beijing.html","parts":2,"size":36793693},{"id":"subway-surfers-havana","name":"Subway Surfers Havana","tag":"Arcade","repo":"rug-games-6","path":"games/subway-surfers-havana.html","parts":2,"size":35386314},{"id":"subway-surfers-san-francisco","name":"Subway Surfers San Francisco","tag":"Arcade","repo":"rug-games-6","path":"games/subway-surfers-san-francisco.html","parts":2,"size":35307036},{"id":"super-bike-the-champion","name":"Super Bike the Champion","tag":"Racing","repo":"rug-games-6","path":"games/super-bike-the-champion.html","parts":3,"size":50189109},{"id":"superhot","name":"SUPERHOT","tag":"Shooter","repo":"rug-games-6","path":"games/superhot.html","parts":2,"size":26512163},{"id":"super-liquid-soccer","name":"Super Liquid Soccer","tag":"Sports","repo":"rug-games-6","path":"games/super-liquid-soccer.html","parts":0,"size":14432253},{"id":"super-star-car","name":"Super Star Car","tag":"Racing","repo":"rug-games-6","path":"games/super-star-car.html","parts":3,"size":58692918},{"id":"table-tennis-world-tour","name":"Table Tennis World Tour","tag":"Sports","repo":"rug-games-6","path":"games/table-tennis-world-tour.html","parts":0,"size":3918995},{"id":"tag","name":"Tag","tag":"Arcade","repo":"rug-games-6","path":"games/tag.html","parts":0,"size":4199014},{"id":"tanuki-sunset","name":"Tanuki Sunset","tag":"Arcade","repo":"rug-games-6","path":"games/tanuki-sunset.html","parts":2,"size":34902735},{"id":"tap-road","name":"Tap Road","tag":"Racing","repo":"rug-games-6","path":"games/tap-road.html","parts":3,"size":41732990},{"id":"temple-of-boom","name":"Temple of Boom","tag":"Arcade","repo":"rug-games-6","path":"games/temple-of-boom.html","parts":0,"size":6338884},{"id":"temple-run-2","name":"Temple Run 2","tag":"Platformer","repo":"rug-games-6","path":"games/temple-run-2.html","parts":0,"size":18769641},{"id":"territorial-io","name":"Territorial IO","tag":"Strategy","repo":"rug-games-6","path":"games/territorial-io.html","parts":0,"size":1407570},{"id":"tetrominoes","name":"Tetrominoes","tag":"Puzzle","repo":"rug-games-6","path":"games/tetrominoes.html","parts":0,"size":3021075},{"id":"the-impossible-quiz","name":"The Impossible Quiz","tag":"Puzzle","repo":"rug-games-6","path":"games/the-impossible-quiz.html","parts":0,"size":18040905},{"id":"the-impossible-quiz-2","name":"The Impossible Quiz 2","tag":"Puzzle","repo":"rug-games-6","path":"games/the-impossible-quiz-2.html","parts":2,"size":19966329},{"id":"there-is-no-g","name":"There is No G","tag":"Puzzle","repo":"rug-games-6","path":"games/there-is-no-g.html","parts":0,"size":6763354},{"id":"they-are-coming","name":"They Are Coming","tag":"Arcade","repo":"rug-games-6","path":"games/they-are-coming.html","parts":2,"size":27738745},{"id":"this-is-the-only-level","name":"This is the Only Level","tag":"Puzzle","repo":"rug-games-6","path":"games/this-is-the-only-level.html","parts":0,"size":8650025},{"id":"this-is-the-only-level-too","name":"This is the Only Level Too","tag":"Puzzle","repo":"rug-games-6","path":"games/this-is-the-only-level-too.html","parts":0,"size":9374061},{"id":"time-shooter-2","name":"Time Shooter 2","tag":"Shooter","repo":"rug-games-6","path":"games/time-shooter-2.html","parts":0,"size":13148205},{"id":"time-shooter-3","name":"Time Shooter 3","tag":"Shooter","repo":"rug-games-6","path":"games/time-shooter-3.html","parts":0,"size":11750551},{"id":"tiny-fishing","name":"Tiny Fishing","tag":"Arcade","repo":"rug-games-6","path":"games/tiny-fishing.html","parts":0,"size":2451912},{"id":"tomb-of-the-mask","name":"Tomb of the Mask","tag":"Platformer","repo":"rug-games-6","path":"games/tomb-of-the-mask.html","parts":2,"size":28058221},{"id":"trap-the-cat","name":"Trap the Cat","tag":"Puzzle","repo":"rug-games-6","path":"games/trap-the-cat.html","parts":0,"size":76414},{"id":"trivia-crack","name":"Trivia Crack","tag":"Puzzle","repo":"rug-games-6","path":"games/trivia-crack.html","parts":0,"size":2648550},{"id":"tube-jumpers","name":"Tube Jumpers","tag":"Platformer","repo":"rug-games-6","path":"games/tube-jumpers.html","parts":0,"size":10988583},{"id":"tunnel-rush","name":"Tunnel Rush","tag":"Racing","repo":"rug-games-6","path":"games/tunnel-rush.html","parts":0,"size":17360488},{"id":"unicycle-hero","name":"Unicycle Hero","tag":"Racing","repo":"rug-games-6","path":"games/unicycle-hero.html","parts":0,"size":2573448},{"id":"vex-4","name":"Vex 4","tag":"Platformer","repo":"rug-games-6","path":"games/vex-4.html","parts":0,"size":13885419},{"id":"vex-5","name":"Vex 5","tag":"Platformer","repo":"rug-games-6","path":"games/vex-5.html","parts":0,"size":15661199},{"id":"vex-6","name":"Vex 6","tag":"Platformer","repo":"rug-games-6","path":"games/vex-6.html","parts":0,"size":10042324},{"id":"vex-7","name":"Vex 7","tag":"Platformer","repo":"rug-games-6","path":"games/vex-7.html","parts":0,"size":14780477},{"id":"vex-8","name":"Vex 8","tag":"Platformer","repo":"rug-games-6","path":"games/vex-8.html","parts":0,"size":16785655},{"id":"vex-x3m","name":"Vex X3M","tag":"Platformer","repo":"rug-games-6","path":"games/vex-x3m.html","parts":0,"size":10255000},{"id":"vex-x3m-2","name":"Vex X3M 2","tag":"Platformer","repo":"rug-games-6","path":"games/vex-x3m-2.html","parts":0,"size":12721259},{"id":"volley-random","name":"Volley Random","tag":"Sports","repo":"rug-games-6","path":"games/volley-random.html","parts":0,"size":3853392},{"id":"war-the-knights","name":"War the Knights","tag":"Shooter","repo":"rug-games-6","path":"games/war-the-knights.html","parts":2,"size":30675072},{"id":"we-become-what-we-behold","name":"We Become What We Behold","tag":"Puzzle","repo":"rug-games-6","path":"games/we-become-what-we-behold.html","parts":0,"size":8045029},{"id":"wheelie-bike","name":"Wheelie Bike","tag":"Racing","repo":"rug-games-6","path":"games/wheelie-bike.html","parts":0,"size":2135099},{"id":"wheely","name":"Wheely","tag":"Racing","repo":"rug-games-6","path":"games/wheely.html","parts":0,"size":13461485},{"id":"wheely-2","name":"Wheely 2","tag":"Racing","repo":"rug-games-6","path":"games/wheely-2.html","parts":0,"size":18309829},{"id":"wheely-3","name":"Wheely 3","tag":"Racing","repo":"rug-games-6","path":"games/wheely-3.html","parts":0,"size":19852481},{"id":"wheely-4","name":"Wheely 4","tag":"Racing","repo":"rug-games-6","path":"games/wheely-4.html","parts":2,"size":25180921},{"id":"wheely-5","name":"Wheely 5","tag":"Racing","repo":"rug-games-6","path":"games/wheely-5.html","parts":2,"size":26122385},{"id":"wheely-6","name":"Wheely 6","tag":"Racing","repo":"rug-games-6","path":"games/wheely-6.html","parts":2,"size":22524929},{"id":"wheely-7","name":"Wheely 7","tag":"Racing","repo":"rug-games-7","path":"games/wheely-7.html","parts":2,"size":28625049},{"id":"wheely-8","name":"Wheely 8","tag":"Racing","repo":"rug-games-7","path":"games/wheely-8.html","parts":0,"size":16752313},{"id":"wordle-unlimited","name":"Wordle Unlimited","tag":"Puzzle","repo":"rug-games-7","path":"games/wordle-unlimited.html","parts":0,"size":184510},{"id":"worlds-hardest-game","name":"Worlds Hardest Game","tag":"Arcade","repo":"rug-games-7","path":"games/worlds-hardest-game.html","parts":0,"size":7796770},{"id":"worlds-hardest-game-2","name":"Worlds Hardest Game 2","tag":"Arcade","repo":"rug-games-7","path":"games/worlds-hardest-game-2.html","parts":0,"size":9974414},{"id":"worlds-hardest-game-3","name":"Worlds Hardest Game 3","tag":"Arcade","repo":"rug-games-7","path":"games/worlds-hardest-game-3.html","parts":0,"size":8672453},{"id":"wrestle-bros","name":"Wrestle Bros","tag":"Sports","repo":"rug-games-7","path":"games/wrestle-bros.html","parts":0,"size":12364650},{"id":"yohoho-io","name":"Yohoho IO","tag":"IO","repo":"rug-games-7","path":"games/yohoho-io.html","parts":0,"size":8480771},{"id":"zombie-rush","name":"Zombie Rush","tag":"Shooter","repo":"rug-games-7","path":"games/zombie-rush.html","parts":0,"size":2826740},{"id":"zrist","name":"Zrist","tag":"Arcade","repo":"rug-games-7","path":"games/zrist.html","parts":0,"size":1368514}]}
package/index.html ADDED
@@ -0,0 +1,98 @@
1
+ <!doctype html>
2
+ <html lang="en" data-theme="dark">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Richards Unblocked Games</title>
7
+ <meta name="description" content="Fast, lightweight game dashboard.">
8
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🕹️</text></svg>">
9
+ <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
10
+ <link rel="stylesheet" href="style.css">
11
+ <script>
12
+ // Apply saved theme before paint so there's no flash
13
+ try { document.documentElement.dataset.theme = localStorage.getItem("rug-theme") || "dark"; } catch (e) {}
14
+ </script>
15
+ </head>
16
+ <body>
17
+ <header class="topbar">
18
+ <a class="brand" href="#" aria-label="Home">
19
+ <span class="brand-mark">R</span>
20
+ <span class="brand-text">Richards <b>Unblocked</b> Games</span>
21
+ </a>
22
+
23
+ <button class="clock-island" id="clock" type="button" title="Click to switch 12h / 24h">
24
+ <span class="clock-dot"></span>
25
+ <span class="clock-time" id="clock-time">--:--</span>
26
+ <span class="clock-meta" id="clock-meta"></span>
27
+ </button>
28
+
29
+ <div class="actions">
30
+ <button class="icon-btn" id="random-btn" type="button" title="Random game">🎲<span class="label">Random</span></button>
31
+ <button class="icon-btn" id="theme-btn" type="button" title="Toggle theme">🌙</button>
32
+ <button class="icon-btn panic" id="panic-btn" type="button" title="Panic (` or ])">🚨<span class="label">Panic</span></button>
33
+ </div>
34
+ </header>
35
+
36
+ <main id="home">
37
+ <section class="hero">
38
+ <div class="search-wrap">
39
+ <svg class="search-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M10.5 3a7.5 7.5 0 0 1 5.96 12.06l4.24 4.24-1.42 1.42-4.24-4.24A7.5 7.5 0 1 1 10.5 3Zm0 2a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11Z"/></svg>
40
+ <input id="search" type="search" placeholder="Search games…" autocomplete="off" spellcheck="false" aria-label="Search games">
41
+ <kbd class="search-hint">/</kbd>
42
+ </div>
43
+ <div class="chips" id="chips" role="tablist" aria-label="Categories"></div>
44
+ </section>
45
+
46
+ <section class="row" id="recent-section" hidden>
47
+ <div class="row-head">
48
+ <h2>🕹️ Recently Played</h2>
49
+ <button class="text-btn" id="clear-recent" type="button">Clear</button>
50
+ </div>
51
+ <div class="grid recent" id="recent-grid"></div>
52
+ </section>
53
+
54
+ <section class="row">
55
+ <div class="row-head">
56
+ <h2 id="all-title">All Games</h2>
57
+ <span class="count" id="count"></span>
58
+ </div>
59
+ <div class="grid" id="grid"></div>
60
+ <p class="empty" id="empty" hidden>No games match that search.</p>
61
+ </section>
62
+ </main>
63
+
64
+ <section class="player" id="player" hidden aria-label="Game player">
65
+ <div class="player-bar">
66
+ <button class="icon-btn" id="back-btn" type="button" title="Back to games">←<span class="label">Games</span></button>
67
+ <h1 class="player-title" id="player-title"></h1>
68
+ <div class="actions">
69
+ <button class="icon-btn" id="reload-btn" type="button" title="Restart game">↻</button>
70
+ <button class="icon-btn" id="fullscreen-btn" type="button" title="Fullscreen">⛶</button>
71
+ <button class="icon-btn panic" id="panic-btn-2" type="button" title="Panic (` or ])">🚨</button>
72
+ </div>
73
+ </div>
74
+ <div class="stage">
75
+ <!-- sandbox without allow-top-navigation: stops games' "frame-busting" code from navigating the whole tab away -->
76
+ <iframe id="game-frame" title="Game" allow="fullscreen; autoplay; gamepad; pointer-lock" allowfullscreen
77
+ sandbox="allow-scripts allow-same-origin allow-forms allow-modals allow-pointer-lock allow-popups allow-popups-to-escape-sandbox allow-downloads allow-orientation-lock"></iframe>
78
+ <div class="loader" id="loader">
79
+ <div class="loader-card">
80
+ <div class="loader-thumb" id="loader-thumb"></div>
81
+ <p class="loader-name" id="loader-name"></p>
82
+ <div class="bar"><div class="bar-fill" id="bar-fill"></div></div>
83
+ <p class="loader-status" id="loader-status">Connecting…</p>
84
+ <button class="text-btn" id="retry-btn" type="button" hidden>Try again</button>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </section>
89
+
90
+ <footer class="footer">
91
+ <span>Press <kbd>`</kbd> or <kbd>]</kbd> to panic</span>
92
+ <span id="footer-count"></span>
93
+ </footer>
94
+
95
+ <script src="config.js"></script>
96
+ <script src="app.js"></script>
97
+ </body>
98
+ </html>
package/package.json CHANGED
@@ -1,6 +1,13 @@
1
1
  {
2
2
  "name": "@ywkrlerche/richardwho",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.22",
4
+ "description": "Math practice hub",
5
+ "license": "UNLICENSED",
6
+ "files": [
7
+ "index.html",
8
+ "style.css",
9
+ "app.js",
10
+ "config.js",
11
+ "games.json"
12
+ ]
13
+ }
package/style.css ADDED
@@ -0,0 +1,190 @@
1
+ :root {
2
+ --bg: #0b0d14;
3
+ --bg-2: #121522;
4
+ --card: #171a2a;
5
+ --card-hover: #1e2236;
6
+ --line: #262a40;
7
+ --text: #eef0fa;
8
+ --muted: #8b90ab;
9
+ --accent: #7c5cff;
10
+ --accent-2: #22d3ee;
11
+ --danger: #ff4d6d;
12
+ --island: #000;
13
+ --island-text: #fff;
14
+ --shadow: 0 10px 30px rgba(0, 0, 0, .35);
15
+ --radius: 16px;
16
+ color-scheme: dark;
17
+ }
18
+ [data-theme="light"] {
19
+ --bg: #f4f5fb;
20
+ --bg-2: #ffffff;
21
+ --card: #ffffff;
22
+ --card-hover: #f0f1fa;
23
+ --line: #e2e4f0;
24
+ --text: #14162b;
25
+ --muted: #646a88;
26
+ --accent: #6a46ff;
27
+ --accent-2: #0891b2;
28
+ --island: #14162b;
29
+ --shadow: 0 8px 24px rgba(20, 22, 43, .08);
30
+ color-scheme: light;
31
+ }
32
+
33
+ * { box-sizing: border-box; }
34
+ html, body { margin: 0; }
35
+ body {
36
+ background:
37
+ radial-gradient(1200px 500px at 10% -10%, color-mix(in srgb, var(--accent) 18%, transparent), transparent 60%),
38
+ radial-gradient(900px 400px at 100% 0%, color-mix(in srgb, var(--accent-2) 12%, transparent), transparent 60%),
39
+ var(--bg);
40
+ background-attachment: fixed;
41
+ color: var(--text);
42
+ font: 15px/1.45 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
43
+ min-height: 100vh;
44
+ display: flex;
45
+ flex-direction: column;
46
+ }
47
+ button { font: inherit; color: inherit; cursor: pointer; }
48
+ kbd {
49
+ font: 12px ui-monospace, Consolas, monospace;
50
+ padding: 1px 6px; border-radius: 6px;
51
+ border: 1px solid var(--line); background: var(--bg-2); color: var(--muted);
52
+ }
53
+ [hidden] { display: none !important; }
54
+
55
+ /* ---------- Top bar ---------- */
56
+ .topbar {
57
+ position: sticky; top: 0; z-index: 10;
58
+ display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 12px;
59
+ padding: 12px clamp(16px, 3vw, 32px);
60
+ background: color-mix(in srgb, var(--bg) 75%, transparent);
61
+ backdrop-filter: blur(14px);
62
+ border-bottom: 1px solid var(--line);
63
+ }
64
+ .brand { display: flex; align-items: center; gap: 10px; color: var(--text); text-decoration: none; min-width: 0; }
65
+ .brand-mark {
66
+ flex: none; width: 34px; height: 34px; border-radius: 10px;
67
+ display: grid; place-items: center; font-weight: 800; color: #fff;
68
+ background: linear-gradient(135deg, var(--accent), var(--accent-2));
69
+ box-shadow: 0 0 18px color-mix(in srgb, var(--accent) 50%, transparent);
70
+ }
71
+ .brand-text { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
72
+ .brand-text b { background: linear-gradient(90deg, var(--accent), var(--accent-2)); -webkit-background-clip: text; background-clip: text; color: transparent; }
73
+
74
+ .clock-island {
75
+ display: flex; align-items: center; gap: 10px;
76
+ padding: 8px 18px; border: 0; border-radius: 999px;
77
+ background: var(--island); color: var(--island-text);
78
+ box-shadow: var(--shadow), inset 0 0 0 1px rgba(255,255,255,.08);
79
+ transition: transform .2s cubic-bezier(.3,1.6,.5,1), padding .2s;
80
+ }
81
+ .clock-island:hover { transform: scale(1.04); padding-inline: 22px; }
82
+ .clock-island:active { transform: scale(.97); }
83
+ .clock-dot { width: 8px; height: 8px; border-radius: 50%; background: #34d399; box-shadow: 0 0 10px #34d399; }
84
+ .clock-time { font: 600 17px/1 ui-monospace, "SF Mono", Consolas, monospace; font-variant-numeric: tabular-nums; letter-spacing: .02em; }
85
+ .clock-meta { font-size: 12px; opacity: .6; }
86
+
87
+ .actions { display: flex; gap: 8px; justify-content: flex-end; }
88
+ .icon-btn {
89
+ display: inline-flex; align-items: center; gap: 6px;
90
+ height: 38px; padding: 0 12px; border-radius: 12px;
91
+ border: 1px solid var(--line); background: var(--bg-2);
92
+ transition: background .15s, border-color .15s, transform .1s;
93
+ }
94
+ .icon-btn:hover { background: var(--card-hover); border-color: color-mix(in srgb, var(--accent) 50%, var(--line)); }
95
+ .icon-btn:active { transform: translateY(1px); }
96
+ .icon-btn .label { font-size: 13px; font-weight: 600; }
97
+ .icon-btn.panic { border-color: color-mix(in srgb, var(--danger) 45%, var(--line)); }
98
+ .icon-btn.panic:hover { background: color-mix(in srgb, var(--danger) 18%, var(--bg-2)); }
99
+
100
+ /* ---------- Home ---------- */
101
+ main { flex: 1; width: 100%; max-width: 1400px; margin: 0 auto; padding: 24px clamp(16px, 3vw, 32px) 40px; }
102
+ .hero { display: grid; gap: 14px; margin-bottom: 26px; }
103
+ .search-wrap { position: relative; }
104
+ .search-icon { position: absolute; left: 16px; top: 50%; width: 20px; height: 20px; transform: translateY(-50%); fill: var(--muted); }
105
+ #search {
106
+ width: 100%; height: 54px; padding: 0 52px 0 48px;
107
+ border-radius: var(--radius); border: 1px solid var(--line);
108
+ background: var(--bg-2); color: var(--text); font-size: 16px; outline: none;
109
+ box-shadow: var(--shadow); transition: border-color .15s, box-shadow .15s;
110
+ }
111
+ #search:focus { border-color: var(--accent); box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 22%, transparent); }
112
+ #search::-webkit-search-cancel-button { display: none; }
113
+ .search-hint { position: absolute; right: 16px; top: 50%; transform: translateY(-50%); }
114
+
115
+ .chips { display: flex; gap: 8px; overflow-x: auto; scrollbar-width: none; padding-bottom: 2px; }
116
+ .chips::-webkit-scrollbar { display: none; }
117
+ .chip {
118
+ flex: none; padding: 6px 14px; border-radius: 999px;
119
+ border: 1px solid var(--line); background: var(--bg-2); color: var(--muted);
120
+ font-size: 13px; font-weight: 600;
121
+ }
122
+ .chip:hover { color: var(--text); }
123
+ .chip[aria-selected="true"] { background: var(--accent); border-color: var(--accent); color: #fff; }
124
+ .chip small { opacity: .7; font-weight: 500; margin-left: 4px; }
125
+
126
+ .row { margin-bottom: 30px; }
127
+ .row-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 12px; }
128
+ .row-head h2 { font-size: 18px; margin: 0; }
129
+ .count { color: var(--muted); font-size: 13px; }
130
+ .text-btn { border: 0; background: none; color: var(--muted); font-size: 13px; font-weight: 600; padding: 4px 6px; border-radius: 8px; }
131
+ .text-btn:hover { color: var(--text); background: var(--card-hover); }
132
+
133
+ .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 14px; }
134
+ .grid.recent { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); }
135
+
136
+ .card {
137
+ display: flex; flex-direction: column; text-align: left; padding: 0; overflow: hidden;
138
+ border: 1px solid var(--line); border-radius: var(--radius); background: var(--card);
139
+ transition: transform .15s, border-color .15s, box-shadow .15s;
140
+ content-visibility: auto; contain-intrinsic-size: 200px;
141
+ }
142
+ .card:hover, .card:focus-visible {
143
+ transform: translateY(-3px); outline: none;
144
+ border-color: color-mix(in srgb, var(--accent) 60%, var(--line));
145
+ box-shadow: 0 12px 28px color-mix(in srgb, var(--accent) 22%, transparent);
146
+ }
147
+ .thumb {
148
+ position: relative; aspect-ratio: 16 / 10; display: grid; place-items: center;
149
+ color: #fff; font-weight: 800; font-size: 34px; letter-spacing: -.02em;
150
+ text-shadow: 0 2px 12px rgba(0,0,0,.35); overflow: hidden;
151
+ }
152
+ .thumb::after {
153
+ content: ""; position: absolute; inset: 0;
154
+ background: radial-gradient(circle at 30% 20%, rgba(255,255,255,.28), transparent 55%);
155
+ }
156
+ .thumb .emoji { position: absolute; right: 10px; bottom: 6px; font-size: 22px; opacity: .9; text-shadow: none; }
157
+ .card .play { position: absolute; inset: 0; display: grid; place-items: center; background: rgba(0,0,0,.35); opacity: 0; transition: opacity .15s; z-index: 1; font-size: 30px; }
158
+ .card:hover .play { opacity: 1; }
159
+ .card-body { padding: 10px 12px 12px; display: grid; gap: 4px; }
160
+ .card-name { font-weight: 650; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
161
+ .card-meta { display: flex; justify-content: space-between; color: var(--muted); font-size: 12px; }
162
+ .empty { text-align: center; color: var(--muted); padding: 40px 0; }
163
+
164
+ /* ---------- Player ---------- */
165
+ .player { position: fixed; inset: 0; z-index: 20; display: flex; flex-direction: column; background: var(--bg); }
166
+ .player-bar { display: flex; align-items: center; gap: 12px; padding: 10px 16px; border-bottom: 1px solid var(--line); background: var(--bg-2); }
167
+ .player-title { flex: 1; margin: 0; font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
168
+ .stage { position: relative; flex: 1; background: #000; }
169
+ #game-frame { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; background: #000; }
170
+ .loader { position: absolute; inset: 0; display: grid; place-items: center; background: var(--bg); padding: 16px; }
171
+ .loader-card { width: min(360px, 100%); text-align: center; }
172
+ .loader-thumb { width: 120px; aspect-ratio: 16/10; margin: 0 auto 14px; border-radius: 14px; display: grid; place-items: center; color: #fff; font-weight: 800; font-size: 26px; box-shadow: var(--shadow); }
173
+ .loader-name { font-weight: 700; font-size: 18px; margin: 0 0 14px; }
174
+ .bar { height: 8px; border-radius: 999px; background: var(--line); overflow: hidden; }
175
+ .bar-fill { height: 100%; width: 0; border-radius: inherit; background: linear-gradient(90deg, var(--accent), var(--accent-2)); transition: width .15s; }
176
+ .loader-status { color: var(--muted); font-size: 13px; margin: 10px 0 4px; font-variant-numeric: tabular-nums; }
177
+
178
+ /* ---------- Footer ---------- */
179
+ .footer { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; padding: 16px clamp(16px, 3vw, 32px); color: var(--muted); font-size: 13px; border-top: 1px solid var(--line); }
180
+ body.playing { overflow: hidden; }
181
+
182
+ /* ---------- Small screens ---------- */
183
+ @media (max-width: 760px) {
184
+ .topbar { grid-template-columns: 1fr auto; }
185
+ .clock-island { grid-column: 1 / -1; grid-row: 2; justify-self: center; }
186
+ .icon-btn .label { display: none; }
187
+ .brand-text { font-size: 14px; }
188
+ .grid { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px; }
189
+ .search-hint { display: none; }
190
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.