Spaces:
Running
Running
Deploy pathmoor
Browse files- README.md +3 -11
- cmx.js +2 -2
- fun.css +1 -0
- funpass.js +41 -8
- game.js +2 -1
- index.html +11 -11
- sw.js +1 -1
README.md
CHANGED
|
@@ -16,19 +16,11 @@ tags:
|
|
| 16 |
- browser-game
|
| 17 |
- pwa
|
| 18 |
- cybermax
|
| 19 |
-
thumbnail: https://huggingface.co/spaces/CyberMax-tools/pathmoor/resolve/main/thumbnail.png
|
| 20 |
---
|
| 21 |
-
|
| 22 |
-
<!-- cm:demo -->
|
| 23 |
-
<video src="https://cybermax.cybermax-tools.workers.dev/media/demos/pathmoor/demo-16x9.mp4" poster="https://cybermax.cybermax-tools.workers.dev/media/demos/pathmoor/poster.jpg" controls muted loop playsinline width="100%"></video>
|
| 24 |
-
|
| 25 |
-
▶ **[Watch the 9-second demo](https://cybermax.cybermax-tools.workers.dev/media/demos/pathmoor/demo-16x9.mp4)**: the live Pathmoor page with a real result, no voice. **[Try it / get it](https://cybermax.cybermax-tools.workers.dev/games/pathmoor/?utm_source=huggingface&utm_medium=readme&utm_campaign=demo-video)**
|
| 26 |
-
<!-- /cm:demo -->
|
| 27 |
-
|
| 28 |
**Pathmoor**: Daily path puzzle: turn stones until every path glows. A free daily game from CyberMax: the same challenge for everyone each day, a shareable result, works offline and installs on your phone (no app store, no sign-up).
|
| 29 |
|
| 30 |
-
Play it full screen: https://
|
| 31 |
|
| 32 |
-
The optional **CyberMax Fun Pass** ($2.99/month, $19/year or $4.99 once) adds extra packs, the full archive of past dailies and colour themes in every CyberMax game: https://
|
| 33 |
|
| 34 |
-
More free games: https://
|
|
|
|
| 16 |
- browser-game
|
| 17 |
- pwa
|
| 18 |
- cybermax
|
|
|
|
| 19 |
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
**Pathmoor**: Daily path puzzle: turn stones until every path glows. A free daily game from CyberMax: the same challenge for everyone each day, a shareable result, works offline and installs on your phone (no app store, no sign-up).
|
| 21 |
|
| 22 |
+
Play it full screen: https://cybermaxtools.com/games/pathmoor/?utm_source=huggingface
|
| 23 |
|
| 24 |
+
The optional **CyberMax Fun Pass** ($2.99/month, $19/year or $4.99 once) adds extra packs, the full archive of past dailies and colour themes in every CyberMax game: https://cybermaxtools.com/games/?utm_source=huggingface
|
| 25 |
|
| 26 |
+
More free games: https://cybermaxtools.com/games/ · © 2026 CyberMax. All rights reserved.
|
cmx.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
| 3 |
// Counter beacon (game + event + channel only: no cookies, no IDs, nothing personal), daily seed, share, PWA install.
|
| 4 |
// (c) 2026 CyberMax. All rights reserved.
|
| 5 |
|
| 6 |
-
export const SITE = 'https://
|
| 7 |
-
export const API = 'https://toys.
|
| 8 |
export const EPOCH = Date.UTC(2026, 9, 2); // 2 Oct 2026 = puzzle #1 for every CyberMax daily game
|
| 9 |
|
| 10 |
/** Today's date in the player's own time zone as YYYY-MM-DD (everyone gets a new puzzle at their local midnight). */
|
|
|
|
| 3 |
// Counter beacon (game + event + channel only: no cookies, no IDs, nothing personal), daily seed, share, PWA install.
|
| 4 |
// (c) 2026 CyberMax. All rights reserved.
|
| 5 |
|
| 6 |
+
export const SITE = 'https://cybermaxtools.com';
|
| 7 |
+
export const API = 'https://toys.cybermaxtools.com';
|
| 8 |
export const EPOCH = Date.UTC(2026, 9, 2); // 2 Oct 2026 = puzzle #1 for every CyberMax daily game
|
| 9 |
|
| 10 |
/** Today's date in the player's own time zone as YYYY-MM-DD (everyone gets a new puzzle at their local midnight). */
|
fun.css
CHANGED
|
@@ -49,3 +49,4 @@ dialog.funpass::backdrop{background:rgba(10,12,18,.55)}
|
|
| 49 |
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
|
| 50 |
@media (max-width:560px){.chips{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;margin:0 -16px;padding:2px 16px 4px}.chips::-webkit-scrollbar{display:none}.chip{flex:0 0 auto}}
|
| 51 |
@media (min-width:760px){dialog.funpass{max-width:720px}.fp-perks{columns:2;column-gap:28px}}
|
|
|
|
|
|
| 49 |
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
|
| 50 |
@media (max-width:560px){.chips{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;margin:0 -16px;padding:2px 16px 4px}.chips::-webkit-scrollbar{display:none}.chip{flex:0 0 auto}}
|
| 51 |
@media (min-width:760px){dialog.funpass{max-width:720px}.fp-perks{columns:2;column-gap:28px}}
|
| 52 |
+
.fp-after{margin:14px 0 0;padding:12px 14px;border:1px solid var(--line, rgba(127,127,127,.35));border-radius:14px;text-align:left}.fp-after p{margin:0 0 8px}.fp-after .fp-row{display:flex;gap:8px;flex-wrap:wrap}
|
funpass.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
| 1 |
// CyberMax Fun Pass: ONE optional supporter pass for every CyberMax game (copied into each game's web/ folder).
|
| 2 |
// Free games stay free. The pass removes the supporter nudges and unlocks extra packs, the full archive and themes.
|
| 3 |
-
// Monthly $2.99 · Yearly $19 ·
|
| 4 |
-
// Buy: counted redirect https://data.
|
| 5 |
-
// After checkout Stripe sends the buyer to data.
|
| 6 |
// the Checkout Session (and, for a subscription, that it is still active) and returns to /games/ with #cmx-pro=<code>.
|
| 7 |
// Every game on the same site reads the same browser key, so one pass covers them all. The code on the receipt page
|
| 8 |
// unlocks any other device or browser. No account, no cookies, nothing personal stored. (c) 2026 CyberMax.
|
| 9 |
import { count, store, toast } from './cmx.js';
|
| 10 |
|
| 11 |
-
const DATA = 'https://data.
|
| 12 |
const KEY = 'cmx-pro:fun-pass';
|
| 13 |
-
const SID = /^cs_(live|test)_[A-Za-z0-9]{10,200}$/;
|
| 14 |
const RECHECK = 3 * 864e5; // subscriptions are re-checked every 3 days; a cancelled pass turns off by itself
|
| 15 |
export const PLANS = [
|
| 16 |
{ id: 'monthly', label: 'Monthly', price: '$2.99', per: '/month', note: 'Cancel any time' },
|
| 17 |
{ id: 'yearly', label: 'Yearly', price: '$19', per: '/year', note: 'Save 47%', best: true },
|
| 18 |
-
{ id: 'unlock', label: '
|
| 19 |
];
|
| 20 |
export const COMMON_PERKS = ['No supporter nudges, ever', 'Extra puzzle packs in every game', 'The full archive of past dailies', 'Custom colour themes'];
|
| 21 |
|
|
@@ -88,11 +88,11 @@ function render() {
|
|
| 88 |
<ul class="fp-perks">${perks.map((p) => `<li>${esc(p)}</li>`).join('')}</ul>
|
| 89 |
<div class="fp-plans">${PLANS.map((p) => `<a class="fp-plan${p.best ? ' best' : ''}" href="${buyUrl(p.id)}" rel="nofollow" data-plan="${p.id}">${p.best ? '<i>Best value</i>' : ''}<b>${p.label}</b><span class="fp-price">${p.price}<small>${p.per}</small></span><span class="fp-note">${p.note}</span></a>`).join('')}</div>
|
| 90 |
<p class="fp-small">Secure Stripe checkout. Works in every CyberMax game. The free daily games stay free for everyone.</p>
|
| 91 |
-
<details><summary>Already have a pass?</summary><form class="fp-form"><input aria-label="Pass code" autocomplete="off" placeholder="
|
| 92 |
d.querySelector('.fp-form').addEventListener('submit', (e) => {
|
| 93 |
e.preventDefault();
|
| 94 |
const c = e.target.querySelector('input').value.trim();
|
| 95 |
-
if (SID.test(c)) unlock(c); else toast('Paste the code from your receipt page
|
| 96 |
});
|
| 97 |
d.querySelectorAll('[data-plan]').forEach((a) => a.addEventListener('click', () => count(cfg.game, 'cta', `pass-${a.dataset.plan}`)));
|
| 98 |
}
|
|
@@ -105,6 +105,39 @@ export function open(from = 'button') {
|
|
| 105 |
count(cfg.game, 'cta', `pass-open-${from}`);
|
| 106 |
}
|
| 107 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
/** Call once per page: game id, display name and the game's own Pro perks (listed first). */
|
| 109 |
export function init(options) {
|
| 110 |
cfg = { ...cfg, ...options };
|
|
|
|
| 1 |
// CyberMax Fun Pass: ONE optional supporter pass for every CyberMax game (copied into each game's web/ folder).
|
| 2 |
// Free games stay free. The pass removes the supporter nudges and unlocks extra packs, the full archive and themes.
|
| 3 |
+
// Monthly $2.99 · Yearly $19 · Lifetime $29.99 once (Stripe Payment Links, pack revenue/packs/stripe/fun-pass).
|
| 4 |
+
// Buy: counted redirect https://data.cybermaxtools.com/buy/st-fun-pass-<plan>?s=game-<id> -> Stripe checkout.
|
| 5 |
+
// After checkout Stripe sends the buyer to data.cybermaxtools.com/unlock/fun-pass?session_id=..., which checks
|
| 6 |
// the Checkout Session (and, for a subscription, that it is still active) and returns to /games/ with #cmx-pro=<code>.
|
| 7 |
// Every game on the same site reads the same browser key, so one pass covers them all. The code on the receipt page
|
| 8 |
// unlocks any other device or browser. No account, no cookies, nothing personal stored. (c) 2026 CyberMax.
|
| 9 |
import { count, store, toast } from './cmx.js';
|
| 10 |
|
| 11 |
+
const DATA = 'https://data.cybermaxtools.com';
|
| 12 |
const KEY = 'cmx-pro:fun-pass';
|
| 13 |
+
const SID = /^(cs_(live|test)_[A-Za-z0-9]{10,200}|[A-Z0-9]{8}-[A-Z0-9]{8}-[A-Z0-9]{8}-[A-Z0-9]{8})$/i; // Stripe order code or Gumroad licence key
|
| 14 |
const RECHECK = 3 * 864e5; // subscriptions are re-checked every 3 days; a cancelled pass turns off by itself
|
| 15 |
export const PLANS = [
|
| 16 |
{ id: 'monthly', label: 'Monthly', price: '$2.99', per: '/month', note: 'Cancel any time' },
|
| 17 |
{ id: 'yearly', label: 'Yearly', price: '$19', per: '/year', note: 'Save 47%', best: true },
|
| 18 |
+
{ id: 'unlock', label: 'Lifetime', price: '$29.99', per: ' once', note: 'Pay once, keep forever' },
|
| 19 |
];
|
| 20 |
export const COMMON_PERKS = ['No supporter nudges, ever', 'Extra puzzle packs in every game', 'The full archive of past dailies', 'Custom colour themes'];
|
| 21 |
|
|
|
|
| 88 |
<ul class="fp-perks">${perks.map((p) => `<li>${esc(p)}</li>`).join('')}</ul>
|
| 89 |
<div class="fp-plans">${PLANS.map((p) => `<a class="fp-plan${p.best ? ' best' : ''}" href="${buyUrl(p.id)}" rel="nofollow" data-plan="${p.id}">${p.best ? '<i>Best value</i>' : ''}<b>${p.label}</b><span class="fp-price">${p.price}<small>${p.per}</small></span><span class="fp-note">${p.note}</span></a>`).join('')}</div>
|
| 90 |
<p class="fp-small">Secure Stripe checkout. Works in every CyberMax game. The free daily games stay free for everyone.</p>
|
| 91 |
+
<details><summary>Already have a pass?</summary><form class="fp-form"><input aria-label="Pass code" autocomplete="off" placeholder="Receipt code (cs_live_…) or Gumroad licence key"><button class="btn sm" type="submit">Turn on</button></form></details></div>`;
|
| 92 |
d.querySelector('.fp-form').addEventListener('submit', (e) => {
|
| 93 |
e.preventDefault();
|
| 94 |
const c = e.target.querySelector('input').value.trim();
|
| 95 |
+
if (SID.test(c)) unlock(c); else toast('Paste the code from your receipt page (cs_live_…) or your Gumroad licence key.', 3500);
|
| 96 |
});
|
| 97 |
d.querySelectorAll('[data-plan]').forEach((a) => a.addEventListener('click', () => count(cfg.game, 'cta', `pass-${a.dataset.plan}`)));
|
| 98 |
}
|
|
|
|
| 105 |
count(cfg.game, 'cta', `pass-open-${from}`);
|
| 106 |
}
|
| 107 |
|
| 108 |
+
/** After a finished round (the value moment): one small inline card under the result, never a pop-up. Shows the
|
| 109 |
+
* pass price, the honest trust line and an optional "email me" weekly reminder (double opt-in).
|
| 110 |
+
* `host` is the result panel; the card is added once and removed for pass holders. */
|
| 111 |
+
export function afterWin(host, from = 'win') {
|
| 112 |
+
if (!host) return;
|
| 113 |
+
if (isPro()) { host.querySelector('.fp-after')?.remove(); return; }
|
| 114 |
+
let el = host.querySelector('.fp-after');
|
| 115 |
+
if (!el) { el = document.createElement('div'); el.className = 'fp-after'; host.appendChild(el); }
|
| 116 |
+
const best = PLANS.find((p) => p.best) || PLANS[0];
|
| 117 |
+
el.innerHTML = `<p><b>Want more today?</b> ${esc(cfg.extra || 'The Fun Pass unlocks extra packs, the full archive and themes in every CyberMax game.')}</p>
|
| 118 |
+
<p class="fp-row"><a class="btn sm" href="${buyUrl(best.id)}-after" rel="nofollow" data-after>Get the Fun Pass: ${esc(best.price)}${esc(best.per)}</a> <button class="btn sm ghost" type="button" data-plans>See all plans</button></p>
|
| 119 |
+
<p class="fp-small">Secure Stripe checkout · the pass turns on as soon as you pay · cancel any time from your receipt email · 14-day promise: if it doesn't work as described, we fix it or refund you (<a href="https://cybermaxtools.com/terms#payments" target="_blank" rel="noopener">terms</a>). Today's free game stays free.</p>
|
| 120 |
+
<div class="fp-cap"></div>`;
|
| 121 |
+
el.querySelector('[data-after]').addEventListener('click', () => { count(cfg.game, 'cta', `pass-${best.id}-after`); kit((K) => K.event('upgrade-click', cfg.game)); });
|
| 122 |
+
el.querySelector('[data-plans]').addEventListener('click', () => open(`after-${from}`));
|
| 123 |
+
kit((K) => {
|
| 124 |
+
K.event('result', cfg.game); K.event('upgrade-view', cfg.game);
|
| 125 |
+
K.capture(el.querySelector('.fp-cap'), { list: `weekly-${cfg.game}`, src: `game-${cfg.game}`, label: cfg.remind || 'Email me a weekly reminder with new puzzles (free)', button: 'Remind me' });
|
| 126 |
+
});
|
| 127 |
+
}
|
| 128 |
+
|
| 129 |
+
// Convert kit (funnel beacons + email capture) from the CyberMax site; optional, the game works without it.
|
| 130 |
+
let kitQ = null;
|
| 131 |
+
function kit(fn) {
|
| 132 |
+
if (window.CMXConvert) return fn(window.CMXConvert);
|
| 133 |
+
if (kitQ) return kitQ.push(fn);
|
| 134 |
+
kitQ = [fn];
|
| 135 |
+
const sc = document.createElement('script');
|
| 136 |
+
sc.src = 'https://cybermaxtools.com/store/convert.js'; sc.async = true;
|
| 137 |
+
sc.onload = () => kitQ.splice(0).forEach((f) => { try { f(window.CMXConvert); } catch { /* optional */ } });
|
| 138 |
+
document.head.appendChild(sc);
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
/** Call once per page: game id, display name and the game's own Pro perks (listed first). */
|
| 142 |
export function init(options) {
|
| 143 |
cfg = { ...cfg, ...options };
|
game.js
CHANGED
|
@@ -191,6 +191,7 @@ function showWin(scroll) {
|
|
| 191 |
pr.textContent = mode.level < pk.levels ? `Next board: ${pk.name} #${mode.level + 1}` : 'Pack complete! Try another pack';
|
| 192 |
} else pr.textContent = 'Play a practice board';
|
| 193 |
$('win').hidden = false;
|
|
|
|
| 194 |
tick();
|
| 195 |
if (scroll) $('win').scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
| 196 |
}
|
|
@@ -274,7 +275,7 @@ function card() {
|
|
| 274 |
g.font = '700 44px system-ui, sans-serif'; g.fillStyle = S.on;
|
| 275 |
g.fillText(`${totalTaps()} taps · par ${par(board)}`, 80, 1235);
|
| 276 |
g.fillStyle = '#ffffffaa'; g.font = '600 32px system-ui, sans-serif';
|
| 277 |
-
g.fillText('Play free:
|
| 278 |
return c;
|
| 279 |
}
|
| 280 |
|
|
|
|
| 191 |
pr.textContent = mode.level < pk.levels ? `Next board: ${pk.name} #${mode.level + 1}` : 'Pack complete! Try another pack';
|
| 192 |
} else pr.textContent = 'Play a practice board';
|
| 193 |
$('win').hidden = false;
|
| 194 |
+
pass.afterWin($('win'), 'win');
|
| 195 |
tick();
|
| 196 |
if (scroll) $('win').scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
| 197 |
}
|
|
|
|
| 275 |
g.font = '700 44px system-ui, sans-serif'; g.fillStyle = S.on;
|
| 276 |
g.fillText(`${totalTaps()} taps · par ${par(board)}`, 80, 1235);
|
| 277 |
g.fillStyle = '#ffffffaa'; g.font = '600 32px system-ui, sans-serif';
|
| 278 |
+
g.fillText('Play free: cybermaxtools.com/games/pathmoor', 80, 1300);
|
| 279 |
return c;
|
| 280 |
}
|
| 281 |
|
index.html
CHANGED
|
@@ -2,24 +2,24 @@
|
|
| 2 |
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
|
| 3 |
<title>Pathmoor: free daily path puzzle. Light every stone | CyberMax</title>
|
| 4 |
<meta name="description" content="Pathmoor is a free daily path puzzle: tap stones to turn them until every path glows from the lantern. A new board every day, about 2 minutes, share your time like Wordle. Works offline, installs on your phone.">
|
| 5 |
-
<link rel="canonical" href="https://
|
| 6 |
<meta property="og:type" content="website"><meta property="og:site_name" content="CyberMax">
|
| 7 |
<meta property="og:title" content="Pathmoor: light every stone">
|
| 8 |
<meta property="og:description" content="A new path puzzle every day. Tap to turn stones until every path glows. Share your time.">
|
| 9 |
-
<meta property="og:url" content="https://
|
| 10 |
-
<meta property="og:image" content="https://
|
| 11 |
-
<meta name="twitter:card" content="summary_large_image"><meta name="twitter:image" content="https://
|
| 12 |
<meta name="theme-color" content="#16241E">
|
| 13 |
<link rel="manifest" href="manifest.webmanifest">
|
| 14 |
<link rel="icon" href="icon.svg" type="image/svg+xml"><link rel="apple-touch-icon" href="icon-192.png">
|
| 15 |
<meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-title" content="Pathmoor">
|
| 16 |
<link rel="stylesheet" href="fun.css"><link rel="stylesheet" href="style.css">
|
| 17 |
<script>try{var t=localStorage.getItem('cm-theme');if(t)document.documentElement.dataset.theme=t;var s=localStorage.getItem('pathmoor:skin');if(s)document.documentElement.dataset.skin=JSON.parse(s)}catch(e){}</script>
|
| 18 |
-
<script type="application/ld+json">{"@context":"https://schema.org","@type":"VideoGame","name":"Pathmoor","url":"https://
|
| 19 |
</head><body>
|
| 20 |
<div class="wrap">
|
| 21 |
-
<header class="top"><a class="brand" href="https://
|
| 22 |
-
<nav><a href="https://
|
| 23 |
<main>
|
| 24 |
<section class="game">
|
| 25 |
<div class="headline"><h1>Pathmoor <span id="num" class="num"></span> <span class="pro-badge">PASS</span></h1>
|
|
@@ -48,14 +48,14 @@
|
|
| 48 |
<h3>A new board every day</h3>
|
| 49 |
<p>Everyone gets the same daily board, and it changes at your midnight. Share your time and taps with the grid: 🟩 a stone you set in par, 🟨 a few extra turns, 🟧 a lot, ⬜ a stone that was already right. Keep your streak going. Pathmoor works offline and installs on your phone like an app (no app store, no sign-up).</p>
|
| 50 |
<h3>Free, with an optional Fun Pass</h3>
|
| 51 |
-
<p>The daily board and three practice boards are free for everyone. The optional <b>CyberMax Fun Pass</b> ($2.99/month, $19/year, or $
|
| 52 |
<h3>FAQ</h3>
|
| 53 |
<p><b>Is there only one solution?</b> Any arrangement that lights every stone with no loose ends counts. <b>Does it track me?</b> No accounts, no cookies; only anonymous counts (a game was played or shared). <b>Why not just play another daily puzzle?</b> Pathmoor is a turn-the-tiles puzzle you can finish on a coffee break, with a fresh board daily and a par score to beat.</p>
|
| 54 |
<h2>More free games from CyberMax</h2>
|
| 55 |
-
<div class="more" id="more"><a href="https://
|
| 56 |
</section>
|
| 57 |
</main>
|
| 58 |
-
<footer>© 2026 CyberMax · <a href="https://
|
| 59 |
</div>
|
| 60 |
<script type="module" src="game.js"></script>
|
| 61 |
-
<
|
|
|
|
| 2 |
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
|
| 3 |
<title>Pathmoor: free daily path puzzle. Light every stone | CyberMax</title>
|
| 4 |
<meta name="description" content="Pathmoor is a free daily path puzzle: tap stones to turn them until every path glows from the lantern. A new board every day, about 2 minutes, share your time like Wordle. Works offline, installs on your phone.">
|
| 5 |
+
<link rel="canonical" href="https://cybermaxtools.com/games/pathmoor/">
|
| 6 |
<meta property="og:type" content="website"><meta property="og:site_name" content="CyberMax">
|
| 7 |
<meta property="og:title" content="Pathmoor: light every stone">
|
| 8 |
<meta property="og:description" content="A new path puzzle every day. Tap to turn stones until every path glows. Share your time.">
|
| 9 |
+
<meta property="og:url" content="https://cybermaxtools.com/games/pathmoor/">
|
| 10 |
+
<meta property="og:image" content="https://cybermaxtools.com/games/pathmoor/og.png"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630">
|
| 11 |
+
<meta name="twitter:card" content="summary_large_image"><meta name="twitter:image" content="https://cybermaxtools.com/games/pathmoor/og.png">
|
| 12 |
<meta name="theme-color" content="#16241E">
|
| 13 |
<link rel="manifest" href="manifest.webmanifest">
|
| 14 |
<link rel="icon" href="icon.svg" type="image/svg+xml"><link rel="apple-touch-icon" href="icon-192.png">
|
| 15 |
<meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-title" content="Pathmoor">
|
| 16 |
<link rel="stylesheet" href="fun.css"><link rel="stylesheet" href="style.css">
|
| 17 |
<script>try{var t=localStorage.getItem('cm-theme');if(t)document.documentElement.dataset.theme=t;var s=localStorage.getItem('pathmoor:skin');if(s)document.documentElement.dataset.skin=JSON.parse(s)}catch(e){}</script>
|
| 18 |
+
<script type="application/ld+json">{"@context":"https://schema.org","@type":"VideoGame","name":"Pathmoor","url":"https://cybermaxtools.com/games/pathmoor/","image":"https://cybermaxtools.com/games/pathmoor/og.png","description":"A free daily path puzzle: tap stones to turn them until every path glows from the lantern.","genre":["Puzzle","Logic"],"gamePlatform":["Web browser","Android","iOS"],"applicationCategory":"Game","operatingSystem":"Any","playMode":"SinglePlayer","publisher":{"@type":"Organization","name":"CyberMax","url":"https://cybermaxtools.com/"},"offers":[{"@type":"Offer","price":"0","priceCurrency":"USD","description":"Daily puzzle, free"},{"@type":"Offer","price":"2.99","priceCurrency":"USD","description":"CyberMax Fun Pass, monthly"}]}</script>
|
| 19 |
</head><body>
|
| 20 |
<div class="wrap">
|
| 21 |
+
<header class="top"><a class="brand" href="https://cybermaxtools.com/games/"><svg viewBox="0 0 512 512" aria-hidden="true"><clipPath id="lg"><rect width="512" height="512" rx="116"/></clipPath><g clip-path="url(#lg)"><rect width="512" height="512" fill="#FF6A3D"/><path d="M512 250V512H250Z" fill="#D9481F"/></g><g transform="translate(86 86) scale(3.4)"><path d="M66 27 A27 27 0 1 0 66 73" fill="none" stroke="#11141B" stroke-width="17" stroke-linecap="round"/><rect x="66" y="41" width="20" height="18" rx="4" fill="#11141B"/></g></svg>CyberMax</a>
|
| 22 |
+
<nav><a href="https://cybermaxtools.com/games/">Games</a></nav><button class="icon" id="stats-btn" type="button" aria-label="Your stats">📊</button><button class="icon" id="theme" type="button" aria-label="Switch light or dark">◐</button></header>
|
| 23 |
<main>
|
| 24 |
<section class="game">
|
| 25 |
<div class="headline"><h1>Pathmoor <span id="num" class="num"></span> <span class="pro-badge">PASS</span></h1>
|
|
|
|
| 48 |
<h3>A new board every day</h3>
|
| 49 |
<p>Everyone gets the same daily board, and it changes at your midnight. Share your time and taps with the grid: 🟩 a stone you set in par, 🟨 a few extra turns, 🟧 a lot, ⬜ a stone that was already right. Keep your streak going. Pathmoor works offline and installs on your phone like an app (no app store, no sign-up).</p>
|
| 50 |
<h3>Free, with an optional Fun Pass</h3>
|
| 51 |
+
<p>The daily board and three practice boards are free for everyone. The optional <b>CyberMax Fun Pass</b> ($2.99/month, $19/year, or $29.99 for life) adds the Moorland 7×7, Highland 8×8 and Summit 10×10 packs (250 boards), the full archive of past dailies and colour themes, removes the supporter nudges, and works in every CyberMax game.</p>
|
| 52 |
<h3>FAQ</h3>
|
| 53 |
<p><b>Is there only one solution?</b> Any arrangement that lights every stone with no loose ends counts. <b>Does it track me?</b> No accounts, no cookies; only anonymous counts (a game was played or shared). <b>Why not just play another daily puzzle?</b> Pathmoor is a turn-the-tiles puzzle you can finish on a coffee break, with a fresh board daily and a par score to beat.</p>
|
| 54 |
<h2>More free games from CyberMax</h2>
|
| 55 |
+
<div class="more" id="more"><a href="https://cybermaxtools.com/games/whirlane/"><b>Whirlane</b><span>One-tap orbit dodger with a daily leaderboard</span></a><a href="https://cybermaxtools.com/games/townduel/"><b>Townduel</b><span>Which US town costs more? 10 daily duels</span></a><a href="https://cybermaxtools.com/toys/"><b>Web toys</b><span>Roast your website, vibe-check a name</span></a></div>
|
| 56 |
</section>
|
| 57 |
</main>
|
| 58 |
+
<footer>© 2026 CyberMax · <a href="https://cybermaxtools.com/games/">Games</a> · <a href="https://cybermaxtools.com/toys/">Toys</a> · <a href="https://cybermaxtools.com/store/">Store</a> · <a href="https://cybermaxtools.com/privacy">Privacy</a> · <a href="https://cybermaxtools.com/terms">Terms</a></footer>
|
| 59 |
</div>
|
| 60 |
<script type="module" src="game.js"></script>
|
| 61 |
+
</body></html>
|
sw.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
// CyberMax game service worker: the game works offline after the first visit. Cache-first for the game's own files,
|
| 2 |
// network-first for the page itself (so updates arrive), never caches API calls or other sites. (c) 2026 CyberMax.
|
| 3 |
const GAME = 'pathmoor';
|
| 4 |
-
const CACHE = `cmx-${GAME}-
|
| 5 |
const FILES = ["index.html", "cmx.js", "core.js", "fun.css", "funpass.js", "game.js", "icon-192.png", "icon-512.png", "icon-maskable.png", "icon.svg", "index.html", "manifest.webmanifest", "style.css"];
|
| 6 |
|
| 7 |
self.addEventListener('install', (e) => {
|
|
|
|
| 1 |
// CyberMax game service worker: the game works offline after the first visit. Cache-first for the game's own files,
|
| 2 |
// network-first for the page itself (so updates arrive), never caches API calls or other sites. (c) 2026 CyberMax.
|
| 3 |
const GAME = 'pathmoor';
|
| 4 |
+
const CACHE = `cmx-${GAME}-4b226fa7a1`;
|
| 5 |
const FILES = ["index.html", "cmx.js", "core.js", "fun.css", "funpass.js", "game.js", "icon-192.png", "icon-512.png", "icon-maskable.png", "icon.svg", "index.html", "manifest.webmanifest", "style.css"];
|
| 6 |
|
| 7 |
self.addEventListener('install', (e) => {
|