feat: Add book viewer at /book with shared design system

- Add html/index.html: book viewer with auto-discovering sidebar,
  prev/next navigation, keyboard shortcuts, and URL hash persistence
- Add html/book-page.css: shared stylesheet for all book pages derived
  from fabula-ultima-sheet.css (dark theme, CSS variables, Cinzel/
  Crimson Text fonts, common class styles)
- Add book.js entry point so webpack injects the shared CSS into the
  book viewer; update webpack.config.js for two entry points, split
  CSS chunk, CopyWebpackPlugin for book pages, and /book dev server
  rewrite rule
- Add scripts/strip_watermark.py: removes "Guest Customer (Order
  #52072168)" watermark artifacts from all 210 book pages
- Add scripts/restyle_book.py: strips per-page <style> blocks and
  injects <link rel="stylesheet" href="book-page.css"> into all pages
- Update Justfile deploy to scp -r dist/* for the new /book subtree

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-06 03:36:35 +00:00
parent 58552b536f
commit c75cd188c1
220 changed files with 12685 additions and 10 deletions

49
html/205.html Normal file
View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>The Heart of the Forest</title>
<link rel="stylesheet" href="book-page.css">
</head>
<body>
<h1>ELDGRENS TACTICS: THE HEART OF THE FOREST</h1>
<p>In this phase, the characters are face-to-face with the pulsing Heart of the Forest, and at last they have the chance to heal it, removing the mysterious and invisible parasite that infested it.</p>
<h2>Core Conflict Mechanics</h2>
<div class="mechanic-rule">
<h3>The Heart's Limitations</h3>
<p>This conflict is based upon a special rule designed to showcase the narrative through the game mechanics:</p>
<ul>
<li>The Heart enters the scene with current Hit Points equal to <strong>1</strong> and its Hit Points cannot go below 1.</li>
<li>If the Hearts current Hit Points become equal to or greater than 480, it loses all Ultima Points and Surrenders immediately.</li>
</ul>
</div>
<div class="mechanic-rule">
<h3>Slumbering Hope Clock</h3>
<p>This scene also includes a “Slumbering Hope” Clock with <strong>4 sections</strong>, visible to all participants. This Clock can be filled or emptied only in the following ways:</p>
<ul>
<li>When a Player Character present on the scene spends 1 Fabula Point to invoke a Theme of Belonging, Hope, Justice or Mercy, fill 1 section of the Clock.</li>
<li>At the start of the fourth enemy turn (see below) of the round, if the Clock is full, empty it. If you do, the Heart regains <strong>40 Hit Points</strong> and <strong>40 Mind Points</strong>, and it doesnt perform any action this turn.</li>
</ul>
</div>
<h2>The Heart's Strict Cycle of Play</h2>
<p>The Heart follows a very strict cycle of play:</p>
<ul>
<li><strong>On the first enemy turn:</strong> The Heart uses <em>Flame of Remembrance</em> during odd-numbered rounds or <em>Avenging Miasma</em> during even-numbered rounds, both against random targets.</li>
<li><strong>On the second enemy turn:</strong> If it has enough Mind Points, the Heart uses <em>Aura of Desperation</em> during odd-numbered rounds, or <em>Ashen Breath</em> during even-numbered rounds. If it lacks the required Mind Points, it uses <em>Avenging Miasma</em> against random targets.</li>
<li><strong>On the third enemy turn:</strong> The Heart uses <em>Ancient Vitality</em> or, if it doesnt have enough Mind Points, a Recovery action. If it doesnt have any Ultima Points left, it uses <em>Flame of Remembrance</em> against a random target.</li>
<li><strong>On the fourth enemy turn:</strong> Check the “Slumbering Hope” Clock (see above). If the Clock isnt empty and the Heart is not in Crisis, it uses <em>Parasite Grasp</em>. If the Heart is in Crisis and/or it doesnt have enough Mind Points, it uses <em>Flame of Remembrance</em> against a random target.</li>
</ul>
</body>
</html>