feat: Multiple book improvements

- Format spell tables like they are in the book
- Add permalinks to headers
- Formatting
- Book-wide search
This commit is contained in:
2026-06-26 20:50:14 -04:00
parent 7f81f85735
commit 5327b524d2
30 changed files with 25674 additions and 21123 deletions

View File

@@ -18,17 +18,26 @@
<tr> <tr>
<td>Minor</td> <td>Minor</td>
<td>5</td> <td>5</td>
<td>Enemy commanders, unique and infamous monsters, and antagonists causing trouble in small settlements.</td> <td>
Enemy commanders, unique and infamous monsters, and antagonists causing
trouble in small settlements.
</td>
</tr> </tr>
<tr> <tr>
<td>Major</td> <td>Major</td>
<td>10</td> <td>10</td>
<td>Tyrants, powerful mages, legendary creatures, and entities that threaten entire countries.</td> <td>
Tyrants, powerful mages, legendary creatures, and entities that threaten
entire countries.
</td>
</tr> </tr>
<tr> <tr>
<td>Supreme</td> <td>Supreme</td>
<td>15</td> <td>15</td>
<td>Archdemons, immortal entities, and alien deities bent on destruction or domination.</td> <td>
Archdemons, immortal entities, and alien deities bent on destruction or
domination.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@@ -44,25 +53,33 @@
<tbody> <tbody>
<tr> <tr>
<td>Escape</td> <td>Escape</td>
<td>A Villain may spend 1 Ultima Point to safely leave the scene — the Game Master describes how they do so, <td>
perhaps leaving a few henchmen behind to "keep the heroes company".</td> A Villain may spend 1 Ultima Point to safely leave the scene — the Game
Master describes how they do so, perhaps leaving a few henchmen behind
to "keep the heroes company".
</td>
</tr> </tr>
<tr> <tr>
<td>Invoke Trait</td> <td>Invoke Trait</td>
<td>After performing a Check, a Villain may spend 1 Ultima Point to invoke one of their Traits and reroll one or <td>
both dice (this follows the same rules seen on <a href="/books/core/#page-46">page 46</a>).</td> After performing a Check, a Villain may spend 1 Ultima Point to invoke
one of their Traits and reroll one or both dice (this follows the same
rules seen on <a href="/books/core/#page-46">page 46</a>).
</td>
</tr> </tr>
<tr> <tr>
<td>Recovery</td> <td>Recovery</td>
<td>A Villain may use an action and spend 1 Ultima Point to recover from all status effects and also recover 50 <td>
Mind Points.</td> A Villain may use an action and spend 1 Ultima Point to recover from all
status effects and also recover 50 Mind Points.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p> <p>
While Player Characters can gain Fabula Points in several ways, Villains While Player Characters can gain Fabula Points in several ways, Villains
cannot recharge their Ultima Points — in a way, they represent the Villain's cannot recharge their Ultima Points — in a way, they represent the Villain's
determination and will to pursue their objectives. A Villain with no determination and will to pursue their objectives. A Villain with no remaining
remaining Ultima Points is no longer a Villain and becomes equivalent to any Ultima Points is no longer a Villain and becomes equivalent to any other NPC;
other NPC; alternatively, they may choose to escalate (see next page). alternatively, they may choose to escalate (see next page).
</p> </p>

View File

@@ -1,22 +1,20 @@
<h2>SHOULD THIS VILLAIN ESCALATE?</h2> <h2>SHOULD THIS VILLAIN ESCALATE?</h2>
<p> <p>
When choosing whether a Villain will escalate, the Game Master should When choosing whether a Villain will escalate, the Game Master should consider
consider the antagonist's importance within the story, their personality, the antagonist's importance within the story, their personality, and the way
and the way the heroes chose to confront them: a Villain's escalation shows the heroes chose to confront them: a Villain's escalation shows that the
that the heroes might win a conflict but still make the situation worse. heroes might win a conflict but still make the situation worse.
</p> </p>
<p> <p>
Most of the time it's best to simply let a Villain be defeated: maybe their Most of the time it's best to simply let a Villain be defeated: maybe their
resolve is broken, maybe they even realized they were wrong and will turn resolve is broken, maybe they even realized they were wrong and will turn into
into an ally. an ally.
</p> </p>
<p> <p>
Escalating your Villains sparingly will make them more memorable and also Escalating your Villains sparingly will make them more memorable and also
ensure that Players feel like their actions have an impact on the world. ensure that Players feel like their actions have an impact on the world.
</p> </p>
<p> <p>In general, you should only have two to four escalations per campaign.</p>
In general, you should only have two to four escalations per campaign.
</p>
<h2>VILLAIN AND FABULA POINTS</h2> <h2>VILLAIN AND FABULA POINTS</h2>
<p> <p>
@@ -26,32 +24,32 @@
<ul> <ul>
<li> <li>
<strong>Multiple identities.</strong> If a Villain has more than one <strong>Multiple identities.</strong> If a Villain has more than one
identity, the heroes only receive Fabula Points when they appear using identity, the heroes only receive Fabula Points when they appear using their
their "antagonist persona". Once the deception is exposed, however, they "antagonist persona". Once the deception is exposed, however, they will
will begin awarding Fabula Points every time they appear on a scene, begin awarding Fabula Points every time they appear on a scene, whether
whether disguised or else. disguised or else.
</li> </li>
<li> <li>
<strong>Multiple Villains.</strong> If two or more Villains appear during <strong>Multiple Villains.</strong> If two or more Villains appear during
the same scene, each Player Character will gain 1 Fabula Point per the same scene, each Player Character will gain 1 Fabula Point per Villain,
Villain, up to a maximum of 3 Fabula Points per Player Character earned up to a maximum of 3 Fabula Points per Player Character earned this way
this way during the same scene. during the same scene.
</li> </li>
<li> <li>
<strong>Back-to-back scenes with Villains.</strong> If a Villain's <strong>Back-to-back scenes with Villains.</strong> If a Villain's presence
presence extends for several consecutive scenes, the Player Characters extends for several consecutive scenes, the Player Characters only gain 1
only gain 1 Fabula Point at the beginning, and no additional Fabula Points Fabula Point at the beginning, and no additional Fabula Points for the
for the following scenes. following scenes.
</li> </li>
</ul> </ul>
<p> <p>
Whenever the heroes are running low on Fabula Points, the Game Master should Whenever the heroes are running low on Fabula Points, the Game Master should
run a Game Master scene and show a Villain in action — this is a great way run a Game Master scene and show a Villain in action — this is a great way to
to push the story forward while also giving the heroes a bit more "fuel". push the story forward while also giving the heroes a bit more "fuel".
</p> </p>
<blockquote> <blockquote>
<p> <p>
Great evil is born when good intentions are met with mistrust and despair. Great evil is born when good intentions are met with mistrust and despair.
</p> </p>
</blockquote> </blockquote>

View File

@@ -1,89 +1,95 @@
<h1>ELEMENTALIST SPELLS</h1> <h2>Elementalist Spells</h2>
<h2>SPELL</h2> <table>
<div class="spell-entry"> <thead>
<h3>Elemental Shroud</h3> <tr>
<p><strong>Cost:</strong> 5</p> <th>Name</th>
<p><strong>Targets:</strong> T</p> <th>Cost</th>
<p><strong>Duration:</strong> Up to three creatures</p> <th>Targets</th>
<p><strong>Action:</strong> Scene</p> <th>Duration</th>
<p> </tr>
You weave magical energy and protect the targets from the fury of the </thead>
elements. <tbody>
</p> <tr>
<p> <td>Elemental Shroud</td>
Choose a damage type: air, bolt, earth, fire or ice. Until this spell ends, <td>5 x T</td>
each target gains Resistance against the chosen damage type. <td>Up to three creatures</td>
</p> <td>scene</td>
</div> </tr>
<div class="spell-entry"> <tr>
<h3>Elemental Weapon</h3> <td colspan="4">
<p><strong>Cost:</strong> 10</p> You weave magical energy and protect the targets from the fury of the
<p><strong>Targets:</strong> One weapon</p> elements. Choose a damage type: air, bolt, earth, fire or ice. Until
<p><strong>Duration:</strong> Scene</p> this spell ends, each target gains Resistance against the chosen damage
<p> type.
You imbue a weapon with elemental energy. Choose a damage type: air, bolt, </td>
earth, fire, or ice. Until this spell ends, all damage dealt by the weapon </tr>
becomes of the chosen damage type. <tr>
</p> <td>Elemental Weapon</td>
<ul> <td>10</td>
<li> <td>One weapon</td>
If you have that weapon equipped while you cast this spell, you may <td>Scene</td>
perform a free attack with it as part of the same action. </tr>
</li> <tr>
<li> <td colspan="4">
This spell can only be cast on a weapon equipped by a willing creature. You imbue a weapon with elemental energy. Choose a damage type: air,
</li> bolt, earth, fire, or ice. Until this spell ends, all damage dealt by
</ul> the weapon becomes of the chosen damage type. If you have that weapon
</div> equipped while you cast this spell, you may perform a free attack with
<div class="spell-entry"> it as part of the same action. This spell can only be cast on a weapon
<h3>Flare</h3> equipped by a willing creature.
<p><strong>Cost:</strong> rr 20</p> </td>
<p><strong>Targets:</strong> One creature</p> </tr>
<p><strong>Duration:</strong> Instantaneous</p> <tr>
<p> <td>Flare</td>
You channel a single ray of fire towards your foe, its temperature so high <td>20</td>
that it will pierce through most defenses. The target suffers <td>One creature</td>
<strong>【HR + 25】</strong> fire damage. <td>Instantaneous</td>
</p> </tr>
<p>Damage dealt by this spell ignores Resistances.</p> <tr>
</div> <td colspan="4">
<div class="spell-entry"> You channel a single ray of fire towards your foe, its temperature so
<h3>Fulgur</h3> high that it will pierce through most defenses. The target suffers【 HR
<p><strong>Cost:</strong> rr 10</p> + 25】 fire damage. Damage dealt by this spell ignores Resistances.
<p><strong>Targets:</strong> × T</p> </td>
<p><strong>Duration:</strong> Up to three creatures</p> </tr>
<p><strong>Action:</strong> Instantaneous</p> <tr>
<p> <td>Fulgur</td>
You weave electricity into a wave of crackling bolts. Each target hit by <td>10 x T</td>
this spell suffers <strong>【HR + 15】</strong> bolt damage. <td>Up to three creatures</td>
</p> <td>Instantaneous</td>
<p class="opportunity"> </tr>
<strong>Opportunity:</strong> Each target hit by this spell suffers dazed. <tr>
</p> <td colspan="4">
</div> You weave electricity into a wave of crackling bolts. Each target hit by
<div class="spell-entry"> this spell suffers 【HR + 15】 bolt damage. Opportunity: Each target hit
<h3>Glacies</h3> by this spell suffers dazed.
<p><strong>Cost:</strong> rr 10</p> </td>
<p><strong>Targets:</strong> × T</p> </tr>
<p><strong>Duration:</strong> Up to three creatures</p> <tr>
<p><strong>Action:</strong> Instantaneous</p> <td>Glacies</td>
<p> <td>10 x T</td>
You coat your foes under a thick layer of frost. Each target hit by this <td>Up to three creatures</td>
spell suffers <strong>【HR + 15】</strong> ice damage. <td>Instantaneous</td>
</p> </tr>
<p class="opportunity"> <tr>
<strong>Opportunity:</strong> Each target hit by this spell suffers slow. <td colspan="4">
</p> You coat your foes under a thick layer of frost. Each target hit by this
</div> spell suffers【 HR + 15】 ice damage. Opportunity: Each target hit by
<div class="spell-entry"> this spell suffers slow.
<h3>Iceberg</h3> </td>
<p><strong>Cost:</strong> rr 20</p> </tr>
<p><strong>Targets:</strong> One creature</p> <tr>
<p><strong>Duration:</strong> Instantaneous</p> <td>Iceberg</td>
<p> <td>20</td>
A pillar of ice magic envelops your foe, suddenly dropping their body <td>One creature</td>
temperature to a critical level. The target suffers <td>Instantaneous</td>
<strong>【HR + 25】</strong> ice damage. </tr>
</p> <tr>
<p>Damage dealt by this spell ignores Resistances.</p> <td colspan="4">
</div> A pillar of ice magic envelops your foe, suddenly dropping their body
temperature to a critical level. The target suffers【 HR + 25】 ice
damage. Damage dealt by this spell ignores Resistances.
</td>
</tr>
</tbody>
</table>

View File

@@ -1,91 +1,97 @@
<div> <h2>Elementalist Spells (Cont.)</h2>
<h2>Spell Catalogue</h2>
<section> <table>
<h3>Ignis</h3> <thead>
<p> <tr>
<strong>Metadata:</strong> rr 10 × T | Up to three creatures | <th>Name</th>
Instantaneous <th>Cost</th>
</p> <th>Targets</th>
<p> <th>Duration</th>
You unleash a searing barrage against your foes, conjuring flames out of </tr>
thin air. Each target hit by this spell suffers </thead>
<strong>【HR + 15】 fire damage</strong>. <tbody>
</p> <tr>
<p><em>Opportunity:</em> Each target hit by this spell suffers shaken.</p> <td>Ignis</td>
</section> <td>10 x T</td>
<section> <td>Up to three creatures</td>
<h3>Soaring Strike</h3> <td>Instantaneous</td>
<p><strong>Metadata:</strong> 10 | Self | Instantaneous</p> </tr>
<p> <tr>
The wind carries your strikes across the battlefield. You may immediately <td colspan="4">
perform a free attack with a melee weapon you have equipped. This attack You unleash a searing barrage against your foes, conjuring flames out of
may target creatures that can only be targeted by ranged attacks. thin air. Each target hit by this spell suffers【 HR + 15】 fire damage.
</p> Opportunity: Each target hit by this spell suffers shaken.
<ul> </td>
<li> </tr>
If you used a weapon belonging to the brawling or spear Category for <tr>
this attack, it deals 5 extra damage. <td>Soaring Strike</td>
</li> <td>10</td>
<li> <td>Self</td>
If you hit a flying target with this attack, you may force them to land <td>Instantaneous</td>
immediately. </tr>
</li> <tr>
</ul> <td colspan="4">
</section> The wind carries your strikes across the battlefield. You may
<section> immediately perform a free attack with a melee weapon you have equipped.
<h3>Terra</h3> This attack may target creatures that can only be targeted by ranged
<p> attacks. If you used a weapon belonging to the brawling or spear
<strong>Metadata:</strong> rr 10 × T | Up to three creatures | Category for this attack, it deals 5 extra damage. If you hit a flying
Instantaneous target with this attack, you may force them to land immediately.
</p> </td>
<p> </tr>
Spires of jagged rock erupt from the ground beneath your foes, closing <tr>
around them. Each target hit by this spell suffers <td>Terra</td>
<strong>【HR + 15】 earth damage</strong>. This spell cannot target <td>10 x T</td>
creatures who are flying, floating, falling, or otherwise in mid-air. <td>Up to three creatures</td>
</p> <td>Instantaneous</td>
<p> </tr>
<em>Opportunity:</em> Each target hit by this spell performs one fewer <tr>
action on their next turn (to a minimum of 0 actions). <td colspan="4">
</p> Spires of jagged rock erupt from the ground beneath your foes, closing
</section> around them. Each target hit by this spell suffers【 HR + 15】 earth
<section> damage. This spell cannot target creatures who are flying, floating,
<h3>Thunderbolt</h3> falling, or otherwise in mid-air. Opportunity: Each target hit by this
<p><strong>Metadata:</strong> rr 20 | One creature | Instantaneous</p> spell performs one fewer action on their next turn (to a minimum of 0
<p> actions).
You send lightning striking at your foe. The target suffers </td>
<strong>【HR + 25】 bolt damage</strong>. </tr>
</p> <tr>
<p>Damage dealt by this spell ignores Resistances.</p> <td>Thunderbolt</td>
</section> <td>20</td>
<section> <td>One creature</td>
<h3>Ventus</h3> <td>Instantaneous</td>
<p> </tr>
<strong>Metadata:</strong> rr 10 × T | Up to three creatures | <tr>
Instantaneous <td colspan="4">
</p> You send lightning striking at your foe. The target suffers【 HR + 25】
<p> bolt damage. Damage dealt by this spell ignores Resistances.
You summon the power of winds against your enemy. Each target hit by this </td>
spell suffers <strong>【HR + 15】 air damage</strong>. </tr>
</p> <tr>
<p> <td>Ventus</td>
<em>Opportunity:</em> Each flying target hit by this spell is forced to <td>10 x T</td>
land immediately. <td>One creature</td>
</p> <td>Instantaneosu</td>
</section> </tr>
<section> <tr>
<h3>Vortex</h3> <td colspan="4">
<p><strong>Metadata:</strong> 10 | Self | Scene</p> You summon the power of winds against your enemy. Each target hit by
<p> this spell suffers【 HR + 15】 air damage. Opportunity: Each flying
A roaring gale surrounds you, blowing away arrows and bullets. Until this target hit by this spell is forced to land immediately.
spell ends, you gain a +2 bonus to your Defense against ranged attacks. </td>
</p> </tr>
</section> <tr>
<aside> <td>Vortex</td>
<h4>Notes</h4> <td>10</td>
<p> <td>Self</td>
<strong>cc</strong> Spells marked with <code>rr</code> are offensive <td>Scene</td>
spells and require Magic Checks! </tr>
</p> <tr>
</aside> <td colspan="4">
</div> A roaring gale surrounds you, blowing away arrows and bullets. Until
this spell ends, you gain a +2 bonus to your Defense against ranged
attacks.
</td>
</tr>
</tbody>
</table>

View File

@@ -1,98 +1,112 @@
<h1>Spell List</h1> <h2>Entropist Spells</h2>
<section> <table>
<h2>Acceleration</h2> <thead>
<p> <tr>
<strong>Cost:</strong> 20 | <strong>Type:</strong> One creature | <th>Name</th>
<strong>Scene:</strong> <th>Cost</th>
</p> <th>Targets</th>
<p> <th>Duration</th>
You bend the fabric of time. Until this spell ends, the target gains the </tr>
ability to perform a single additional action during each of their turns. </thead>
Once the target has performed a total of two additional actions granted by <tbody>
this spell, this spell ends. <tr>
</p> <td>Acceleration</td>
</section> <td>20</td>
<section> <td>One creature</td>
<h2>Anomaly</h2> <td>Scene</td>
<p> </tr>
<strong>Cost:</strong> 20 | <strong>Type:</strong> One creature | <tr>
<strong>Scene:</strong> <td colspan="4">
</p> You bend the fabric of time. Until this spell ends, the target gains the
<p> ability to perform a single additional action during each of their
You alter the very nature of your target. Until this spell ends, if the turns. Once the target has performed a total of two additional actions
target would suffer damage of a type they Absorb or are Immune to, they are granted by this spell, this spell ends.
instead treated as if they were Vulnerable to that damage type. Once that </td>
happens, this spell ends. </tr>
</p> <tr>
</section> <td>Anomaly</td>
<section> <td>20</td>
<h2>Dark Weapon</h2> <td>One creature</td>
<p> <td>Scene</td>
<strong>Cost:</strong> 10 | <strong>Type:</strong> One equipped weapon | </tr>
<strong>Scene:</strong> <tr>
</p> <td colspan="4">
<p> You alter the very nature of your target. Until this spell ends, if the
You imbue a weapon with dark energy. Until this spell ends, all damage dealt target would suffer damage of a type they Absorb or are Immune to, they
by the weapon becomes of the dark type. If you have that weapon equipped are instead treated as if they were Vulnerable to that damage type. Once
while you cast this spell, you may perform a free attack with it as part of that happens, this spell ends.
the same action. </td>
</p> </tr>
<p class="restrictions"> <tr>
<em <td>Dark Weapon</td>
>This spell can only be cast on a weapon equipped by a willing <td>10</td>
creature.</em <td>One equipped weapon</td>
> <td>Scene</td>
</p> </tr>
</section> <tr>
<section> <td colspan="4">
<h2>Dispel</h2> You imbue a weapon with dark energy. Until this spell ends, all damage
<p> dealt by the weapon becomes of the dark type. If you have that weapon
<strong>Cost:</strong> 10 | <strong>Type:</strong> One creature | equipped while you cast this spell, you may perform a free attack with
<strong>Instantaneous:</strong> it as part of the same action. This spell can only be cast on a weapon
</p> equipped by a willing creature.
<p> </td>
You release a wave of negative energy and cleanse all magic from a creature. </tr>
If the target is affected by one or more spells with a duration of Scene, <tr>
they are no longer affected by any of those spells instead. <td>Dispel</td>
</p> <td>10</td>
</section> <td>One creature</td>
<section> <td>Instantaneous</td>
<h2>Divination</h2> </tr>
<p> <tr>
<strong>Cost:</strong> 10 | <strong>Type:</strong> Self | <td colspan="4">
<strong>Scene:</strong> You release a wave of negative energy and cleanse all magic from a
</p> creature. If the target is affected by one or more spells with a
<p> duration of Scene, they are no longer affected by any of those spells
You glimpse briefly into the future. Until this spell ends, after a creature instead.
you can see performs a Check, if it was not a fumble nor a critical success, </td>
you may force that creature to reroll both dice. Once you have forced two </tr>
rerolls this way, this spell ends. <tr>
</p> <td>Divination</td>
</section> <td>10</td>
<section> <td>Self</td>
<h2>Drain Spirit</h2> <td>Scene</td>
<p> </tr>
<strong>Cost:</strong> 5 | <strong>Type:</strong> One creature | <tr>
<strong>Instantaneous:</strong> <td colspan="4">
</p> You glimpse briefly into the future. Until this spell ends, after a
<p> creature you can see performs a Check, if it was not a fumble nor a
You consume a creature's psyche. The target loses 【HR + 15】 Mind Points. critical success, you may force that creature to reroll both dice. Once
Then, you recover an amount of Mind Points equal to half the Mind Points you have forced two rerolls this way, this spell ends.
loss they suffered (if the loss was reduced to 0 in some way, you recover </td>
none). </tr>
</p> <tr>
</section> <td>Drain Spirit</td>
<section> <td>5</td>
<h2>Drain Vigor</h2> <td>One creature</td>
<p> <td>Instantaneous</td>
<strong>Cost:</strong> 10 | <strong>Type:</strong> One creature | </tr>
<strong>Instantaneous:</strong> <tr>
</p> <td colspan="4">
<p> You consume a creature's psyche. The target loses【 HR + 15】 Mind
You steal another creature's life force. The target suffers 【HR + 15 】 Points. Then, you recover an amount of Mind Points equal to half the
dark damage. Then, you recover an amount of Hit Points equal to half the Hit Mind Points loss they suffered (if the loss was reduced to 0 in some
Points loss they suffered (if the loss was reduced to 0 in some way, you way, you recover none).
recover none). </td>
</p> </tr>
</section> <tr>
<aside class="collection-info"><h3>Entropist Spells</h3></aside> <td>Drain Vigor</td>
<td>10</td>
<td>One creature</td>
<td>Instantaneous</td>
</tr>
<tr>
<td colspan="4">
You steal another creature's life force. The target suffers【 HR + 15】
dark damage. Then, you recover an amount of Hit Points equal to half the
Hit Points loss they suffered (if the loss was reduced to 0 in some way,
you recover none).
</td>
</tr>
</tbody>
</table>

View File

@@ -1,75 +1,102 @@
<h2>Gamble up to 20</h2> <h2>Entropist Spells (Cont.)</h2>
<p><strong>Type:</strong> Special</p> <table>
<p><strong>Target:</strong> Instantaneous</p> <thead>
<p class="duration"> <tr>
You summon a vortex of chaotic energy. Roll your current Willpower die once <th>Name</th>
for every 10 Mind Points spent while casting this spell, then keep the single <th>Cost</th>
die you prefer: the number on that die determines the effects of this spell. <th>Targets</th>
</p> <th>Duration</th>
<ol> </tr>
<li> </thead>
<strong>1:</strong> You lose half of your current Hit Points and half of <tbody>
your current Mind Points. <tr>
</li> <td>Gamble</td>
<li> <td>Up to 20</td>
<strong>2-3:</strong> Each creature present on the scene, including <td>Special</td>
yourself, suffers poisoned. <td>Scene</td>
</li> </tr>
<li> <tr>
<strong>4-6:</strong> Each creature present on the scene, including <td colspan="4">
yourself, suffers slow. You summon a vortex of chaotic energy. Roll your current Willpower die
</li> once for every 10 Mind Points spent while casting this spell, then keep
<li> the single die you prefer: the number on that die determines the effects
<strong>7-8:</strong> Choose up to three creatures you can see: each of them of this spell.
recovers 50 Hit Points and also recovers from all status effects. <ul>
</li> <li>
<li> 1) You lose half of your current Hit Points and half of your current
<strong>9+:</strong> Choose any number of creatures you can see: each of Mind Points.
them suffers 30 damage. The damage type is determined randomly by rolling a </li>
d6: <li>
</li> 2-3) Each creature present on the scene, including yourself, suffers
<ul> poisoned.
<li>1. air</li> </li>
<li>2. bolt</li> <li>
<li>3. dark</li> 4-6) Each creature present on the scene, including yourself, suffers
<li>4. earth</li> slow.
<li>5. fire</li> </li>
<li>6. poison</li> <li>
</ul> 7-8) Choose up to three creatures you can see: each of them recovers
</ol> 50 Hit Points and also recovers from all status effects.
<h2>Mirror 10</h2> </li>
<p><strong>Type:</strong> One creature</p> <li>
<p><strong>Scene Duration:</strong> Until this spell ends</p> 9+) Choose any number of creatures you can see: each of them suffers
<p> 30 damage. The damage type is determined randomly by rolling a d6:
You twist the laws of magic. Until this spell ends, if an offensive spell is 1. air 2. bolt 3. dark 4. earth 5. fire 6. poison
cast on the target, the creature who cast that offensive spell will be </li>
targeted in their stead (any other targets of the offensive spell will be </ul>
targeted as normal). Once that happens, this spell ends. </td>
</p> </tr>
<h2>Omega rr 20</h2> <tr>
<p><strong>Type:</strong> One creature</p> <td>Mirror</td>
<p><strong>Duration:</strong> Instantaneous</p> <td>10</td>
<p> <td>One creature</td>
You invoke doom on your foe, turning strength into frailty. The target loses <td>Scene</td>
an amount of Hit Points equal to </tr>
<code>【20 + half the target's level】</code>. <tr>
</p> <td colspan="4">
<h2>Stop rr 10</h2> You twist the laws of magic. Until this spell ends, if an offensive (r)
<p><strong>Type:</strong> One creature</p> spell is cast on the target, the creature who cast that offensive spell
<p><strong>Duration:</strong> Instantaneous</p> will be targeted in their stead (any other targets of the offensive
<p> spell will be targeted as normal). Once that happens, this spell ends.
You trap a foe inside a circle of altered time and space. The target will </td>
perform one fewer action on their next turn (to a minimum of 0 actions). </tr>
</p> <tr>
<h2>Umbra rr 10 × T</h2> <td>Omega</td>
<p><strong>Type:</strong> Up to three creatures</p> <td>20</td>
<p><strong>Duration:</strong> Instantaneous</p> <td>One creature</td>
<p> <td>Instantaneous</td>
A storm of dark energy turns matter into ash. Each target hit by this spell </tr>
suffers <code>【HR + 15】</code> dark damage. <tr>
</p> <td colspan="4">
<p><em>Opportunity:</em> Each target hit by this spell suffers weak.</p> You invoke doom on your foe, turning strength into frailty. The target
<h3>Notes</h3> loses an amount of Hit Points equal to【 20 + half the target's level】
<ul> </td>
<li>Spells marked with rr are offensive spells and require Magic Checks!</li> </tr>
</ul> <tr>
<td>Stop</td>
<td>10</td>
<td>One creature</td>
<td>Instantaneous</td>
</tr>
<tr>
<td colspan="4">
You trap a foe inside a circle of altered time and space. The target
will perform one fewer action on their next turn (to a minimum of 0
actions).
</td>
</tr>
<tr>
<td>Umbra</td>
<td>10 x T</td>
<td>Up to three creatures</td>
<td>Scene</td>
</tr>
<tr>
<td colspan="4">
A storm of dark energy turns matter into ash. Each target hit by this
spell suffers 【HR + 15】 dark damage. Opportunity: Each target hit by
this spell suffers weak.
</td>
</tr>
</tbody>
</table>

View File

@@ -0,0 +1 @@
<em> This page is intentionally left blank. </em>

View File

@@ -1,20 +1,20 @@
<h1>Spiritist</h1> <h1>Spiritist</h1>
<section> <p><strong>ALSO:</strong> Healer, Priest, Witch</p>
<h2>Related Terms</h2>
<p><strong>ALSO:</strong> Healer, Priest, Witch</p> <h3>Definition</h3>
<div class="motto-block"><em>"Show me the truths of your heart."</em></div>
<h3>Definition</h3> <p>
<p> Spiritists have developed a powerful connection with the raw aspects of soul:
Spiritists have developed a powerful connection with the raw aspects of emotion, energy, life, and death. They wield power both miraculous and
soul: emotion, energy, life, and death. They wield power both miraculous and frightening, and are quite often affiliated with cults or religions.
frightening, and are quite often affiliated with cults or religions. </p>
</p>
</section> <h3>Nature of Abilities</h3>
<section class="further-details">
<h3>Nature of Abilities</h3> <p>
<p> Several worlds see the powers of Spiritism as gifts from a deity or proof that
Several worlds see the powers of Spiritism as gifts from a deity or proof a person's heart is pure; however, there is no definite proof of these
that a person's heart is pure; however, there is no definite proof of these abilities coming from anything but discipline, empathy, and focus.
abilities coming from anything but discipline, empathy, and focus. </p>
</p>
</section> <blockquote>Show me the truths of your heart.</blockquote>

View File

@@ -1,14 +1,17 @@
<h1>SPIRITIST BENEFITS AND SKILLS</h1> <h2>SPIRITIST BENEFITS AND SKILLS</h2>
<h2>Free Benefits</h2>
<h3>Free Benefits:</h3>
<ul> <ul>
<li>Permanently increase your maximum Mind Points by 5.</li> <li>Permanently increase your maximum Mind Points by 5.</li>
<li> <li>
You may perform Rituals whose effects fall within the Ritualism discipline. You may perform Rituals whose effects fall within the Ritualism discipline.
</li> </li>
</ul> </ul>
<hr />
<h2>SPIRITIST SKILLS</h2> <h3>SPIRITIST SKILLS</h3>
<h3>HEALING POWER (çç2)</h3>
<h4>HEALING POWER</h4>
<p> <p>
When you cast a spell that targets one or more allies, if you have an arcane When you cast a spell that targets one or more allies, if you have an arcane
weapon equipped, you may have each of those allies recover an amount of Hit weapon equipped, you may have each of those allies recover an amount of Hit
@@ -16,25 +19,29 @@
<strong>【SL, multiplied by the number of Bonds you have】</strong>. This <strong>【SL, multiplied by the number of Bonds you have】</strong>. This
healing is separate from any healing caused by the effects of the spell. healing is separate from any healing caused by the effects of the spell.
</p> </p>
<h3>RITUAL SPIRITISM</h3>
<h4>RITUAL SPIRITISM</h4>
<p> <p>
You may perform Rituals whose effects fall within the Spiritism discipline. You may perform Rituals whose effects fall within the Spiritism discipline.
Spiritism Rituals use <strong>【INS + WLP】</strong> for the Magic Check. Spiritism Rituals use <strong>【INS + WLP】</strong> for the Magic Check.
</p> </p>
<h3>SPIRITUAL MAGIC (çç10)</h3>
<h4>SPIRITUAL MAGIC (çç10)</h4>
<p> <p>
Each time you acquire this Skill, learn one Spiritist spell (see next two Each time you acquire this Skill, learn one Spiritist spell (see next two
pages). Offensive Spiritist spells use <strong>【INS + WLP】</strong> for the pages). Offensive Spiritist spells use <strong>【INS + WLP】</strong> for the
Magic Check. Magic Check.
</p> </p>
<h3>SUPPORT MAGIC</h3>
<h4>SUPPORT MAGIC</h4>
<p> <p>
When you cast a spell that targets one or more allies, if you have an arcane When you cast a spell that targets one or more allies, if you have an arcane
weapon equipped, you may choose one of those allies you have a Bond towards. weapon equipped, you may choose one of those allies you have a Bond towards.
If you do, that ally gains a bonus to the next Check they perform during the If you do, that ally gains a bonus to the next Check they perform during the
current scene; this bonus is equal to the strength of your Bond towards them. current scene; this bonus is equal to the strength of your Bond towards them.
</p> </p>
<h3>VISMAGUS</h3>
<h4>VISMAGUS</h4>
<p> <p>
When you cast a spell, if you don't have enough Mind Points to pay for its When you cast a spell, if you don't have enough Mind Points to pay for its
total cost, you may choose to spend twice as many Hit Points instead. You total cost, you may choose to spend twice as many Hit Points instead. You
@@ -42,7 +49,7 @@
cast this way would cause you to recover Hit Points, you instead recover no cast this way would cause you to recover Hit Points, you instead recover no
Hit Points (the spell functions normally on any other target). Hit Points (the spell functions normally on any other target).
</p> </p>
<hr />
<h2>Background Prompts</h2> <h2>Background Prompts</h2>
<ul> <ul>
<li> <li>
@@ -58,4 +65,5 @@
</li> </li>
<li>What does your magic look like?</li> <li>What does your magic look like?</li>
</ul> </ul>
<p>Show me the truths of your heart.</p>
<blockquote>Show me the truths of your heart.</blockquote>

View File

@@ -1,63 +1,95 @@
<h1>SPIRITIST SPELLS</h1> <h2>Spiritist Spells</h2>
<h2>Aura</h2> <table>
<p> <thead>
<strong>Cost:</strong> 5 × T | <strong>Targets:</strong> Up to three creatures <tr>
| <strong>Duration:</strong> Scene <th>Name</th>
</p> <th>Cost</th>
<p> <th>Targets</th>
You project your soul outside your body and direct it to surround the targets, <th>Duration</th>
shielding them from dangerous magic. Until this spell ends, each target may </tr>
treat their Magic Defense as being equal to 12 against any effects that target </thead>
it (they are still free to use their normal Defense score if higher than 12). <tbody>
</p> <tr>
<h2>Awaken</h2> <td>Aura</td>
<p> <td>5 x T</td>
<strong>Cost:</strong> 20 | <strong>Targets:</strong> One creature | <td>Up to three creatures</td>
<strong>Duration:</strong> Scene <td>scene</td>
</p> </tr>
<p> <tr>
You allow a creature to focus their vital energy into accomplishing what they <td colspan="4">
previously could not. Choose one Attribute: Dexterity, Insight, Might, or You project your soul outside your body and direct it to surround the
Willpower. Until this spell ends, the target treats the chosen Attribute as if targets, shielding them from dangerous magic. Until this spell ends,
it were one die size higher (up to a maximum of d12). each target may treat their Magic Defense as being equal to 12 against
</p> any effects that target it (they are still free to use their normal
<h2>Barrier</h2> Defense score if higher than 12).
<p> </td>
<strong>Cost:</strong> 5 × T | <strong>Targets:</strong> Up to three creatures </tr>
| <strong>Duration:</strong> Scene <tr>
</p> <td>Awaken</td>
<p> <td>20</td>
You project your soul outside your body and weave it into a barrier to protect <td>One creature</td>
the targets from attacks. Until this spell ends, each target may treat their <td>scene</td>
Defense as being equal to 12 against any effects that target it (they are </tr>
still free to use their normal Defense score if higher than 12). <tr>
</p> <td colspan="4">
<h2>Cleanse</h2> You allow a creature to focus their vital energy into accomplishing what
<p> they previously could not. Choose one Attribute: Dexterity, Insight,
<strong>Cost:</strong> 5 × T | <strong>Targets:</strong> Up to three creatures Might, or Willpower. Until this spell ends, the target treats the chosen
| <strong>Duration:</strong> Instantaneous Attribute as if it were one die size higher (up to a maximum of d12).
</p> </td>
<p> </tr>
You strengthen and purify the soul energy coursing through your companions. <tr>
Each target recovers from all status effects. <td>Barrier</td>
</p> <td>5 x T</td>
<h2>Enrage</h2> <td>Up to three creatures</td>
<p> <td>scene</td>
<strong>Cost:</strong> rr 10 | <strong>Targets:</strong> One creature | </tr>
<strong>Duration:</strong> Instantaneous <tr>
</p> <td colspan="4">
<p> You project your soul outside your body and weave it into a barrier to
You cause a creature to lose any semblance of temper and act brazenly. The protect the targets from attacks. Until this spell ends, each target may
target suffers enraged and cannot perform the Guard or Spell actions during treat their Defense as being equal to 12 against any effects that target
their next turn. it (they are still free to use their normal Defense score if higher than
</p> 12).
<h2>Hallucination</h2> </td>
<p> </tr>
<strong>Cost:</strong> rr 5 × T | <strong>Targets:</strong> Up to three <tr>
creatures | <strong>Duration:</strong> Instantaneous <td>Cleanse</td>
</p> <td>5 x T</td>
<p> <td>Up to three creatures</td>
You alter the senses of your enemies, causing them to experience bizarre or <td>Instantaneous</td>
frightening hallucinations. Choose dazed or shaken: you inflict the chosen </tr>
status effect on each target hit by this spell. <tr>
</p> <td colspan="4">
You strengthen and purify the soul energy coursing through your
companions. Each target recovers from all status effects.
</td>
</tr>
<tr>
<td>Enrage</td>
<td>rr 10</td>
<td>One creature</td>
<td>Instantaneous</td>
</tr>
<tr>
<td colspan="4">
You cause a creature to lose any semblance of temper and act brazenly.
The target suffers enraged and cannot perform the Guard or Spell actions
during their next turn.
</td>
</tr>
<tr>
<td>Hallucination</td>
<td>rr 5 x T</td>
<td>Up to three creatures</td>
<td>Instantaneous</td>
</tr>
<tr>
<td colspan="4">
You alter the senses of your enemies, causing them to experience bizarre
or frightening hallucinations. Choose dazed or shaken: you inflict the
chosen status effect on each target hit by this spell.
</td>
</tr>
</tbody>
</table>

View File

@@ -0,0 +1,95 @@
<h2>Spiritist Spells (Cont.)</h2>
<table>
<thead>
<tr>
<th>Name</th>
<th>Cost</th>
<th>Targets</th>
<th>Duration</th>
</tr>
</thead>
<tbody>
<tr>
<td>Heal</td>
<td>10 x T</td>
<td>Up to three creatures</td>
<td>Instantaneous</td>
</tr>
<tr>
<td colspan="4">
You invigorate your companions, soothing their pain and healing their
fatigue. Each target recovers 40 Hit Points. This amount increases to 50
Hit Points if you are level 20 or higher, or to 60 Hit Points if you are
level 40 or higher.
</td>
</tr>
<tr>
<td>Lux</td>
<td>10 x T</td>
<td>Up to three creatures</td>
<td>Instantaneous</td>
</tr>
<tr>
<td colspan="4">
You focus your inner energy into a barrage of blinding soul rays. Each
target hit by this spell suffers【 HR + 15】 light damage. Opportunity:
Each target hit by this spell suffers dazed.
</td>
</tr>
<tr>
<td>Mercy</td>
<td>20</td>
<td>One creature</td>
<td>Scene</td>
</tr>
<tr>
<td colspan="4">
You strengthen the heart of a creature against suffering and despair.
Until this spell ends, if the target would be reduced to 0 Hit Points,
they are instead left standing with exactly 1 Hit Point. Once that
happens, this spell ends.
</td>
</tr>
<tr>
<td>Reinforce</td>
<td>5 x T</td>
<td>Up to three creatures</td>
<td>Scene</td>
</tr>
<tr>
<td colspan="4">
You protect the targets from attacks that would corrupt their body and
spirit. Choose dazed, enraged, poisoned, shaken, slow, or weak. Until
this spell ends, each target becomes immune to the chosen status effect.
</td>
</tr>
<tr>
<td>Soul Weapon</td>
<td>10</td>
<td>One equipped weapon</td>
<td>Scene</td>
</tr>
<tr>
<td colspan="4">
You imbue a weapon with the cleansing energy of your spirit. Until this
spell ends, all damage dealt by the weapon becomes of the light type. If
you have that weapon equipped while you cast this spell, you may perform
a free attack with it as part of the same action. This spell can only be
cast on a weapon equipped by a willing creature.
</td>
</tr>
<tr>
<td>Torpor</td>
<td>5 x T</td>
<td>Up to three creatures</td>
<td>Instantaneous</td>
</tr>
<tr>
<td colspan="4">
You smother the soul energy coursing through the bodies of your foes,
hindering their movements. Choose slow or weak: you inflict the chosen
status effect on each target hit by this spell.
</td>
</tr>
</tbody>
</table>

View File

@@ -41,7 +41,6 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Blessed Mace</b></td> <td><b>Blessed Mace</b></td>
@@ -72,8 +71,11 @@
<td>【HR + 6】light</td> <td>【HR + 6】light</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ You gain a +2 bonus to Magic Checks against <b>demons</b>, as well as a <td colspan="4">
<b>+2</b> bonus to Opposed Checks against <b>demons</b>.</td> Two-handed ◆ Melee ◆ You gain a +2 bonus to Magic Checks against
<b>demons</b>, as well as a <b>+2</b> bonus to Opposed Checks against
<b>demons</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -84,7 +86,9 @@
<td>【HR + 2】physical</td> <td>【HR + 2】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ You gain a +1 bonus to your Magic Checks.</td> <td colspan="4">
One-handed ◆ Melee ◆ You gain a +1 bonus to your Magic Checks.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -95,8 +99,10 @@
<td>【HR + 6】dark</td> <td>【HR + 6】dark</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Whenever you hit one or more creatures with this weapon, each of them loses <td colspan="4">
10 Mind Points.</td> Two-handed ◆ Melee ◆ Whenever you hit one or more creatures with this
weapon, each of them loses 10 Mind Points.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -107,8 +113,10 @@
<td>【HR + 6】air</td> <td>【HR + 6】air</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ When you hit one or more creatures with this weapon, you may recover 5 Hit <td colspan="4">
Points.</td> One-handed ◆ Melee ◆ When you hit one or more creatures with this
weapon, you may recover 5 Hit Points.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -119,8 +127,10 @@
<td>【HR + 6】physical</td> <td>【HR + 6】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Spells you cast whose effects restore Hit Points will restore 5 extra Hit <td colspan="4">
Points.</td> Two-handed ◆ Melee ◆ Spells you cast whose effects restore Hit Points
will restore 5 extra Hit Points.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -131,8 +141,10 @@
<td>【HR + 6】dark</td> <td>【HR + 6】dark</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ When you hit one or more creatures with an offensive (⚡) spell, each of them <td colspan="4">
suffers <b>shaken</b>.</td> Two-handed ◆ Melee ◆ When you hit one or more creatures with an
offensive (⚡) spell, each of them suffers <b>shaken</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -143,7 +155,9 @@
<td>【HR + 6】physical</td> <td>【HR + 6】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Spells you cast deal 5 extra damage.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Spells you cast deal 5 extra damage.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -154,9 +168,10 @@
<td>【HR + 10】poison</td> <td>【HR + 10】poison</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ When you hit one or more creatures with an offensive (⚡) spell, each of them <td colspan="4">
suffers <b>poisoned</b>.</td> Two-handed ◆ Melee ◆ When you hit one or more creatures with an
offensive (⚡) spell, each of them suffers <b>poisoned</b>.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -47,7 +47,6 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Hand Crossbow</b></td> <td><b>Hand Crossbow</b></td>
@@ -78,7 +77,9 @@
<td>【HR + 12】physical</td> <td>【HR + 12】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ Damage dealt by this weapon ignores Resistances.</td> <td colspan="4">
Two-handed ◆ Ranged ◆ Damage dealt by this weapon ignores Resistances.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -89,7 +90,9 @@
<td>【HR + 8】air</td> <td>【HR + 8】air</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ You are immune to <b>shaken</b>.</td> <td colspan="4">
Two-handed ◆ Ranged ◆ You are immune to <b>shaken</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -100,7 +103,9 @@
<td>【HR + 8】bolt</td> <td>【HR + 8】bolt</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ You have Resistance to <b>bolt</b> damage.</td> <td colspan="4">
Two-handed ◆ Ranged ◆ You have Resistance to <b>bolt</b> damage.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -111,8 +116,10 @@
<td>【HR + 8】fire</td> <td>【HR + 8】fire</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ When you reduce a creature to 0 Hit Points with this weapon, you may <td colspan="4">
immediately recover 2 Inventory Points.</td> Two-handed ◆ Ranged ◆ When you reduce a creature to 0 Hit Points with
this weapon, you may immediately recover 2 Inventory Points.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -123,7 +130,9 @@
<td>【HR + 12】physical</td> <td>【HR + 12】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ Attacks with this weapon have <b>multi (2)</b>.</td> <td colspan="4">
Two-handed ◆ Ranged ◆ Attacks with this weapon have <b>multi (2)</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -134,8 +143,10 @@
<td>【HR + 12】earth</td> <td>【HR + 12】earth</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ When you hit a flying target with this weapon, you may force that target to <td colspan="4">
land immediately.</td> Two-handed ◆ Ranged ◆ When you hit a flying target with this weapon, you
may force that target to land immediately.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -146,8 +157,11 @@
<td>【HR + 12】ice</td> <td>【HR + 12】ice</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ When you hit one or more creatures with this weapon, if you have at least <td colspan="4">
one <b>Bond</b> of <b>inferiority</b>, you may recover 5 MP.</td> Two-handed ◆ Ranged ◆ When you hit one or more creatures with this
weapon, if you have at least one <b>Bond</b> of <b>inferiority</b>, you
may recover 5 MP.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -158,7 +172,10 @@
<td>【HR + 12】poison</td> <td>【HR + 12】poison</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ Each target hit by this weapon suffers <b>slow</b>.</td> <td colspan="4">
Two-handed ◆ Ranged ◆ Each target hit by this weapon suffers
<b>slow</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -169,8 +186,9 @@
<td>【HR + 12】light</td> <td>【HR + 12】light</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ You have Immunity to <b>dark</b> damage.</td> <td colspan="4">
Two-handed ◆ Ranged ◆ You have Immunity to <b>dark</b> damage.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -1,186 +1,207 @@
<meta charset="UTF-8"> <meta charset="UTF-8" />
<title>Sample Rare Brawling Weapons</title> <title>Sample Rare Brawling Weapons</title>
<style> <style>
table { table {
border-collapse: collapse; border-collapse: collapse;
width: 100%; width: 100%;
} }
th { th {
/* background-color: #2d5a4e; /* background-color: #2d5a4e;
color: white; */ color: white; */
padding: 8px 12px; padding: 8px 12px;
text-align: left; text-align: left;
} }
td { td {
padding: 6px 12px; padding: 6px 12px;
vertical-align: top; vertical-align: top;
} }
tr.desc td { tr.desc td {
/* background-color: #f0f4f0; */ /* background-color: #f0f4f0; */
font-size: 0.95em; font-size: 0.95em;
} }
tr.main td { tr.main td {
border-top: 1px solid #ccc; border-top: 1px solid #ccc;
} }
.icon { .icon {
width: 48px; width: 48px;
text-align: center; text-align: center;
} }
.rare { .rare {
color: #c0392b; color: #c0392b;
} }
</style> </style>
<h2>SAMPLE RARE BRAWLING WEAPONS</h2> <h2>SAMPLE RARE BRAWLING WEAPONS</h2>
<table> <table>
<thead> <thead>
<tr> <tr>
<th colspan="2">WEAPON</th> <th colspan="2">WEAPON</th>
<th>COST</th> <th>COST</th>
<th>ACCURACY</th> <th>ACCURACY</th>
<th>DAMAGE</th> <th>DAMAGE</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="main">
<td class="icon" rowspan="2">🗡️</td>
<td><b>Nekode</b></td>
<td>250 z</td>
<td>【DEX + MIG】+1</td>
<td>【HR + 6】physical</td>
</tr>
<tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ No Quality.</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Nekode</b></td> <td><b>Hellfist</b></td>
<td>250 z</td> <td>350 z</td>
<td>【DEX + MIG】+1</td> <td>【DEX + MIG】</td>
<td>【HR + 6】physical</td> <td>【HR + 6】dark</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ No Quality.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ Attacks with this weapon target Magic Defense.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Hellfist</b></td> <td><b>Frozen Grasp</b></td>
<td>350 z</td> <td>750 z</td>
<td>【DEX + MIG】</td> <td>【DEX + MIG】</td>
<td>【HR + 6】dark</td> <td>【HR + 6】ice</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Attacks with this weapon target Magic Defense.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ You are immune to <b>enraged</b>.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Frozen Grasp</b></td> <td><b>Bear Paw</b> <span class="rare"></span></td>
<td>750 z</td> <td>850 z</td>
<td>【DEX + MIG】</td> <td>【DEX + MIG】</td>
<td>【HR + 6】ice</td> <td>【HR + 10】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ You are immune to <b>enraged</b>.</td> <td colspan="4">One-handed ◆ Melee ◆ You are immune to <b>weak</b>.</td>
</tr> </tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Bear Paw</b> <span class="rare"></span></td> <td><b>Fuel Knuckle</b></td>
<td>850 z</td> <td>950 z</td>
<td>【DEX + MIG】</td> <td>【DEX + MIG】</td>
<td>【HR + 10】physical</td> <td>【HR + 6】fire</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ You are immune to <b>weak</b>.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ You have Resistance to <b>fire</b> damage.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Fuel Knuckle</b></td> <td><b>Silver Talon</b></td>
<td>950 z</td> <td>1100 z</td>
<td>【DEX + MIG</td> <td>【DEX + DEX</td>
<td>【HR + 6】fire</td> <td>【HR + 6】light</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ You have Resistance to <b>fire</b> damage.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ You gain a +1 bonus to Magic Defense.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Silver Talon</b></td> <td><b>Old Bandages</b></td>
<td>1100 z</td> <td>1250 z</td>
<td>【DEX + DEX】</td> <td>【DEX + MIG】+1</td>
<td>【HR + 6】light</td> <td>【HR + 6】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ You gain a +1 bonus to Magic Defense.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ You have Resistance to <b>dark</b> and
<b>poison</b> damage.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Old Bandages</b></td> <td><b>Storm Fist</b></td>
<td>1250 z</td> <td>1300 z</td>
<td>DEX + MIG】+1</td> <td>MIG + MIG】</td>
<td>【HR + 6】physical</td> <td>【HR + 6】bolt</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ You have Resistance to <b>dark</b> and <b>poison</b> damage.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (2)</b>.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Storm Fist</b></td> <td><b>Lobster Claw</b> <span class="rare"></span></td>
<td>1300 z</td> <td>1950 z</td>
<td>MIG + MIG】</td> <td>DEX + MIG】+1</td>
<td>【HR + 6】bolt</td> <td>【HR + 10】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (2)</b>.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>slow</b>.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Lobster Claw</b> <span class="rare"></span></td> <td><b>Dozer Glove</b> <span class="rare"></span></td>
<td>1950 z</td> <td>2000 z</td>
<td>DEX + MIG】+1</td> <td>MIG + MIG】</td>
<td>【HR + 10】physical</td> <td>【HR + 10】earth</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>slow</b>.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ Each target hit by this weapon suffers
<b>dazed</b>.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Dozer Glove</b> <span class="rare"></span></td> <td><b>Venom Claw</b></td>
<td>2000 z</td> <td>2250 z</td>
<td>MIG + MIG】</td> <td>DEX + MIG】+1</td>
<td>【HR + 10】earth</td> <td>【HR + 6】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>dazed</b>.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ Each target hit by this weapon suffers
<b>poisoned</b>.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Venom Claw</b></td> <td><b>God Hand</b> <span class="rare"></span></td>
<td>2250 z</td> <td>2550 z</td>
<td>【DEX + MIG】+1</td> <td>【DEX + MIG】+1</td>
<td>【HR + 6】physical</td> <td>【HR + 10】light</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>poisoned</b>.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ Damage dealt by this weapon ignores Immunities.
</td>
<tr class="main"> </tr>
<td class="icon" rowspan="2">🗡️</td> </tbody>
<td><b>God Hand</b> <span class="rare"></span></td> </table>
<td>2550 z</td>
<td>【DEX + MIG】+1</td>
<td>【HR + 10】light</td>
</tr>
<tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Damage dealt by this weapon ignores Immunities.</td>
</tr>
</tbody>
</table>

View File

@@ -1,176 +1,196 @@
<style> <style>
table { table {
border-collapse: collapse; border-collapse: collapse;
width: 100%; width: 100%;
} }
th { th {
/* background-color: #2d5a4e; /* background-color: #2d5a4e;
color: white; */ color: white; */
padding: 8px 12px; padding: 8px 12px;
text-align: left; text-align: left;
} }
td { td {
padding: 6px 12px; padding: 6px 12px;
vertical-align: top; vertical-align: top;
} }
tr.desc td { tr.desc td {
/* background-color: #f0f4f0; */ /* background-color: #f0f4f0; */
font-size: 0.95em; font-size: 0.95em;
} }
tr.main td { tr.main td {
border-top: 1px solid #ccc; border-top: 1px solid #ccc;
} }
.icon { .icon {
width: 48px; width: 48px;
text-align: center; text-align: center;
} }
.rare { .rare {
color: #c0392b; color: #c0392b;
} }
</style> </style>
<h2>SAMPLE RARE DAGGER WEAPONS</h2> <h2>SAMPLE RARE DAGGER WEAPONS</h2>
<table> <table>
<thead> <thead>
<tr> <tr>
<th colspan="2">WEAPON</th> <th colspan="2">WEAPON</th>
<th>COST</th> <th>COST</th>
<th>ACCURACY</th> <th>ACCURACY</th>
<th>DAMAGE</th> <th>DAMAGE</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="main">
<td class="icon" rowspan="2">🗡️</td>
<td><b>Latrodectus</b></td>
<td>250 z</td>
<td>【DEX + INS】+1</td>
<td>【HR + 4】poison</td>
</tr>
<tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ No Quality.</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Latrodectus</b></td> <td><b>Heart Knife</b></td>
<td>250 z</td> <td>550 z</td>
<td>【DEX + INS】+1</td> <td>【DEX + WLP】</td>
<td>【HR + 4】poison</td> <td>【HR + 4】light</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ No Quality.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ Deals 5 extra damage to <b>demons</b>.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Heart Knife</b></td> <td><b>Atom Slicer</b></td>
<td>550 z</td> <td>600 z</td>
<td>【DEX + WLP】</td> <td>【DEX + DEX】+1</td>
<td>【HR + 4】light</td> <td>【HR + 4】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Deals 5 extra damage to <b>demons</b>.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ Damage dealt by this weapon ignores Resistances.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Atom Slicer</b></td> <td><b>Silent Edge</b></td>
<td>600 z</td> <td>700 z</td>
<td>【DEX + DEX】+1</td> <td>【DEX + DEX】</td>
<td>【HR + 4】physical</td> <td>【HR + 4】air</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Damage dealt by this weapon ignores Resistances.</td> <td colspan="4">One-handed ◆ Melee ◆ You are immune to <b>slow</b>.</td>
</tr> </tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Silent Edge</b></td> <td><b>Spell Sever</b></td>
<td>700 z</td> <td>850 z</td>
<td>【DEX + DEX】</td> <td>【DEX + INS】+1</td>
<td>【HR + 4】air</td> <td>【HR + 4】dark</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ You are immune to <b>slow</b>.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ When you hit a creature with this weapon, if the
attack had a <b>single</b> target, you may choose a single spell with a
<b>duration</b> of Scene affecting the target and end its effects on
that creature.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Spell Sever</b></td> <td><b>Assassin's Blade</b></td>
<td>850 z</td> <td>1000 z</td>
<td>【DEX + INS】+1</td> <td>【DEX + INS】+1</td>
<td>【HR + 4】dark</td> <td>【HR + 4】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ When you hit a creature with this weapon, if the attack had a <td colspan="4">
<b>single</b> target, you may choose a single spell with a <b>duration</b> of Scene affecting the target One-handed ◆ Melee ◆ Deals 5 extra damage to targets who are in
and end its effects on that creature.</td> <b>Crisis</b>.
</tr> </td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Assassin's Blade</b></td> <td><b>Gourmet Cutter</b></td>
<td>1000 z</td> <td>1350 z</td>
<td>【DEX + INS】+1</td> <td>【DEX + INS】+1</td>
<td>【HR + 4】physical</td> <td>【HR + 8】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Deals 5 extra damage to targets who are in <b>Crisis</b>.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ When you hit one or more creatures with this
weapon, you may recover 5 Hit Points.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Gourmet Cutter</b></td> <td><b>Barbed Knife</b></td>
<td>1350 z</td> <td>1650 z</td>
<td>【DEX + INS】+1</td> <td>【DEX + INS】+1</td>
<td>【HR + 8】physical</td> <td>【HR + 4】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ When you hit one or more creatures with this weapon, you may recover 5 <td colspan="4">
Hit Points.</td> One-handed ◆ Melee ◆ Each target hit by this weapon suffers
</tr> <b>shaken</b>.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Barbed Knife</b></td> <td><b>Cold Finger</b></td>
<td>1650 z</td> <td>1950 z</td>
<td>【DEX + INS】+1</td> <td>【DEX + INS】+1</td>
<td>【HR + 4】physical</td> <td>【HR + 8】ice</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>shaken</b>.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>weak</b>.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Cold Finger</b></td> <td><b>Hornet</b></td>
<td>1950 z</td> <td>2200 z</td>
<td>【DEX + INS】+1</td> <td>【DEX + DEX】+1</td>
<td>【HR + 8】ice</td> <td>【HR + 4】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>weak</b>.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (3)</b>.
</td>
</tr>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Hornet</b></td> <td><b>Frantic Nail</b></td>
<td>2200 z</td> <td>2450 z</td>
<td>DEX + DEX】+1</td> <td>INS + INS】+1</td>
<td>【HR + 4】physical</td> <td>【HR + 8】fire</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (3)</b>.</td> <td colspan="4">
</tr> One-handed ◆ Melee ◆ Each target hit by this weapon suffers
<b>enraged</b>.
<tr class="main"> </td>
<td class="icon" rowspan="2">🗡️</td> </tr>
<td><b>Frantic Nail</b></td> </tbody>
<td>2450 z</td> </table>
<td>【INS + INS】+1</td>
<td>【HR + 8】fire</td>
</tr>
<tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>enraged</b>.</td>
</tr>
</tbody>
</table>

View File

@@ -47,7 +47,6 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Revolver</b> <span class="rare"></span></td> <td><b>Revolver</b> <span class="rare"></span></td>
@@ -78,7 +77,9 @@
<td>【HR + 8】physical</td> <td>【HR + 8】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ Attacks with this weapon target Magic Defense.</td> <td colspan="4">
One-handed ◆ Ranged ◆ Attacks with this weapon target Magic Defense.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -89,7 +90,9 @@
<td>【HR + 8】physical</td> <td>【HR + 8】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ Deals 5 extra damage to <b>constructs</b>.</td> <td colspan="4">
One-handed ◆ Ranged ◆ Deals 5 extra damage to <b>constructs</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -100,8 +103,10 @@
<td>【HR + 8】physical</td> <td>【HR + 8】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ Deals 5 extra damage to targets you have a <b>Bond</b> of <b>hatred</b> <td colspan="4">
towards.</td> One-handed ◆ Ranged ◆ Deals 5 extra damage to targets you have a
<b>Bond</b> of <b>hatred</b> towards.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -134,8 +139,10 @@
<td>【HR + 8】poison</td> <td>【HR + 8】poison</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ Potions you create with your Inventory Points deal 5 extra damage and <td colspan="4">
restore 5 extra Hit Points.</td> Two-handed ◆ Ranged ◆ Potions you create with your Inventory Points deal
5 extra damage and restore 5 extra Hit Points.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -146,7 +153,9 @@
<td>【HR + 16】fire</td> <td>【HR + 16】fire</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ Attacks with this weapon have <b>multi (2)</b>.</td> <td colspan="4">
Two-handed ◆ Ranged ◆ Attacks with this weapon have <b>multi (2)</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -157,7 +166,10 @@
<td>【HR + 8】ice</td> <td>【HR + 8】ice</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ Each target hit by this weapon suffers <b>slow</b>.</td> <td colspan="4">
One-handed ◆ Ranged ◆ Each target hit by this weapon suffers
<b>slow</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -168,9 +180,10 @@
<td>【HR + 12】air</td> <td>【HR + 12】air</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Ranged ◆ Deals extra damage equal to the difference between your current and maximum <td colspan="4">
<b>Inventory Points</b>.</td> Two-handed ◆ Ranged ◆ Deals extra damage equal to the difference between
your current and maximum <b>Inventory Points</b>.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -47,7 +47,6 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Old Whip</b></td> <td><b>Old Whip</b></td>
@@ -56,7 +55,10 @@
<td>【HR + 8】physical</td> <td>【HR + 8】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Deals 5 extra damage to <b>beasts</b> and <b>monsters</b>.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Deals 5 extra damage to <b>beasts</b> and
<b>monsters</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -78,9 +80,12 @@
<td>【HR + 8】physical</td> <td>【HR + 8】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Damage dealt by this weapon reduces the target's <b>Mind Points</b> instead <td colspan="4">
of their <b>Hit Points</b>. If the target's Mind Points reach 0, any excess damage is applied to their Hit Two-handed ◆ Melee ◆ Damage dealt by this weapon reduces the target's
Points as normal.</td> <b>Mind Points</b> instead of their <b>Hit Points</b>. If the target's
Mind Points reach 0, any excess damage is applied to their Hit Points as
normal.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -91,7 +96,9 @@
<td>【HR + 8】physical</td> <td>【HR + 8】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ You have Resistance to <b>fire</b> damage.</td> <td colspan="4">
One-handed ◆ Melee ◆ You have Resistance to <b>fire</b> damage.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -113,8 +120,10 @@
<td>【HR + 8】fire</td> <td>【HR + 8】fire</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ You gain a +2 bonus to Accuracy Checks and Magic Checks against <td colspan="4">
<b>enraged</b> targets.</td> One-handed ◆ Melee ◆ You gain a +2 bonus to Accuracy Checks and Magic
Checks against <b>enraged</b> targets.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -125,7 +134,9 @@
<td>【HR + 12】physical</td> <td>【HR + 12】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (2)</b>.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (2)</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -136,7 +147,9 @@
<td>【HR + 12】physical</td> <td>【HR + 12】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ You have Resistance to <b>physical</b> damage.</td> <td colspan="4">
Two-handed ◆ Melee ◆ You have Resistance to <b>physical</b> damage.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -147,7 +160,9 @@
<td>【HR + 8】physical</td> <td>【HR + 8】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>slow</b>.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>slow</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -158,7 +173,9 @@
<td>【HR + 12】dark</td> <td>【HR + 12】dark</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (3)</b>.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (3)</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -169,8 +186,10 @@
<td>【HR + 12】physical</td> <td>【HR + 12】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ You have Immunity to <b>dark</b> and <b>light</b> damage.</td> <td colspan="4">
Two-handed ◆ Melee ◆ You have Immunity to <b>dark</b> and
<b>light</b> damage.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -46,7 +46,6 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Bardiche</b> <span class="rare"></span></td> <td><b>Bardiche</b> <span class="rare"></span></td>
@@ -66,7 +65,9 @@
<td>【HR + 6】physical</td> <td>【HR + 6】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Deals 5 extra damage to <b>constructs</b>.</td> <td colspan="4">
One-handed ◆ Melee ◆ Deals 5 extra damage to <b>constructs</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -77,7 +78,9 @@
<td>【HR + 10】physical</td> <td>【HR + 10】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Deals 5 extra damage to <b>monsters</b>.</td> <td colspan="4">
One-handed ◆ Melee ◆ Deals 5 extra damage to <b>monsters</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -88,7 +91,9 @@
<td>【HR + 14】poison</td> <td>【HR + 14】poison</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Deals 5 extra damage to <b>humanoids</b>.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Deals 5 extra damage to <b>humanoids</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -99,7 +104,10 @@
<td>【HR + 10】physical</td> <td>【HR + 10】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Deals 5 extra damage to <b>beasts</b> and <b>plants</b>.</td> <td colspan="4">
One-handed ◆ Melee ◆ Deals 5 extra damage to <b>beasts</b> and
<b>plants</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -121,7 +129,9 @@
<td>【HR + 14】light</td> <td>【HR + 14】light</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (2)</b>.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (2)</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -132,7 +142,9 @@
<td>【HR + 14】earth</td> <td>【HR + 14】earth</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>slow</b>.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>slow</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -143,7 +155,10 @@
<td>【HR + 10】bolt</td> <td>【HR + 10】bolt</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>dazed</b>.</td> <td colspan="4">
One-handed ◆ Melee ◆ Each target hit by this weapon suffers
<b>dazed</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -154,7 +169,9 @@
<td>【HR + 18】fire</td> <td>【HR + 18】fire</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ You have Immunity to <b>fire</b> damage.</td> <td colspan="4">
Two-handed ◆ Melee ◆ You have Immunity to <b>fire</b> damage.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -165,7 +182,10 @@
<td>【HR + 18】dark</td> <td>【HR + 18】dark</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>enraged</b>.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Each target hit by this weapon suffers
<b>enraged</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -176,8 +196,9 @@
<td>【HR + 18】ice</td> <td>【HR + 18】ice</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ You gain a +1 bonus to Defense and Magic Defense.</td> <td colspan="4">
Two-handed ◆ Melee ◆ You gain a +1 bonus to Defense and Magic Defense.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -34,7 +34,6 @@
.rare { .rare {
color: #c0392b; color: #c0392b;
} }
</style> </style>
<table> <table>
@@ -47,7 +46,6 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Dragontongue</b> <span class="rare"></span></td> <td><b>Dragontongue</b> <span class="rare"></span></td>
@@ -56,7 +54,9 @@
<td>【HR + 12】fire</td> <td>【HR + 12】fire</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Attacks with this weapon target Magic Defense.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Attacks with this weapon target Magic Defense.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -67,7 +67,9 @@
<td>【HR + 8】physical</td> <td>【HR + 8】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Deals 1 extra damage per status effect you have.</td> <td colspan="4">
One-handed ◆ Melee ◆ Deals 1 extra damage per status effect you have.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -78,7 +80,9 @@
<td>【HR + 16】physical</td> <td>【HR + 16】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Damage dealt by this weapon ignores Resistances.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Damage dealt by this weapon ignores Resistances.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -100,7 +104,9 @@
<td>【HR + 12】ice</td> <td>【HR + 12】ice</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ You have Resistance to <b>ice</b> damage.</td> <td colspan="4">
One-handed ◆ Melee ◆ You have Resistance to <b>ice</b> damage.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -111,8 +117,10 @@
<td>【HR + 12】earth</td> <td>【HR + 12】earth</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ As long as you have at least three <b>Bonds</b> of <b>loyalty</b> or <td colspan="4">
<b>affection</b>, you gain a +1 bonus to Defense and Magic Defense. Two-handed ◆ Melee ◆ As long as you have at least three <b>Bonds</b> of
<b>loyalty</b> or <b>affection</b>, you gain a +1 bonus to Defense and
Magic Defense.
</td> </td>
</tr> </tr>
@@ -124,8 +132,10 @@
<td>【HR + 12】dark</td> <td>【HR + 12】dark</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ When you hit one or more creatures with this weapon, you may recover 10 <td colspan="4">
Mind Points.</td> Two-handed ◆ Melee ◆ When you hit one or more creatures with this
weapon, you may recover 10 Mind Points.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -136,8 +146,11 @@
<td>【HR + 12】physical</td> <td>【HR + 12】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ If you roll a <b>critical success</b> on an Accuracy Check with this <td colspan="4">
weapon, you may spend that <b>opportunity</b> to deal 10 extra damage.</td> Two-handed ◆ Melee ◆ If you roll a <b>critical success</b> on an
Accuracy Check with this weapon, you may spend that
<b>opportunity</b> to deal 10 extra damage.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -148,7 +161,9 @@
<td>【HR + 16】physical</td> <td>【HR + 16】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>weak</b>.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Each target hit by this weapon suffers <b>weak</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -170,8 +185,10 @@
<td>【HR + 16】light</td> <td>【HR + 16】light</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ You have Immunity to <b>fire</b> and <b>ice</b> damage.</td> <td colspan="4">
Two-handed ◆ Melee ◆ You have Immunity to <b>fire</b> and
<b>ice</b> damage.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -47,7 +47,6 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Zweihänder</b> <span class="rare"></span></td> <td><b>Zweihänder</b> <span class="rare"></span></td>
@@ -67,7 +66,9 @@
<td>【HR + 10】ice</td> <td>【HR + 10】ice</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Attacks with this weapon target Magic Defense.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Attacks with this weapon target Magic Defense.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -89,7 +90,9 @@
<td>【HR + 6】physical</td> <td>【HR + 6】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ You are immune to <b>enraged</b>.</td> <td colspan="4">
One-handed ◆ Melee ◆ You are immune to <b>enraged</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -111,7 +114,9 @@
<td>【HR + 6】dark</td> <td>【HR + 6】dark</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Deals 5 extra damage if you are in <b>Crisis</b>.</td> <td colspan="4">
One-handed ◆ Melee ◆ Deals 5 extra damage if you are in <b>Crisis</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -122,7 +127,9 @@
<td>【HR + 10】physical</td> <td>【HR + 10】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ This weapon can target <b>flying</b> creatures.</td> <td colspan="4">
Two-handed ◆ Melee ◆ This weapon can target <b>flying</b> creatures.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -144,7 +151,10 @@
<td>【HR + 10】physical</td> <td>【HR + 10】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Deals 2 extra damage for each <b>Class</b> you have mastered.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Deals 2 extra damage for each <b>Class</b> you have
mastered.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -155,7 +165,9 @@
<td>【HR + 10】poison</td> <td>【HR + 10】poison</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Melee ◆ Deals 5 extra damage to <b>weak</b> targets.</td> <td colspan="4">
One-handed ◆ Melee ◆ Deals 5 extra damage to <b>weak</b> targets.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -166,7 +178,9 @@
<td>【HR + 14】air</td> <td>【HR + 14】air</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (2)</b>.</td> <td colspan="4">
Two-handed ◆ Melee ◆ Attacks with this weapon have <b>multi (2)</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -177,8 +191,9 @@
<td>【HR + 10】light</td> <td>【HR + 10】light</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">Two-handed ◆ Melee ◆ You are immune to all status effects.</td> <td colspan="4">
Two-handed ◆ Melee ◆ You are immune to all status effects.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -43,7 +43,6 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="main"> <tr class="main">
<td class="icon" rowspan="2">🗡️</td> <td class="icon" rowspan="2">🗡️</td>
<td><b>Crescent Edge</b></td> <td><b>Crescent Edge</b></td>
@@ -52,7 +51,9 @@
<td>【HR + 4】light</td> <td>【HR + 4】light</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ Attacks with this weapon target Magic Defense.</td> <td colspan="4">
One-handed ◆ Ranged ◆ Attacks with this weapon target Magic Defense.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -85,7 +86,10 @@
<td>【HR + 4】physical</td> <td>【HR + 4】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ Deals 5 extra damage to <b>beasts</b> and <b>monsters</b>.</td> <td colspan="4">
One-handed ◆ Ranged ◆ Deals 5 extra damage to <b>beasts</b> and
<b>monsters</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -96,7 +100,9 @@
<td>【HR + 8】air</td> <td>【HR + 8】air</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ Damage dealt by this weapon ignores Resistances.</td> <td colspan="4">
One-handed ◆ Ranged ◆ Damage dealt by this weapon ignores Resistances.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -107,7 +113,9 @@
<td>【HR + 8】physical</td> <td>【HR + 8】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ You are immune to <b>poisoned</b>.</td> <td colspan="4">
One-handed ◆ Ranged ◆ You are immune to <b>poisoned</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -118,7 +126,9 @@
<td>【HR + 4】ice</td> <td>【HR + 4】ice</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ You have Resistance to <b>ice</b> damage.</td> <td colspan="4">
One-handed ◆ Ranged ◆ You have Resistance to <b>ice</b> damage.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -129,7 +139,9 @@
<td>【HR + 4】earth</td> <td>【HR + 4】earth</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ You have Resistance to <b>dark</b> damage.</td> <td colspan="4">
One-handed ◆ Ranged ◆ You have Resistance to <b>dark</b> damage.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -140,7 +152,9 @@
<td>【HR + 4】physical</td> <td>【HR + 4】physical</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ Attacks with this weapon have <b>multi (2)</b>.</td> <td colspan="4">
One-handed ◆ Ranged ◆ Attacks with this weapon have <b>multi (2)</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -151,7 +165,10 @@
<td>【HR + 8】bolt</td> <td>【HR + 8】bolt</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ Each target hit by this weapon suffers <b>shaken</b>.</td> <td colspan="4">
One-handed ◆ Ranged ◆ Each target hit by this weapon suffers
<b>shaken</b>.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -162,7 +179,9 @@
<td>【HR + 4】dark</td> <td>【HR + 4】dark</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ You gain a +1 bonus to Defense and Magic Defense.</td> <td colspan="4">
One-handed ◆ Ranged ◆ You gain a +1 bonus to Defense and Magic Defense.
</td>
</tr> </tr>
<tr class="main"> <tr class="main">
@@ -173,8 +192,10 @@
<td>【HR + 4】poison</td> <td>【HR + 4】poison</td>
</tr> </tr>
<tr class="desc"> <tr class="desc">
<td colspan="4">One-handed ◆ Ranged ◆ Each target hit by this weapon suffers <b>poisoned</b>.</td> <td colspan="4">
One-handed ◆ Ranged ◆ Each target hit by this weapon suffers
<b>poisoned</b>.
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -11,29 +11,45 @@
<li><a href="/books/core/#page-30">Scenes</a> <span>30</span></li> <li><a href="/books/core/#page-30">Scenes</a> <span>30</span></li>
<li><a href="/books/core/#page-31">Interlude Scenes</a> <span>31</span></li> <li><a href="/books/core/#page-31">Interlude Scenes</a> <span>31</span></li>
<li><a href="/books/core/#page-31">Game Master Scenes</a> <span>31</span></li> <li><a href="/books/core/#page-31">Game Master Scenes</a> <span>31</span></li>
<li><a href="/books/core/#page-32">Sessions and Campaigns</a> <span>32</span></li> <li>
<a href="/books/core/#page-32">Sessions and Campaigns</a> <span>32</span>
</li>
<li><a href="/books/core/#page-33">Important Rules</a> <span>33</span></li> <li><a href="/books/core/#page-33">Important Rules</a> <span>33</span></li>
<li><a href="/books/core/#page-34">Anatomy of a Character</a> <span>34</span></li> <li>
<a href="/books/core/#page-34">Anatomy of a Character</a> <span>34</span>
</li>
<li><a href="/books/core/#page-38">Checks</a> <span>38</span></li> <li><a href="/books/core/#page-38">Checks</a> <span>38</span></li>
<li><a href="/books/core/#page-40">Critical Success</a> <span>40</span></li> <li><a href="/books/core/#page-40">Critical Success</a> <span>40</span></li>
<li><a href="/books/core/#page-40">Fumble</a> <span>40</span></li> <li><a href="/books/core/#page-40">Fumble</a> <span>40</span></li>
<li><a href="/books/core/#page-41">Opportunities</a> <span>41</span></li> <li><a href="/books/core/#page-41">Opportunities</a> <span>41</span></li>
<li><a href="/books/core/#page-42">Performing an Attribute Check</a> <span>42</span></li> <li>
<a href="/books/core/#page-42">Performing an Attribute Check</a>
<span>42</span>
</li>
<li><a href="/books/core/#page-43">Difficulty Levels</a> <span>43</span></li> <li><a href="/books/core/#page-43">Difficulty Levels</a> <span>43</span></li>
<li><a href="/books/core/#page-46">Invoking a Trait</a> <span>46</span></li> <li><a href="/books/core/#page-46">Invoking a Trait</a> <span>46</span></li>
<li><a href="/books/core/#page-47">Invoking a Bond</a> <span>47</span></li> <li><a href="/books/core/#page-47">Invoking a Bond</a> <span>47</span></li>
<li><a href="/books/core/#page-48">Opposed Checks</a> <span>48</span></li> <li><a href="/books/core/#page-48">Opposed Checks</a> <span>48</span></li>
<li><a href="/books/core/#page-49">Open Checks</a> <span>49</span></li> <li><a href="/books/core/#page-49">Open Checks</a> <span>49</span></li>
<li><a href="/books/core/#page-49">Situational Modifiers</a> <span>49</span></li> <li>
<a href="/books/core/#page-49">Situational Modifiers</a> <span>49</span>
</li>
<li><a href="/books/core/#page-50">Group Checks</a> <span>50</span></li> <li><a href="/books/core/#page-50">Group Checks</a> <span>50</span></li>
<li><a href="/books/core/#page-51">Frequently Used Checks</a> <span>51</span></li> <li>
<a href="/books/core/#page-51">Frequently Used Checks</a> <span>51</span>
</li>
<li><a href="/books/core/#page-52">Clocks</a> <span>52</span></li> <li><a href="/books/core/#page-52">Clocks</a> <span>52</span></li>
<li><a href="/books/core/#page-56">Bonds</a> <span>56</span></li> <li><a href="/books/core/#page-56">Bonds</a> <span>56</span></li>
<li><a href="/books/core/#page-58">Conflict Scenes</a> <span>58</span></li> <li><a href="/books/core/#page-58">Conflict Scenes</a> <span>58</span></li>
<li><a href="/books/core/#page-58">The Structure of a Conflict</a> <span>58</span></li> <li>
<a href="/books/core/#page-58">The Structure of a Conflict</a>
<span>58</span>
</li>
<li><a href="/books/core/#page-61">Initiative</a> <span>61</span></li> <li><a href="/books/core/#page-61">Initiative</a> <span>61</span></li>
<li><a href="/books/core/#page-62">Rounds and Turns</a> <span>62</span></li> <li><a href="/books/core/#page-62">Rounds and Turns</a> <span>62</span></li>
<li><a href="/books/core/#page-64">Space and Distances</a> <span>64</span></li> <li>
<a href="/books/core/#page-64">Space and Distances</a> <span>64</span>
</li>
<li><a href="/books/core/#page-66">Actions</a> <span>66</span></li> <li><a href="/books/core/#page-66">Actions</a> <span>66</span></li>
<li><a href="/books/core/#page-68">Attack</a> <span>68</span></li> <li><a href="/books/core/#page-68">Attack</a> <span>68</span></li>
<li><a href="/books/core/#page-70">Equipment</a> <span>70</span></li> <li><a href="/books/core/#page-70">Equipment</a> <span>70</span></li>
@@ -46,8 +62,13 @@
<li><a href="/books/core/#page-76">Skill</a> <span>76</span></li> <li><a href="/books/core/#page-76">Skill</a> <span>76</span></li>
<li><a href="/books/core/#page-76">Teamwork</a> <span>76</span></li> <li><a href="/books/core/#page-76">Teamwork</a> <span>76</span></li>
<li><a href="/books/core/#page-78">Sample Goal Clocks</a> <span>78</span></li> <li><a href="/books/core/#page-78">Sample Goal Clocks</a> <span>78</span></li>
<li><a href="/books/core/#page-82">Optional Conflict Rules</a> <span>82</span></li> <li>
<li><a href="/books/core/#page-84">Hit Points and Mind Points</a> <span>84</span></li> <a href="/books/core/#page-82">Optional Conflict Rules</a> <span>82</span>
</li>
<li>
<a href="/books/core/#page-84">Hit Points and Mind Points</a>
<span>84</span>
</li>
<li><a href="/books/core/#page-86">0 Hit Points</a> <span>86</span></li> <li><a href="/books/core/#page-86">0 Hit Points</a> <span>86</span></li>
<li><a href="/books/core/#page-88">Sacrifice</a> <span>88</span></li> <li><a href="/books/core/#page-88">Sacrifice</a> <span>88</span></li>
<li><a href="/books/core/#page-89">Surrendering</a> <span>89</span></li> <li><a href="/books/core/#page-89">Surrendering</a> <span>89</span></li>
@@ -61,7 +82,9 @@
<li><a href="/books/core/#page-101">Ultima Points</a> <span>101</span></li> <li><a href="/books/core/#page-101">Ultima Points</a> <span>101</span></li>
<li><a href="/books/core/#page-102">Escalation</a> <span>102</span></li> <li><a href="/books/core/#page-102">Escalation</a> <span>102</span></li>
<li><a href="/books/core/#page-104">Inventory Points</a> <span>104</span></li> <li><a href="/books/core/#page-104">Inventory Points</a> <span>104</span></li>
<li><a href="/books/core/#page-106">Journeys and Travels</a> <span>106</span></li> <li>
<a href="/books/core/#page-106">Journeys and Travels</a> <span>106</span>
</li>
<li><a href="/books/core/#page-108">Dangers</a> <span>108</span></li> <li><a href="/books/core/#page-108">Dangers</a> <span>108</span></li>
<li><a href="/books/core/#page-109">Discoveries</a> <span>109</span></li> <li><a href="/books/core/#page-109">Discoveries</a> <span>109</span></li>
<li><a href="/books/core/#page-110">Dungeons</a> <span>110</span></li> <li><a href="/books/core/#page-110">Dungeons</a> <span>110</span></li>

View File

@@ -1,11 +1,21 @@
<ul> <ul>
<li><a href="/books/core/#page-120">Rituals during Conflicts</a> <span>120</span></li> <li>
<li><a href="/books/core/#page-122">Economy and Items</a> <span>122</span></li> <a href="/books/core/#page-120">Rituals during Conflicts</a>
<li><a href="/books/core/#page-124">Services and Transports</a> <span>124</span></li> <span>120</span>
</li>
<li>
<a href="/books/core/#page-122">Economy and Items</a> <span>122</span>
</li>
<li>
<a href="/books/core/#page-124">Services and Transports</a> <span>124</span>
</li>
<li><a href="/books/core/#page-126">Equipment</a> <span>126</span></li> <li><a href="/books/core/#page-126">Equipment</a> <span>126</span></li>
<li><a href="/books/core/#page-126">Martial Items</a> <span>126</span></li> <li><a href="/books/core/#page-126">Martial Items</a> <span>126</span></li>
<li><a href="/books/core/#page-130">Basic Weapons</a> <span>130</span></li> <li><a href="/books/core/#page-130">Basic Weapons</a> <span>130</span></li>
<li><a href="/books/core/#page-132">Basic Armors and Shields</a> <span>132</span></li> <li>
<a href="/books/core/#page-132">Basic Armors and Shields</a>
<span>132</span>
</li>
<li><a href="/books/core/#page-134">Projects</a> <span>134</span></li> <li><a href="/books/core/#page-134">Projects</a> <span>134</span></li>
<li><a href="/books/core/#page-140">Group Dynamics</a> <span>140</span></li> <li><a href="/books/core/#page-140">Group Dynamics</a> <span>140</span></li>
</ul> </ul>
@@ -15,8 +25,12 @@
<li><a href="/books/core/#page-146">Before You Start</a> <span>146</span></li> <li><a href="/books/core/#page-146">Before You Start</a> <span>146</span></li>
<li><a href="/books/core/#page-148">World Creation</a> <span>148</span></li> <li><a href="/books/core/#page-148">World Creation</a> <span>148</span></li>
<li><a href="/books/core/#page-152">Group Creation</a> <span>152</span></li> <li><a href="/books/core/#page-152">Group Creation</a> <span>152</span></li>
<li><a href="/books/core/#page-154">Character Creation</a> <span>154</span></li> <li>
<li><a href="/books/core/#page-172">Classic Characters</a> <span>172</span></li> <a href="/books/core/#page-154">Character Creation</a> <span>154</span>
</li>
<li>
<a href="/books/core/#page-172">Classic Characters</a> <span>172</span>
</li>
<li><a href="/books/core/#page-176">Arcanist</a> <span>176</span></li> <li><a href="/books/core/#page-176">Arcanist</a> <span>176</span></li>
<li><a href="/books/core/#page-182">Chimerist</a> <span>182</span></li> <li><a href="/books/core/#page-182">Chimerist</a> <span>182</span></li>
<li><a href="/books/core/#page-184">Darkblade</a> <span>184</span></li> <li><a href="/books/core/#page-184">Darkblade</a> <span>184</span></li>
@@ -33,32 +47,60 @@
<li><a href="/books/core/#page-216">Wayfarer</a> <span>216</span></li> <li><a href="/books/core/#page-216">Wayfarer</a> <span>216</span></li>
<li><a href="/books/core/#page-218">Weaponmaster</a> <span>218</span></li> <li><a href="/books/core/#page-218">Weaponmaster</a> <span>218</span></li>
<li><a href="/books/core/#page-220">Prologues</a> <span>220</span></li> <li><a href="/books/core/#page-220">Prologues</a> <span>220</span></li>
<li><a href="/books/core/#page-226">Experience and Levels</a> <span>226</span></li> <li>
<li><a href="/books/core/#page-229">Creating High Level PCs</a> <span>229</span></li> <a href="/books/core/#page-226">Experience and Levels</a> <span>226</span>
<li><a href="/books/core/#page-230">Optional Advancement Rules</a> <span>230</span></li> </li>
<li>
<a href="/books/core/#page-229">Creating High Level PCs</a> <span>229</span>
</li>
<li>
<a href="/books/core/#page-230">Optional Advancement Rules</a>
<span>230</span>
</li>
<li><a href="/books/core/#page-232">Heroic Skills</a> <span>232</span></li> <li><a href="/books/core/#page-232">Heroic Skills</a> <span>232</span></li>
</ul> </ul>
<h2>4. GAME MASTER</h2> <h2>4. GAME MASTER</h2>
<ul> <ul>
<li><a href="/books/core/#page-244">The Game Master's Role</a> <span>244</span></li> <li>
<li><a href="/books/core/#page-248">Character Classes</a> <span>248</span></li> <a href="/books/core/#page-244">The Game Master's Role</a> <span>244</span>
<li><a href="/books/core/#page-254">The Art of Villains</a> <span>254</span></li> </li>
<li>
<a href="/books/core/#page-248">Character Classes</a> <span>248</span>
</li>
<li>
<a href="/books/core/#page-254">The Art of Villains</a> <span>254</span>
</li>
<li><a href="/books/core/#page-258">Dungeons</a> <span>258</span></li> <li><a href="/books/core/#page-258">Dungeons</a> <span>258</span></li>
<li><a href="/books/core/#page-264">Rewards</a> <span>264</span></li> <li><a href="/books/core/#page-264">Rewards</a> <span>264</span></li>
<li><a href="/books/core/#page-266">Designing Rare Items</a> <span>266</span></li> <li>
<li><a href="/books/core/#page-268">Designing Rare Weapons</a> <span>268</span></li> <a href="/books/core/#page-266">Designing Rare Items</a> <span>266</span>
<li><a href="/books/core/#page-280">Designing Rare Armors and Shields</a> <span>280</span></li> </li>
<li><a href="/books/core/#page-284">Designing Accessories</a> <span>284</span></li> <li>
<a href="/books/core/#page-268">Designing Rare Weapons</a> <span>268</span>
</li>
<li>
<a href="/books/core/#page-280">Designing Rare Armors and Shields</a>
<span>280</span>
</li>
<li>
<a href="/books/core/#page-284">Designing Accessories</a> <span>284</span>
</li>
<li><a href="/books/core/#page-288">Artifacts</a> <span>288</span></li> <li><a href="/books/core/#page-288">Artifacts</a> <span>288</span></li>
<li><a href="/books/core/#page-292">Designing Battles</a> <span>292</span></li> <li>
<li><a href="/books/core/#page-295">Elites and Champions</a> <span>295</span></li> <a href="/books/core/#page-292">Designing Battles</a> <span>292</span>
</li>
<li>
<a href="/books/core/#page-295">Elites and Champions</a> <span>295</span>
</li>
<li><a href="/books/core/#page-300">Boss Battles</a> <span>300</span></li> <li><a href="/books/core/#page-300">Boss Battles</a> <span>300</span></li>
<li><a href="/books/core/#page-300">Designing NPCs</a> <span>300</span></li> <li><a href="/books/core/#page-300">Designing NPCs</a> <span>300</span></li>
<li><a href="/books/core/#page-304">NPC Species</a> <span>304</span></li> <li><a href="/books/core/#page-304">NPC Species</a> <span>304</span></li>
<li><a href="/books/core/#page-306">NPC Skills</a> <span>306</span></li> <li><a href="/books/core/#page-306">NPC Skills</a> <span>306</span></li>
<li><a href="/books/core/#page-310">NPC Spells</a> <span>310</span></li> <li><a href="/books/core/#page-310">NPC Spells</a> <span>310</span></li>
<li><a href="/books/core/#page-312">Sample Boss Designs</a> <span>312</span></li> <li>
<a href="/books/core/#page-312">Sample Boss Designs</a> <span>312</span>
</li>
</ul> </ul>
<h2>5. BESTIARY</h2> <h2>5. BESTIARY</h2>
@@ -72,4 +114,4 @@
<li><a href="/books/core/#page-342">Monsters</a> <span>342</span></li> <li><a href="/books/core/#page-342">Monsters</a> <span>342</span></li>
<li><a href="/books/core/#page-346">Plants</a> <span>346</span></li> <li><a href="/books/core/#page-346">Plants</a> <span>346</span></li>
<li><a href="/books/core/#page-350">Undead</a> <span>350</span></li> <li><a href="/books/core/#page-350">Undead</a> <span>350</span></li>
</ul> </ul>

File diff suppressed because it is too large Load Diff

View File

@@ -205,3 +205,160 @@ li.active .page-num {
padding-bottom: 0.8em; padding-bottom: 0.8em;
margin-bottom: 1.4em; margin-bottom: 1.4em;
} }
/* ── Search modal ── */
.search-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.55);
z-index: 1000;
display: flex;
align-items: flex-start;
justify-content: center;
padding-top: 10vh;
}
.search-modal {
width: 580px;
max-width: calc(100vw - 40px);
max-height: 70vh;
background: var(--surface2);
border: 1px solid var(--border-bright);
display: flex;
flex-direction: column;
overflow: hidden;
}
.search-input {
width: 100%;
padding: 14px 16px;
background: var(--surface);
border: none;
border-bottom: 1px solid var(--border-bright);
color: var(--text);
font-family: var(--font-body);
font-size: 1rem;
outline: none;
flex-shrink: 0;
}
.search-input::placeholder { color: var(--text-dim); }
.search-results {
overflow-y: auto;
flex: 1;
list-style: none;
padding: 0;
margin: 0;
}
.search-result {
padding: 10px 16px;
border-bottom: 1px solid var(--border);
cursor: pointer;
display: flex;
flex-direction: column;
gap: 3px;
transition: background 0.1s;
}
.search-result:last-child { border-bottom: none; }
.search-result:hover,
.search-result.active { background: var(--surface3); }
.search-result-meta {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 8px;
}
.search-result-heading {
font-family: var(--font-display);
font-size: 0.7rem;
letter-spacing: 0.08em;
color: var(--teal);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
min-width: 0;
}
.search-result-page {
font-family: var(--font-mono);
font-size: 0.7rem;
color: var(--text-dim);
white-space: nowrap;
flex-shrink: 0;
}
.search-result-snippet {
font-size: 0.85rem;
color: var(--text-dim);
line-height: 1.5;
}
.search-result-snippet mark {
background: none;
color: var(--gold);
font-weight: 600;
}
.search-empty {
padding: 24px 16px;
text-align: center;
color: var(--text-dim);
font-family: var(--font-mono);
font-size: 0.8rem;
}
.search-footer {
display: flex;
gap: 16px;
padding: 7px 14px;
border-top: 1px solid var(--border);
background: var(--surface3);
flex-shrink: 0;
}
.search-footer span {
font-family: var(--font-mono);
font-size: 0.68rem;
color: var(--text-dim);
}
/* ── Heading permalink buttons ── */
.page-section h1,
.page-section h2,
.page-section h3 {
position: relative;
scroll-margin-top: 60px;
}
.heading-link {
position: absolute;
left: -24px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
cursor: pointer;
color: var(--text-dim);
font-family: var(--font-mono);
font-size: 17px;
padding: 2px 4px;
line-height: 1;
transition: color 0.15s;
user-select: none;
}
/* h1 has padding-bottom: 0.3em — shift button up so it centers with the text line, not the full box */
.page-section h1 > .heading-link {
top: calc(50% - 5px);
}
.heading-link:hover,
.heading-link--copied {
color: var(--teal);
}

View File

49
scripts/spells-to-html.js Normal file
View File

@@ -0,0 +1,49 @@
#!/usr/bin/env node
const fs = require('node:fs')
const path = require('node:path')
const { parse } = require('yaml')
const ymlPath = path.join(__dirname, "..", "data", "spells.yml");
const data = parse(fs.readFileSync(ymlPath, "utf8"));
const columns = ["name", "cost", "targets", "duration"];
const myEscape = (s) =>
String(s ?? "")
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;");
const generateTable = (spells, class_) => {
const rows = spells
.filter((elem) => elem.class === class_)
.map(
(spell) =>
` <tr>\n${columns.map((col) => ` <td>${myEscape(spell[col])}</td>`).join("\n")}\n </tr><tr><td colspan="4">${spell["description"]}</td></tr>`,
)
.join("\n");
const headers = columns
.map((col) => ` <th>${col.charAt(0).toUpperCase() + col.slice(1)}</th>`)
.join("\n");
return `<table>
<thead>
<tr>
${headers}
</tr>
</thead>
<tbody>
${rows}
</tbody>
</table>
`;
};
["arcanist", "chimerist", "elementalist", "entropist", "spiritist"].forEach(
(class_) => {
process.stdout.write(`<h2>${class_} Spells</h2>\n`)
process.stdout.write(generateTable(data.spells, class_));
},
);

View File

@@ -1,4 +1,5 @@
import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'; import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';
import SearchModal, { SearchEntry } from './SearchModal';
interface BookIndexProps { interface BookIndexProps {
title: string; title: string;
@@ -6,10 +7,63 @@ interface BookIndexProps {
pages: BookPage[]; pages: BookPage[];
} }
function slugify(text: string): string {
return text
.toLowerCase()
.replace(/[^\w\s-]/g, '')
.replace(/\s+/g, '-')
.replace(/-+/g, '-')
.trim();
}
export default function BookIndex({ title, logoText, pages }: BookIndexProps) { export default function BookIndex({ title, logoText, pages }: BookIndexProps) {
const pageNums = useMemo(() => pages.map(p => p.n), [pages]); const pageNums = useMemo(() => pages.map(p => p.n), [pages]);
const total = pageNums.length; const total = pageNums.length;
// Single DOMParser pass per page: build search index then inject permalink buttons.
// Both outputs are stable memos so React's dangerouslySetInnerHTML diffing never
// strips the injected buttons on re-render.
const { processedPages, searchIndex } = useMemo(() => {
const parser = new DOMParser();
const slugCount: Record<string, number> = {};
const searchIndex: SearchEntry[] = [];
const processedPages = pages.map(({ n, content }) => {
const doc = parser.parseFromString(content, 'text/html');
// 1. Index text blocks before mutation so heading textContent has no '#' noise
let currentHeading = '';
doc.body.querySelectorAll('h1, h2, h3, p, li, blockquote, td').forEach(el => {
if (/^H[1-3]$/.test(el.tagName)) {
currentHeading = el.textContent?.trim() || '';
} else {
const text = el.textContent?.trim() || '';
if (text.length > 20) {
searchIndex.push({ pageNum: n, headingContext: currentHeading, text });
}
}
});
// 2. Add IDs and permalink buttons to headings
doc.querySelectorAll('h1, h2, h3').forEach(heading => {
const baseSlug = slugify(heading.textContent || '');
if (!baseSlug) return;
slugCount[baseSlug] = (slugCount[baseSlug] || 0) + 1;
const id = slugCount[baseSlug] === 1 ? baseSlug : `${baseSlug}-${slugCount[baseSlug] - 1}`;
heading.id = id;
const btn = doc.createElement('button');
btn.className = 'heading-link';
btn.setAttribute('aria-label', 'Copy permalink');
btn.textContent = '#';
heading.insertBefore(btn, heading.firstChild);
});
return { n, content: doc.body.innerHTML };
});
return { processedPages, searchIndex };
}, [pages]);
const [currentIdx, setCurrentIdx] = useState(() => { const [currentIdx, setCurrentIdx] = useState(() => {
const m = window.location.hash.match(/^#page-(\d+)$/); const m = window.location.hash.match(/^#page-(\d+)$/);
if (m) { if (m) {
@@ -19,6 +73,8 @@ export default function BookIndex({ title, logoText, pages }: BookIndexProps) {
return 0; return 0;
}); });
const [isSearchOpen, setIsSearchOpen] = useState(false);
const contentRef = useRef<HTMLDivElement>(null); const contentRef = useRef<HTMLDivElement>(null);
const goTo = useCallback((n: number, smooth: boolean, push: boolean) => { const goTo = useCallback((n: number, smooth: boolean, push: boolean) => {
@@ -66,9 +122,15 @@ export default function BookIndex({ title, logoText, pages }: BookIndexProps) {
return () => container.removeEventListener('scroll', handleScroll); return () => container.removeEventListener('scroll', handleScroll);
}, [pageNums]); }, [pageNums]);
// Keyboard navigation // Keyboard navigation (page-level) and search shortcut
useEffect(() => { useEffect(() => {
const handleKeyDown = (e: KeyboardEvent) => { const handleKeyDown = (e: KeyboardEvent) => {
// Ctrl+K / Ctrl+F → open search
if ((e.ctrlKey || e.metaKey) && (e.key === 'k' || e.key === 'f')) {
e.preventDefault();
setIsSearchOpen(true);
return;
}
const tag = (e.target as HTMLElement).tagName; const tag = (e.target as HTMLElement).tagName;
if (tag === 'INPUT' || tag === 'TEXTAREA') return; if (tag === 'INPUT' || tag === 'TEXTAREA') return;
setCurrentIdx(prev => { setCurrentIdx(prev => {
@@ -88,16 +150,61 @@ export default function BookIndex({ title, logoText, pages }: BookIndexProps) {
// Browser back/forward // Browser back/forward
useEffect(() => { useEffect(() => {
const handlePopState = () => { const handlePopState = () => {
const m = location.hash.match(/^#page-(\d+)$/); const hash = location.hash.slice(1);
if (m) { const pageM = hash.match(/^page-(\d+)$/);
const n = parseInt(m[1], 10); if (pageM) {
const n = parseInt(pageM[1], 10);
if (pageNums.includes(n)) goTo(n, false, false); if (pageNums.includes(n)) goTo(n, false, false);
} else if (hash) {
const target = document.getElementById(hash);
if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });
} }
}; };
window.addEventListener('popstate', handlePopState); window.addEventListener('popstate', handlePopState);
return () => window.removeEventListener('popstate', handlePopState); return () => window.removeEventListener('popstate', handlePopState);
}, [goTo, pageNums]); }, [goTo, pageNums]);
// Event delegation for heading permalink buttons
useEffect(() => {
const container = contentRef.current;
if (!container) return;
const handleClick = (e: MouseEvent) => {
const btn = (e.target as Element).closest('.heading-link') as HTMLButtonElement | null;
if (!btn) return;
const id = btn.closest('h1, h2, h3')?.id;
if (!id) return;
e.preventDefault();
const url = `${window.location.origin}${window.location.pathname}#${id}`;
history.pushState(null, '', `#${id}`);
navigator.clipboard.writeText(url).catch(() => {
const ta = document.createElement('textarea');
ta.value = url;
document.body.appendChild(ta);
ta.select();
document.execCommand('copy');
document.body.removeChild(ta);
});
const prev = btn.textContent!;
btn.textContent = '✓';
btn.classList.add('heading-link--copied');
setTimeout(() => {
btn.textContent = prev;
btn.classList.remove('heading-link--copied');
}, 1500);
};
container.addEventListener('click', handleClick);
return () => container.removeEventListener('click', handleClick);
}, []);
// Scroll to heading hash on initial load
useEffect(() => {
const hash = window.location.hash.slice(1);
if (hash && !/^page-\d+$/.test(hash)) {
const target = document.getElementById(hash);
if (target) target.scrollIntoView({ behavior: 'instant', block: 'start' });
}
}, []); // eslint-disable-line react-hooks/exhaustive-deps
const currentPage = pageNums[currentIdx]; const currentPage = pageNums[currentIdx];
return ( return (
@@ -105,6 +212,9 @@ export default function BookIndex({ title, logoText, pages }: BookIndexProps) {
<header> <header>
<div className="logo">{logoText}</div> <div className="logo">{logoText}</div>
<div className="toolbar"> <div className="toolbar">
<button className="tab" onClick={() => setIsSearchOpen(true)} title="Search (Ctrl+K)">
Search
</button>
<span id="page-indicator">{currentIdx + 1} / {total}</span> <span id="page-indicator">{currentIdx + 1} / {total}</span>
</div> </div>
</header> </header>
@@ -153,7 +263,7 @@ export default function BookIndex({ title, logoText, pages }: BookIndexProps) {
</button> </button>
</div> </div>
<div id="content" ref={contentRef}> <div id="content" ref={contentRef}>
{pages.map(({ n, content }) => ( {processedPages.map(({ n, content }) => (
<section <section
key={n} key={n}
id={`page-${n}`} id={`page-${n}`}
@@ -164,6 +274,14 @@ export default function BookIndex({ title, logoText, pages }: BookIndexProps) {
</div> </div>
</div> </div>
</div> </div>
{isSearchOpen && (
<SearchModal
searchIndex={searchIndex}
onNavigate={n => goTo(n, false, true)}
onClose={() => setIsSearchOpen(false)}
/>
)}
</> </>
); );
} }

128
src/SearchModal.tsx Normal file
View File

@@ -0,0 +1,128 @@
import React, { useState, useEffect, useRef, useMemo, useCallback } from 'react';
export interface SearchEntry {
pageNum: number;
headingContext: string;
text: string;
}
interface Props {
searchIndex: SearchEntry[];
onNavigate: (pageNum: number) => void;
onClose: () => void;
}
function escapeHtml(s: string): string {
return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}
function buildSnippetHtml(text: string, q: string): string {
const lo = text.toLowerCase();
const idx = lo.indexOf(q);
if (idx === -1) return escapeHtml(text.slice(0, 140)) + (text.length > 140 ? '…' : '');
const r = 65;
const s = Math.max(0, idx - r);
const e = Math.min(text.length, idx + q.length + r);
return (
(s > 0 ? '…' : '') +
escapeHtml(text.slice(s, idx)) +
`<mark>${escapeHtml(text.slice(idx, idx + q.length))}</mark>` +
escapeHtml(text.slice(idx + q.length, e)) +
(e < text.length ? '…' : '')
);
}
export default function SearchModal({ searchIndex, onNavigate, onClose }: Props) {
const [query, setQuery] = useState('');
const [activeIdx, setActiveIdx] = useState(0);
const inputRef = useRef<HTMLInputElement>(null);
const listRef = useRef<HTMLUListElement>(null);
useEffect(() => { inputRef.current?.focus(); }, []);
const results = useMemo(() => {
const q = query.trim().toLowerCase();
if (q.length < 2) return [];
const seen: Record<number, number> = {};
const out: { pageNum: number; headingContext: string; snippetHtml: string }[] = [];
for (const entry of searchIndex) {
if (out.length >= 40) break;
const hitText = entry.text.toLowerCase().includes(q);
const hitHeading = entry.headingContext.toLowerCase().includes(q);
if (!hitText && !hitHeading) continue;
const count = seen[entry.pageNum] ?? 0;
if (count >= 2) continue;
seen[entry.pageNum] = count + 1;
out.push({
pageNum: entry.pageNum,
headingContext: entry.headingContext,
snippetHtml: buildSnippetHtml(hitText ? entry.text : entry.headingContext, q),
});
}
return out;
}, [query, searchIndex]);
useEffect(() => { setActiveIdx(0); }, [results]);
useEffect(() => {
const el = listRef.current?.children[activeIdx] as HTMLElement | undefined;
el?.scrollIntoView({ block: 'nearest' });
}, [activeIdx]);
const go = useCallback((pageNum: number) => {
onNavigate(pageNum);
onClose();
}, [onNavigate, onClose]);
const handleKeyDown = (e: React.KeyboardEvent) => {
if (e.key === 'Escape') { onClose(); return; }
if (e.key === 'ArrowDown') { e.preventDefault(); setActiveIdx(i => Math.min(i + 1, results.length - 1)); }
if (e.key === 'ArrowUp') { e.preventDefault(); setActiveIdx(i => Math.max(i - 1, 0)); }
if (e.key === 'Enter' && results[activeIdx]) go(results[activeIdx].pageNum);
};
const q = query.trim();
return (
<div className="search-overlay" onClick={onClose}>
<div className="search-modal" onClick={e => e.stopPropagation()}>
<input
ref={inputRef}
className="search-input"
type="text"
placeholder="Search the rulebook…"
value={query}
onChange={e => setQuery(e.target.value)}
onKeyDown={handleKeyDown}
/>
{q.length < 2 ? (
<div className="search-empty">Type at least 2 characters</div>
) : results.length === 0 ? (
<div className="search-empty">No results for &ldquo;{q}&rdquo;</div>
) : (
<ul className="search-results" ref={listRef}>
{results.map((r, i) => (
<li
key={i}
className={`search-result${i === activeIdx ? ' active' : ''}`}
onClick={() => go(r.pageNum)}
onMouseEnter={() => setActiveIdx(i)}
>
<div className="search-result-meta">
<span className="search-result-heading">{r.headingContext || '—'}</span>
<span className="search-result-page">p.{r.pageNum}</span>
</div>
<div className="search-result-snippet" dangerouslySetInnerHTML={{ __html: r.snippetHtml }} />
</li>
))}
</ul>
)}
<div className="search-footer">
<span> navigate</span>
<span> go to page</span>
<span>esc close</span>
</div>
</div>
</div>
);
}

View File

@@ -85,6 +85,25 @@ module.exports = (env, argv) => {
...(isProd ...(isProd
? [new MiniCssExtractPlugin({ filename: "[name].[contenthash].css" })] ? [new MiniCssExtractPlugin({ filename: "[name].[contenthash].css" })]
: []), : []),
// Register book HTML source files as compilation dependencies so webpack
// watches them in dev mode and triggers a rebuild when they change.
{
apply(compiler) {
compiler.hooks.afterCompile.tap("WatchBookPages", (compilation) => {
const bookDirs = [
path.resolve(__dirname, "books/core"),
path.resolve(__dirname, "books/natural-fantasy-atlas"),
];
for (const dir of bookDirs) {
try {
fs.readdirSync(dir)
.filter(f => f.endsWith(".html") && f !== "index.html")
.forEach(f => compilation.fileDependencies.add(path.join(dir, f)));
} catch (_) {}
}
});
},
},
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
template: "./src/fabula-ultima-sheet.html", template: "./src/fabula-ultima-sheet.html",
filename: "index.html", filename: "index.html",
@@ -92,7 +111,7 @@ module.exports = (env, argv) => {
scriptLoading: "blocking", scriptLoading: "blocking",
}), }),
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
templateContent: bookTemplate( templateContent: () => bookTemplate(
"Fabula Ultima - Core Rulebook", "Fabula Ultima - Core Rulebook",
"Core Rules", "Core Rules",
"./books/core" "./books/core"
@@ -102,7 +121,7 @@ module.exports = (env, argv) => {
scriptLoading: "blocking", scriptLoading: "blocking",
}), }),
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
templateContent: bookTemplate( templateContent: () => bookTemplate(
"Fabula Ultima - Natural Fantasy Atlas", "Fabula Ultima - Natural Fantasy Atlas",
"Natural Fantasy Atlas", "Natural Fantasy Atlas",
"./books/natural-fantasy-atlas" "./books/natural-fantasy-atlas"