Skip to content

Commit 71f4316

Browse files
committed
Unify catalog from games.json and fix hub SEO/monetization
Generate play.html, index.html, sitemap.xml, and nav.js from games.json; strip legacy inline siteNav; add Netlify clean-URL redirects, AdSense units on play.html, Giscus on sims, PWA manifests for daily puzzles, and SEO for Abacus, Eclipse Predictor, and Metropolis 2K.
1 parent 883514f commit 71f4316

47 files changed

Lines changed: 1344 additions & 2016 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2048.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
</script>
3131
<script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Board Gaming Hub","item":"https://boardgaminghub.com/"},{"@type":"ListItem","position":2,"name":"Puzzles & Classics","item":"https://boardgaminghub.com/#puzzles"},{"@type":"ListItem","position":3,"name":"2048","item":"https://boardgaminghub.com/2048.html"}]}</script>
3232
<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"How do you play 2048?","acceptedAnswer":{"@type":"Answer","text":"Use arrow keys (or swipe on touch devices) to slide every tile in one direction. When two adjacent tiles with the same number meet, they merge into a single tile of double value. After every move a new 2 (90% of the time) or 4 (10%) appears in a random empty cell. The game ends when no moves are possible."}},{"@type":"Question","name":"What's the best 2048 strategy?","acceptedAnswer":{"@type":"Answer","text":"Pin the largest tile in one corner (most players use bottom-right) and never move it. Build a snake-pattern descending row that feeds into that corner: e.g., bottom row left-to-right increasing, second row right-to-left, etc. Avoid pressing the direction that would shift the corner — typically Up if your corner is bottom-right. With perfect play this strategy reaches 2048 reliably and 4096 often."}},{"@type":"Question","name":"What's the highest tile possible in 2048?","acceptedAnswer":{"@type":"Answer","text":"Theoretical maximum is 131,072 (2^17), achieved by merging tiles up to that value on a 4×4 grid. Practically the cap is far lower because once tiles fill the board and the highest tile cannot be merged, you lose. The 2048 tile (the win condition) is reached by ~5–10% of casual players; 4096 by perhaps 1%."}},{"@type":"Question","name":"How is the score calculated?","acceptedAnswer":{"@type":"Answer","text":"Each merge adds the value of the new tile to your score. Two 2s → 4 (+4). Two 8s → 16 (+16). Two 1024s → 2048 (+2048). Total score after reaching 2048 from a fresh game is around 20,000; reaching 4096 around 50,000."}},{"@type":"Question","name":"Why does the same tile keep spawning in the wrong place?","acceptedAnswer":{"@type":"Answer","text":"Spawn position is uniformly random among empty cells. It feels biased after a streak but isn't. The 2 vs 4 spawn is weighted 90/10 — getting a 4 spawn is meaningful because it skips a doubling step (and slightly accelerates filling the board)."}}]}</script>
33-
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2835365593874464" crossorigin="anonymous"></script>
3433
<style>
3534
* { box-sizing: border-box; }
3635
html, body { margin: 0; padding: 0; background:

Abacus.html

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,6 @@
8888
footer { text-align: center; padding: 18px 0 0; color: #604030; font-size: 0.72em; letter-spacing: 2px; }
8989
footer a { color: #a89070; text-decoration: none; }
9090
</style>
91-
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2835365593874464"
92-
crossorigin="anonymous"></script>
9391
</head>
9492
<body>
9593
<div id="app">
@@ -507,5 +505,23 @@ <h1>ABACUS</h1>
507505
render();
508506
})();
509507
</script>
508+
509+
<section class="seo-content">
510+
<h2>About Abacus</h2>
511+
<p>A playable Japanese soroban (1:4 bead layout) with a calculator pad, practice mode, and live conversion to Arabic and Roman numerals. Tap beads or type digits — the abacus and displays stay in sync.</p>
512+
<h3>How to read the soroban</h3>
513+
<p>Each column is a decimal place. The upper bead counts 5 when pushed down; each lower bead counts 1 when pushed up. Addition and subtraction follow standard soroban carries.</p>
514+
<h3>Frequently asked questions</h3>
515+
<details><summary>What is a soroban?</summary><p>The Japanese abacus — one heaven bead (5) and four earth beads (1) per rod, decimal from right to left.</p></details>
516+
<details><summary>Can I use the keyboard?</summary><p>Yes — digits, operators, Enter, Backspace, and C/Escape map to the calculator pad.</p></details>
517+
<h3>Related</h3>
518+
<ul>
519+
<li><a href="Sudoku.html">Sudoku</a> — number logic puzzle.</li>
520+
<li><a href="2048.html">2048</a> — merge tiles by doubling.</li>
521+
</ul>
522+
</section>
523+
524+
<script src="/nav.js" defer></script>
525+
<script src="/analytics.js"></script>
510526
</body>
511527
</html>

Agora.html

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -360,71 +360,8 @@
360360
</style>
361361
<script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Board Gaming Hub","item":"https://boardgaminghub.com/"},{"@type":"ListItem","position":2,"name":"Board Games","item":"https://boardgaminghub.com/#board"},{"@type":"ListItem","position":3,"name":"Agora","item":"https://boardgaminghub.com/Agora.html"}]}</script>
362362
<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"How long is a typical game?","acceptedAnswer":{"@type":"Answer","text":"15–25 minutes for a 4-city session. Larger maps run 30–45 minutes."}},{"@type":"Question","name":"How do I gain influence?","acceptedAnswer":{"@type":"Answer","text":"Trade between cities you control, deploy fleets to neighbors, and chain consecutive turns through allied ports. Influence rewards consistency more than single big plays."}},{"@type":"Question","name":"Is Agora based on a real game?","acceptedAnswer":{"@type":"Answer","text":"No — original design. The Mediterranean trade flavor draws on Catan and Concordia but the mechanics are independent."}},{"@type":"Question","name":"How do I win?","acceptedAnswer":{"@type":"Answer","text":"Control the most weighted-influence cities when the trade-deck exhausts. Some cities count more than others, so prioritize the high-value ones."}}]}</script>
363-
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2835365593874464"
364-
crossorigin="anonymous"></script>
365363
</head>
366364
<body>
367-
<style id="siteNav-css">
368-
#siteNav { position: sticky; top: 0; z-index: 99999; background: rgba(16,20,28,0.96); border-bottom: 1px solid #2a3540; font-family: Georgia, "Times New Roman", serif; box-shadow: 0 2px 10px rgba(0,0,0,0.6); color: #d8d0c0; }
369-
#siteNav * { box-sizing: border-box; }
370-
#siteNav .nav-bar { display: flex; justify-content: space-between; align-items: center; padding: 8px 16px; max-width: 1400px; margin: 0 auto; gap: 12px; }
371-
#siteNav .nav-home { color: #d8d0c0; text-decoration: none; font-size: 0.82em; letter-spacing: 2px; padding: 5px 12px; border: 1px solid #3a5060; border-radius: 3px; white-space: nowrap; }
372-
#siteNav .nav-home:hover { background: #1e2838; color: #f0e0b0; }
373-
#siteNav .nav-title { color: #f0d89c; font-size: 0.95em; letter-spacing: 3px; font-weight: bold; text-align: center; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
374-
#siteNav .nav-toggle { background: none; border: 1px solid #3a5060; color: #d8d0c0; font-size: 0.85em; letter-spacing: 2px; padding: 5px 12px; border-radius: 3px; cursor: pointer; font-family: inherit; white-space: nowrap; }
375-
#siteNav .nav-toggle:hover { background: #1e2838; color: #f0e0b0; }
376-
#siteNav .nav-menu { display: none; background: #0f141c; border-top: 1px solid #2a4050; padding: 14px 16px; max-width: 1400px; margin: 0 auto; }
377-
#siteNav .nav-menu.open { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
378-
#siteNav .nav-cat { min-width: 0; }
379-
#siteNav .nav-cat-label { color: #8098a8; font-size: 0.72em; letter-spacing: 4px; padding: 4px 0 8px 0; border-bottom: 1px solid #2a3540; margin-bottom: 6px; }
380-
#siteNav .nav-cat a { display: block; padding: 6px 10px; color: #a8b0c0; text-decoration: none; font-size: 0.88em; border-radius: 3px; }
381-
#siteNav .nav-cat a:hover { background: #1e2838; color: #f0e0b0; }
382-
#siteNav .nav-cat a.current { color: #f0d89c; font-weight: bold; background: #1e2838; }
383-
@media (max-width: 640px) {
384-
#siteNav .nav-menu.open { grid-template-columns: 1fr; gap: 14px; }
385-
#siteNav .nav-title { font-size: 0.82em; letter-spacing: 2px; }
386-
#siteNav .nav-home,
387-
#siteNav .nav-toggle { font-size: 0.74em; padding: 4px 8px; }
388-
}
389-
</style>
390-
<div id="siteNav">
391-
<div class="nav-bar">
392-
<a href="index.html" class="nav-home">HOME</a>
393-
<span class="nav-title">Agora</span>
394-
<button class="nav-toggle" onclick="document.querySelector('#siteNav .nav-menu').classList.toggle('open')">GAMES &#9776;</button>
395-
</div>
396-
<div class="nav-menu">
397-
<div class="nav-cat">
398-
<div class="nav-cat-label">BOARD GAMES</div>
399-
<a href="Agora.html" class="current">Agora</a>
400-
<a href="Aresia.html">Aresia</a>
401-
<a href="Backgammon.html">Backgammon</a>
402-
<a href="Bisque.html">Bisque</a>
403-
<a href="Chess.html">Chess</a>
404-
<a href="Convergence.html">Convergence</a>
405-
<a href="Go.html">Go</a>
406-
<a href="Mancala.html">Mancala</a>
407-
<a href="Odyssey.html">Odyssey</a>
408-
<a href="Othello.html">Othello</a>
409-
<a href="PenteGrammai.html">Pente Grammai</a>
410-
<a href="Senet.html">Senet</a>
411-
<a href="Tidelands.html">Tidelands</a>
412-
<a href="Ur.html">Ur</a>
413-
</div>
414-
<div class="nav-cat">
415-
<div class="nav-cat-label">SIMULATIONS</div>
416-
<a href="Apoapsis.html">Apoapsis</a>
417-
<a href="BiosphereBlue.html">Biosphere Blue</a>
418-
<a href="BonnevilleSpillwayOperator.html">Bonneville Spillway</a>
419-
<a href="Cliffwalkers.html">Cliffwalkers</a>
420-
<a href="Doctrine.html">Doctrine</a>
421-
<a href="EclipsePredictor.html">Eclipse Predictor</a>
422-
<a href="Floodline.html">Floodline</a>
423-
<a href="Metropolis2K.html">Metropolis 2K</a>
424-
<a href="Tower.html">Tower</a>
425-
</div>
426-
</div>
427-
</div>
428365
<h1>AGORA</h1>
429366
<div class="subtitle">The Mediterranean Trade</div>
430367
<div class="mode-selector">

Apoapsis.html

Lines changed: 21 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -169,71 +169,8 @@
169169
</style>
170170
<script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Board Gaming Hub","item":"https://boardgaminghub.com/"},{"@type":"ListItem","position":2,"name":"Simulations","item":"https://boardgaminghub.com/#sims"},{"@type":"ListItem","position":3,"name":"Apoapsis","item":"https://boardgaminghub.com/Apoapsis.html"}]}</script>
171171
<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"What is apoapsis?","acceptedAnswer":{"@type":"Answer","text":"The highest point of an orbit — opposite of periapsis (lowest point). On Earth it's \"apogee\"; for the Sun it's \"aphelion\". The game is named after this orbital concept."}},{"@type":"Question","name":"Is the physics realistic?","acceptedAnswer":{"@type":"Answer","text":"Yes — full Newtonian gravity (no patched-conics simplification), realistic engine ISP/thrust specs, and atmospheric drag with altitude-dependent density. Trajectory matches what Kerbal Space Program calls \"Realism Overhaul\" closely."}},{"@type":"Question","name":"What's a good gravity-turn altitude?","acceptedAnswer":{"@type":"Answer","text":"Begin pitching over at ~5 km, target ~45° pitch by 20 km. Earlier pitch wastes fuel on horizontal velocity at sea level (high drag); later pitch wastes fuel fighting gravity."}},{"@type":"Question","name":"Can I land on the Moon?","acceptedAnswer":{"@type":"Answer","text":"Single-stage to orbit and a circumlunar flyby are both achievable with the default rocket. A surface-landing mission requires a custom multi-stage build."}}]}</script>
172-
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2835365593874464"
173-
crossorigin="anonymous"></script>
174172
</head>
175173
<body>
176-
<style id="siteNav-css">
177-
#siteNav { position: sticky; top: 0; z-index: 99999; background: rgba(16,20,28,0.96); border-bottom: 1px solid #2a3540; font-family: Georgia, "Times New Roman", serif; box-shadow: 0 2px 10px rgba(0,0,0,0.6); color: #d8d0c0; }
178-
#siteNav * { box-sizing: border-box; }
179-
#siteNav .nav-bar { display: flex; justify-content: space-between; align-items: center; padding: 8px 16px; max-width: 1400px; margin: 0 auto; gap: 12px; }
180-
#siteNav .nav-home { color: #d8d0c0; text-decoration: none; font-size: 0.82em; letter-spacing: 2px; padding: 5px 12px; border: 1px solid #3a5060; border-radius: 3px; white-space: nowrap; }
181-
#siteNav .nav-home:hover { background: #1e2838; color: #f0e0b0; }
182-
#siteNav .nav-title { color: #f0d89c; font-size: 0.95em; letter-spacing: 3px; font-weight: bold; text-align: center; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
183-
#siteNav .nav-toggle { background: none; border: 1px solid #3a5060; color: #d8d0c0; font-size: 0.85em; letter-spacing: 2px; padding: 5px 12px; border-radius: 3px; cursor: pointer; font-family: inherit; white-space: nowrap; }
184-
#siteNav .nav-toggle:hover { background: #1e2838; color: #f0e0b0; }
185-
#siteNav .nav-menu { display: none; background: #0f141c; border-top: 1px solid #2a4050; padding: 14px 16px; max-width: 1400px; margin: 0 auto; }
186-
#siteNav .nav-menu.open { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
187-
#siteNav .nav-cat { min-width: 0; }
188-
#siteNav .nav-cat-label { color: #8098a8; font-size: 0.72em; letter-spacing: 4px; padding: 4px 0 8px 0; border-bottom: 1px solid #2a3540; margin-bottom: 6px; }
189-
#siteNav .nav-cat a { display: block; padding: 6px 10px; color: #a8b0c0; text-decoration: none; font-size: 0.88em; border-radius: 3px; }
190-
#siteNav .nav-cat a:hover { background: #1e2838; color: #f0e0b0; }
191-
#siteNav .nav-cat a.current { color: #f0d89c; font-weight: bold; background: #1e2838; }
192-
@media (max-width: 640px) {
193-
#siteNav .nav-menu.open { grid-template-columns: 1fr; gap: 14px; }
194-
#siteNav .nav-title { font-size: 0.82em; letter-spacing: 2px; }
195-
#siteNav .nav-home,
196-
#siteNav .nav-toggle { font-size: 0.74em; padding: 4px 8px; }
197-
}
198-
</style>
199-
<div id="siteNav">
200-
<div class="nav-bar">
201-
<a href="index.html" class="nav-home">HOME</a>
202-
<span class="nav-title">Apoapsis</span>
203-
<button class="nav-toggle" onclick="document.querySelector('#siteNav .nav-menu').classList.toggle('open')">GAMES &#9776;</button>
204-
</div>
205-
<div class="nav-menu">
206-
<div class="nav-cat">
207-
<div class="nav-cat-label">BOARD GAMES</div>
208-
<a href="Agora.html">Agora</a>
209-
<a href="Aresia.html">Aresia</a>
210-
<a href="Backgammon.html">Backgammon</a>
211-
<a href="Bisque.html">Bisque</a>
212-
<a href="Chess.html">Chess</a>
213-
<a href="Convergence.html">Convergence</a>
214-
<a href="Go.html">Go</a>
215-
<a href="Mancala.html">Mancala</a>
216-
<a href="Odyssey.html">Odyssey</a>
217-
<a href="Othello.html">Othello</a>
218-
<a href="PenteGrammai.html">Pente Grammai</a>
219-
<a href="Senet.html">Senet</a>
220-
<a href="Tidelands.html">Tidelands</a>
221-
<a href="Ur.html">Ur</a>
222-
</div>
223-
<div class="nav-cat">
224-
<div class="nav-cat-label">SIMULATIONS</div>
225-
<a href="Apoapsis.html" class="current">Apoapsis</a>
226-
<a href="BiosphereBlue.html">Biosphere Blue</a>
227-
<a href="BonnevilleSpillwayOperator.html">Bonneville Spillway</a>
228-
<a href="Cliffwalkers.html">Cliffwalkers</a>
229-
<a href="Doctrine.html">Doctrine</a>
230-
<a href="EclipsePredictor.html">Eclipse Predictor</a>
231-
<a href="Floodline.html">Floodline</a>
232-
<a href="Metropolis2K.html">Metropolis 2K</a>
233-
<a href="Tower.html">Tower</a>
234-
</div>
235-
</div>
236-
</div>
237174
<div id="gameNav">
238175
<div class="nav-bar">
239176
<span class="nav-title">Apoapsis</span>
@@ -3270,6 +3207,27 @@ <h3>Related games</h3>
32703207
</section>
32713208

32723209
<script src="/analytics.js"></script>
3210+
3211+
<section style="max-width:900px;margin:60px auto 40px;padding:0 20px;font-family:Georgia,'Times New Roman',serif;color:#d8d0c0;">
3212+
<h2 style="color:#f0d89c;letter-spacing:4px;font-size:1.0em;text-transform:uppercase;border-bottom:1px solid #2a3540;padding-bottom:8px;margin-bottom:16px;">Discussion</h2>
3213+
<p style="color:#8098a8;font-size:0.9em;margin-bottom:18px;line-height:1.5;">Sign in with GitHub to share strategies, ask questions, or report a bug.</p>
3214+
<div class="giscus"></div>
3215+
</section>
3216+
<script src="https://giscus.app/client.js"
3217+
data-repo="mf4633/board-gaming"
3218+
data-repo-id="R_kgDOKyyThA"
3219+
data-category="Announcements"
3220+
data-category-id="DIC_kwDOKyyThM4C75Cz"
3221+
data-mapping="pathname"
3222+
data-strict="0"
3223+
data-reactions-enabled="1"
3224+
data-emit-metadata="0"
3225+
data-input-position="bottom"
3226+
data-theme="dark"
3227+
data-lang="en"
3228+
crossorigin="anonymous"
3229+
async></script>
3230+
32733231
<script src="/nav.js" defer></script>
32743232
</body>
32753233
</html>

0 commit comments

Comments
 (0)