From 0ae1701b8223efe9c294ebe8d50cf6ff6a6381e1 Mon Sep 17 00:00:00 2001 From: Tim McCarthy Date: Fri, 4 Sep 2026 19:58:35 -0700 Subject: [PATCH] Improve character suggestions and serve pools from the API --- TODO.md | 2 +- .../components/CharacterCreationPhase.svelte | 25 +- frontend/src/components/RecruitPhase.svelte | 25 +- frontend/src/lib/changelog.js | 3 +- frontend/src/lib/suggestions.js | 1248 +---------------- frontend/src/pages/Dashboard.svelte | 22 +- frontend/tests/suggestions.test.js | 31 + src/pirats/crud_character.py | 2 +- src/pirats/routes_character.py | 6 + src/pirats/suggestions.py | 126 ++ tests/test_suggestions.py | 20 + 11 files changed, 255 insertions(+), 1255 deletions(-) create mode 100644 frontend/tests/suggestions.test.js create mode 100644 src/pirats/suggestions.py create mode 100644 tests/test_suggestions.py diff --git a/TODO.md b/TODO.md index 40ec1fd..ec175df 100644 --- a/TODO.md +++ b/TODO.md @@ -38,4 +38,4 @@ ## Words Words Words - [x] **TLDR rules**. A one page summary sheet of the rulebook, for the impatient -- [ ] **Suggestions.** Take a pass through all of the suggestions in suggestions.js, rewrite ones that are stiff, awkward, or don't fit the theme/setting as described in the rulebook. Move the suggestion pool from suggestions.js into a backend API endpoint. +- [x] **Suggestions.** Take a pass through all of the suggestions in suggestions.js, rewrite ones that are stiff, awkward, or don't fit the theme/setting as described in the rulebook. Move the suggestion pool from suggestions.js into a backend API endpoint. diff --git a/frontend/src/components/CharacterCreationPhase.svelte b/frontend/src/components/CharacterCreationPhase.svelte index 6890d98..73c161d 100644 --- a/frontend/src/components/CharacterCreationPhase.svelte +++ b/frontend/src/components/CharacterCreationPhase.svelte @@ -7,6 +7,17 @@ export let state; + let suggestionError = ''; + async function suggest(type, apply) { + suggestionError = ''; + try { + apply(await getSuggestion(type)); + } catch (error) { + suggestionError = 'Could not load suggestions. Try again.'; + } + } + + // Form states let basicDetails = { avatar_look: state.player.avatar_look || '', @@ -252,6 +263,8 @@ +{#if suggestionError}

{suggestionError}

{/if} +

Character Sheet Creation

@@ -281,28 +294,28 @@
- {#if devMode}{/if} + {#if devMode}{/if}
- {#if devMode}{/if} + {#if devMode}{/if}
- {#if devMode}{/if} + {#if devMode}{/if}
- {#if devMode}{/if} + {#if devMode}{/if}
@@ -356,7 +369,7 @@
- {#if devMode}{/if} + {#if devMode}{/if}
@@ -369,7 +382,7 @@
- {#if devMode}{/if} + {#if devMode}{/if}
diff --git a/frontend/src/components/RecruitPhase.svelte b/frontend/src/components/RecruitPhase.svelte index 4628f83..a72fc46 100644 --- a/frontend/src/components/RecruitPhase.svelte +++ b/frontend/src/components/RecruitPhase.svelte @@ -6,6 +6,17 @@ export let state; + let suggestionError = ''; + async function suggest(type, apply) { + suggestionError = ''; + try { + apply(await getSuggestion(type)); + } catch (error) { + suggestionError = 'Could not load suggestions. Try again.'; + } + } + + function getPlayerName(id) { if (!id) return 'None'; const p = state.players.find(x => x.id === id); @@ -137,6 +148,8 @@ +{#if suggestionError}

{suggestionError}

{/if} +

🐀 New Recruits

@@ -162,28 +175,28 @@
- {#if devMode}{/if} + {#if devMode}{/if}
- {#if devMode}{/if} + {#if devMode}{/if}
- {#if devMode}{/if} + {#if devMode}{/if}
- {#if devMode}{/if} + {#if devMode}{/if}
@@ -264,7 +277,7 @@
- {#if devMode}{/if} + {#if devMode}{/if}
@@ -277,7 +290,7 @@
- {#if devMode}{/if} + {#if devMode}{/if}
diff --git a/frontend/src/lib/changelog.js b/frontend/src/lib/changelog.js index 839576b..e54d469 100644 --- a/frontend/src/lib/changelog.js +++ b/frontend/src/lib/changelog.js @@ -6,10 +6,11 @@ // - Add a CHANGELOG entry only when a commit changes something players can // see. Skip refactors, tests, and tooling. Keep wording player-facing. -export const VERSION = 46; +export const VERSION = 47; // Newest first. Each entry: { version, date: 'YYYY-MM-DD', changes: [string, ...] }. export const CHANGELOG = [ + { version: 47, date: '2026-09-04', changes: ['Rewrote character suggestions with scrappy pirate looks, distinctive smells, first words, and crew quirks that fit Yeld.'] }, { version: 46, date: '2026-09-04', changes: ['Added a printable TL;DR rules page, linked at the top of the full rulebook.'] }, { version: 44, date: '2026-09-04', changes: ['Crew Objectives opens as one connected panel, with the toggle and checklist sharing a border and background.'] }, { version: 43, date: '2026-09-04', changes: ['The crew roster keeps players in the same order when roles or ranks change, including when someone becomes the Deep.'] }, diff --git a/frontend/src/lib/suggestions.js b/frontend/src/lib/suggestions.js index 2b098e9..d1b49ef 100644 --- a/frontend/src/lib/suggestions.js +++ b/frontend/src/lib/suggestions.js @@ -1,1221 +1,5 @@ import { apiRequest } from './api'; -// Auto-generated math-pirate suggestions pool for character creation -const SUGGESTIONS = { - "look": [ - "A cyber-pirate waistcoat buttoned with old copper coins", - "A mechanical leather vest covered in algebraic graffiti", - "A salty tail glowing with neon math runes", - "A ink-stained paw replaced with a brass protractor-claw", - "A barnacle-covered paw replaced with a brass protractor-claw", - "A cyber-pirate tricorn hat with a built-in compass", - "A salty tricorn hat with a built-in compass", - "A scurvy snout that twitches in rhythm with prime numbers", - "A brass-plated coat patterned like a checkerboard", - "A brass telescope permanently strapped to the left ear", - "A neon-glowing tail glowing with neon math runes", - "A scurvy paw replaced with a brass protractor-claw", - "A ancient whisker arrangement forming a perfect sine wave", - "A brass-plated leather vest covered in algebraic graffiti", - "A brass-plated peg-leg with a hidden slide-rule drawer", - "A polished tail glowing with neon math runes", - "A barnacle-covered snout with geometry scars", - "A ancient bandana soaked in salty seawater and ink", - "A ancient coat patterned like a checkerboard", - "A rusty snout that twitches in rhythm with prime numbers", - "A weather-beaten tail curled into a Fibonacci spiral", - "A gilded paw replaced with a brass protractor-claw", - "A gilded tricorn hat with a built-in compass", - "A brass-plated tail glowing with neon math runes", - "A mechanical satchel full of crumpled grid paper", - "A mechanical tricorn hat with nested abacus beads", - "A one-eyed leather vest covered in algebraic graffiti", - "A ancient tail glowing with neon math runes", - "A rusty leather vest covered in algebraic graffiti", - "A one-eyed paw replaced with a brass protractor-claw", - "A phosphorescent tail curled into a Fibonacci spiral", - "A weather-beaten paw replaced with a brass protractor-claw", - "A brass-plated whisker arrangement forming a perfect sine wave", - "A ancient snout that twitches in rhythm with prime numbers", - "A polished tricorn hat with a built-in compass", - "A scurvy whisker arrangement forming a perfect sine wave", - "A polished paw replaced with a brass protractor-claw", - "A gilded tricorn hat with nested abacus beads", - "A scarf patterned with infinite decimals of Pi", - "A cyber-pirate leather vest covered in algebraic graffiti", - "A barnacle-covered bandana soaked in salty seawater and ink", - "A phosphorescent tricorn hat with a built-in compass", - "A gilded waistcoat buttoned with old copper coins", - "A cyber-pirate satchel full of crumpled grid paper", - "A tricorn hat folded from an old calculus exam", - "A barnacle-covered tail curled into a Fibonacci spiral", - "A barnacle-covered satchel full of crumpled grid paper", - "A neon-glowing eyepatch displaying coordinate maps", - "A weather-beaten bandana soaked in salty seawater and ink", - "A gilded whisker arrangement forming a perfect sine wave", - "A one-eyed coat patterned like a checkerboard", - "A polished eyepatch displaying coordinate maps", - "A salty tricorn hat with nested abacus beads", - "A gilded eyepatch displaying coordinate maps", - "A mechanical waistcoat buttoned with old copper coins", - "A phosphorescent coat patterned like a checkerboard", - "A tiny chalkboard strapped to the forearm for quick calculations", - "A phosphorescent waistcoat buttoned with old copper coins", - "A ancient eyepatch displaying coordinate maps", - "A brass-plated eyepatch displaying coordinate maps", - "Whiskers braided with tiny colorful abacus beads", - "A salty satchel full of crumpled grid paper", - "A barnacle-covered eyepatch displaying coordinate maps", - "A cyber-pirate tail curled into a Fibonacci spiral", - "A cyber-pirate whisker arrangement forming a perfect sine wave", - "A weather-beaten snout with geometry scars", - "A ink-stained waistcoat buttoned with old copper coins", - "A neon-glowing tail curled into a Fibonacci spiral", - "A ink-stained eyepatch displaying coordinate maps", - "A weather-beaten whisker arrangement forming a perfect sine wave", - "A brass-plated tricorn hat with nested abacus beads", - "A polished waistcoat buttoned with old copper coins", - "A salty tail curled into a Fibonacci spiral", - "A scurvy satchel full of crumpled grid paper", - "A gilded tail glowing with neon math runes", - "A scurvy coat patterned like a checkerboard", - "A barnacle-covered tricorn hat with a built-in compass", - "A bandana decorated with coordinate grids", - "A barnacle-covered tricorn hat with nested abacus beads", - "A weather-beaten tail glowing with neon math runes", - "A rusty tail glowing with neon math runes", - "A scurvy waistcoat buttoned with old copper coins", - "A mechanical peg-leg with a hidden slide-rule drawer", - "A silver claw replacement shaped like a protractor", - "A salty paw replaced with a brass protractor-claw", - "A golden tooth engraved with the division sign", - "A ancient tail curled into a Fibonacci spiral", - "A barnacle-covered peg-leg with a hidden slide-rule drawer", - "A barnacle-covered waistcoat buttoned with old copper coins", - "A ink-stained whisker arrangement forming a perfect sine wave", - "A scurvy peg-leg with a hidden slide-rule drawer", - "A ink-stained snout that twitches in rhythm with prime numbers", - "A one-eyed tail glowing with neon math runes", - "A salty peg-leg with a hidden slide-rule drawer", - "A phosphorescent bandana soaked in salty seawater and ink", - "A cyber-pirate snout that twitches in rhythm with prime numbers", - "A ancient tricorn hat with a built-in compass", - "A one-eyed satchel full of crumpled grid paper", - "A rusty paw replaced with a brass protractor-claw", - "A salty waistcoat buttoned with old copper coins", - "A brass-plated tricorn hat with a built-in compass", - "A ancient paw replaced with a brass protractor-claw", - "An eye patch made of a black spade card", - "A ink-stained coat patterned like a checkerboard", - "A barnacle-covered whisker arrangement forming a perfect sine wave", - "A neon-glowing bandana soaked in salty seawater and ink", - "A barnacle-covered tail glowing with neon math runes", - "A one-eyed waistcoat buttoned with old copper coins", - "Fur bleached in the pattern of a Venn diagram", - "A one-eyed snout that twitches in rhythm with prime numbers", - "A one-eyed snout with geometry scars", - "A ink-stained leather vest covered in algebraic graffiti", - "A polished satchel full of crumpled grid paper", - "A brass-plated snout with geometry scars", - "A brass-plated tail curled into a Fibonacci spiral", - "A neon-glowing snout with geometry scars", - "Fur that smells faintly of chalk dust and gunpowder", - "A cyber-pirate paw replaced with a brass protractor-claw", - "A weather-beaten eyepatch displaying coordinate maps", - "A brass-plated satchel full of crumpled grid paper", - "A ancient snout with geometry scars", - "A ancient satchel full of crumpled grid paper", - "A miniature compass hanging from the left nostril ring", - "A polished tricorn hat with nested abacus beads", - "A cyber-pirate tail glowing with neon math runes", - "A one-eyed eyepatch displaying coordinate maps", - "A ink-stained tricorn hat with a built-in compass", - "A cyber-pirate eyepatch displaying coordinate maps", - "A one-eyed peg-leg with a hidden slide-rule drawer", - "A peg leg carved from a heavy wooden slide rule", - "A barnacle-covered coat patterned like a checkerboard", - "A phosphorescent tail glowing with neon math runes", - "A salty snout that twitches in rhythm with prime numbers", - "A cyber-pirate snout with geometry scars", - "A ink-stained snout with geometry scars", - "A glowing neon abacus tattooed on their back", - "A rusty peg-leg with a hidden slide-rule drawer", - "A rusty snout with geometry scars", - "An abacus-wheel peg leg that rolls instead of clicks", - "A neon-glowing waistcoat buttoned with old copper coins", - "A polished coat patterned like a checkerboard", - "A mechanical coat patterned like a checkerboard", - "A phosphorescent tricorn hat with nested abacus beads", - "A brass-plated waistcoat buttoned with old copper coins", - "A barnacle-covered leather vest covered in algebraic graffiti", - "A ancient tricorn hat with nested abacus beads", - "Ear notched in the shape of a perfect right angle", - "A ink-stained tricorn hat with nested abacus beads", - "A mechanical paw replaced with a brass protractor-claw", - "A weather-beaten tricorn hat with a built-in compass", - "A gilded satchel full of crumpled grid paper", - "A ink-stained satchel full of crumpled grid paper", - "A salty coat patterned like a checkerboard", - "A gilded peg-leg with a hidden slide-rule drawer", - "A ink-stained bandana soaked in salty seawater and ink", - "A gilded tail curled into a Fibonacci spiral", - "A mechanical whisker arrangement forming a perfect sine wave", - "A phosphorescent peg-leg with a hidden slide-rule drawer", - "A polished bandana soaked in salty seawater and ink", - "A monocle that displays neon green equations", - "A polished snout that twitches in rhythm with prime numbers", - "A mechanical tail curled into a Fibonacci spiral", - "A phosphorescent leather vest covered in algebraic graffiti", - "A scurvy tail curled into a Fibonacci spiral", - "A scurvy eyepatch displaying coordinate maps", - "A phosphorescent snout that twitches in rhythm with prime numbers", - "A neon-glowing snout that twitches in rhythm with prime numbers", - "A salty whisker arrangement forming a perfect sine wave", - "A phosphorescent paw replaced with a brass protractor-claw", - "A scurvy bandana soaked in salty seawater and ink", - "A neon-glowing whisker arrangement forming a perfect sine wave", - "A scurvy snout with geometry scars", - "A neon-glowing tricorn hat with nested abacus beads", - "A brass-plated bandana soaked in salty seawater and ink", - "A scurvy tricorn hat with nested abacus beads", - "A ancient peg-leg with a hidden slide-rule drawer", - "A mechanical bandana soaked in salty seawater and ink", - "A polished leather vest covered in algebraic graffiti", - "A gilded snout that twitches in rhythm with prime numbers", - "A scurvy tail glowing with neon math runes", - "A neon-glowing leather vest covered in algebraic graffiti", - "A brass-plated snout that twitches in rhythm with prime numbers", - "A rusty coat patterned like a checkerboard", - "A ink-stained tail glowing with neon math runes", - "A tail wrapped in copper wire that sparks when they get excited", - "A gilded leather vest covered in algebraic graffiti", - "A salty eyepatch displaying coordinate maps", - "A weather-beaten waistcoat buttoned with old copper coins", - "A gilded snout with geometry scars", - "A mechanical eyepatch displaying coordinate maps", - "A rusty waistcoat buttoned with old copper coins", - "A cyber-pirate tricorn hat with nested abacus beads", - "A salty bandana soaked in salty seawater and ink", - "A weather-beaten satchel full of crumpled grid paper", - "A rusty whisker arrangement forming a perfect sine wave", - "A salty snout with geometry scars", - "A cyber-pirate bandana soaked in salty seawater and ink", - "A ancient waistcoat buttoned with old copper coins", - "A rusty tricorn hat with nested abacus beads", - "A rusty eyepatch displaying coordinate maps" - ], - "smell": [ - "reminiscent of cheese and damp wood", - "suspiciously smelling of ink and sour lemons", - "suspiciously smelling of ink and spilled ink", - "pleasantly smelling of rum and damp wood", - "faintly of seaweed and damp wood", - "faintly of pine tar and sour lemons", - "faintly of ink and lightning sparks", - "like a mix of pine tar and spilled ink", - "strongly of ozone and sour lemons", - "like a mix of ozone and salty air", - "suspiciously smelling of seaweed and rusty iron", - "suspiciously smelling of seaweed and spilled ink", - "faintly of cheese and sour lemons", - "like a mix of ink and lightning sparks", - "strongly of gunpowder and spilled ink", - "pleasantly smelling of seaweed and peppermint oil", - "suspiciously smelling of rum and lightning sparks", - "suspiciously smelling of ozone and stale grog", - "pleasantly smelling of rum and burnt abacuses", - "strongly of cheese and damp wood", - "Ozone sparks and sulfur", - "reminiscent of gunpowder and wet tail fur", - "strongly of cheese and burnt abacuses", - "like a mix of pine tar and wet tail fur", - "strongly of cheese and spilled ink", - "like a mix of ozone and damp wood", - "pleasantly smelling of ink and sour lemons", - "pleasantly smelling of copper and wet tail fur", - "faintly of rum and burnt abacuses", - "suspiciously smelling of gunpowder and rusty iron", - "like a mix of copper and lightning sparks", - "pleasantly smelling of seaweed and burnt abacuses", - "reminiscent of copper and lightning sparks", - "reminiscent of cheese and burnt abacuses", - "pleasantly smelling of parchment and burnt abacuses", - "like a mix of seaweed and damp wood", - "Gunpowder smoke and melted candle wax", - "like a mix of ozone and burnt abacuses", - "faintly of rum and stale grog", - "like a mix of cheese and spilled ink", - "suspiciously smelling of parchment and sour lemons", - "faintly of copper and wet tail fur", - "faintly of cheese and wet tail fur", - "faintly of cheese and damp wood", - "faintly of pine tar and rusty iron", - "strongly of gunpowder and peppermint oil", - "faintly of pine tar and damp wood", - "strongly of seaweed and damp wood", - "like a mix of copper and wet tail fur", - "suspiciously smelling of cheese and salty air", - "faintly of rum and lightning sparks", - "reminiscent of chalk dust and spilled ink", - "strongly of copper and wet tail fur", - "pleasantly smelling of pine tar and damp wood", - "Damp sea charts and ozone", - "like a mix of cheese and stale grog", - "strongly of ink and rusty iron", - "like a mix of seaweed and salty air", - "pleasantly smelling of chalk dust and spilled ink", - "pleasantly smelling of chalk dust and peppermint oil", - "suspiciously smelling of copper and salty air", - "reminiscent of ozone and wet tail fur", - "faintly of rum and salty air", - "reminiscent of chalk dust and sour lemons", - "suspiciously smelling of pine tar and spilled ink", - "like a mix of cheese and wet tail fur", - "strongly of ink and sour lemons", - "suspiciously smelling of chalk dust and damp wood", - "Burnt tea leaves and old books", - "faintly of parchment and wet tail fur", - "faintly of copper and sour lemons", - "faintly of chalk dust and spilled ink", - "faintly of gunpowder and lightning sparks", - "reminiscent of parchment and wet tail fur", - "pleasantly smelling of parchment and rusty iron", - "reminiscent of cheese and stale grog", - "reminiscent of ink and wet tail fur", - "pleasantly smelling of gunpowder and burnt abacuses", - "reminiscent of parchment and stale grog", - "pleasantly smelling of chalk dust and lightning sparks", - "reminiscent of copper and peppermint oil", - "pleasantly smelling of ink and peppermint oil", - "Ozone and seaweed-wrapped tobacco", - "strongly of cheese and rusty iron", - "faintly of chalk dust and burnt abacuses", - "pleasantly smelling of seaweed and lightning sparks", - "suspiciously smelling of rum and stale grog", - "like a mix of rum and burnt abacuses", - "suspiciously smelling of rum and peppermint oil", - "suspiciously smelling of copper and burnt abacuses", - "reminiscent of pine tar and spilled ink", - "reminiscent of parchment and lightning sparks", - "suspiciously smelling of ink and rusty iron", - "like a mix of pine tar and damp wood", - "pleasantly smelling of chalk dust and salty air", - "faintly of copper and burnt abacuses", - "pleasantly smelling of ozone and stale grog", - "like a mix of cheese and lightning sparks", - "strongly of pine tar and salty air", - "like a mix of seaweed and rusty iron", - "pleasantly smelling of seaweed and sour lemons", - "suspiciously smelling of gunpowder and lightning sparks", - "suspiciously smelling of ink and peppermint oil", - "like a mix of seaweed and wet tail fur", - "reminiscent of gunpowder and burnt abacuses", - "suspiciously smelling of pine tar and sour lemons", - "pleasantly smelling of ink and lightning sparks", - "reminiscent of pine tar and peppermint oil", - "pleasantly smelling of rum and rusty iron", - "like a mix of gunpowder and wet tail fur", - "suspiciously smelling of pine tar and lightning sparks", - "pleasantly smelling of copper and spilled ink", - "strongly of ozone and wet tail fur", - "reminiscent of ink and burnt abacuses", - "like a mix of copper and stale grog", - "faintly of copper and stale grog", - "like a mix of copper and peppermint oil", - "suspiciously smelling of copper and stale grog", - "suspiciously smelling of cheese and burnt abacuses", - "strongly of ozone and spilled ink", - "Burnt cheese and gunpowder", - "pleasantly smelling of seaweed and salty air", - "pleasantly smelling of seaweed and stale grog", - "like a mix of ozone and peppermint oil", - "strongly of pine tar and rusty iron", - "strongly of gunpowder and stale grog", - "reminiscent of parchment and rusty iron", - "faintly of copper and lightning sparks", - "faintly of chalk dust and sour lemons", - "suspiciously smelling of chalk dust and stale grog", - "Freshly sharpened pencils and vinegar", - "pleasantly smelling of parchment and sour lemons", - "pleasantly smelling of ozone and sour lemons", - "faintly of cheese and rusty iron", - "like a mix of seaweed and burnt abacuses", - "reminiscent of gunpowder and damp wood", - "like a mix of cheese and sour lemons", - "reminiscent of seaweed and stale grog", - "like a mix of gunpowder and peppermint oil", - "reminiscent of ozone and stale grog", - "strongly of seaweed and burnt abacuses", - "faintly of ink and rusty iron", - "faintly of ink and spilled ink", - "suspiciously smelling of pine tar and peppermint oil", - "strongly of parchment and lightning sparks", - "reminiscent of chalk dust and damp wood", - "suspiciously smelling of gunpowder and stale grog", - "faintly of ozone and lightning sparks", - "faintly of rum and spilled ink", - "strongly of pine tar and lightning sparks", - "strongly of pine tar and burnt abacuses", - "pleasantly smelling of rum and spilled ink", - "reminiscent of rum and stale grog", - "faintly of copper and rusty iron", - "suspiciously smelling of ozone and wet tail fur", - "strongly of seaweed and spilled ink", - "suspiciously smelling of parchment and salty air", - "strongly of copper and lightning sparks", - "pleasantly smelling of cheese and peppermint oil", - "reminiscent of cheese and peppermint oil", - "pleasantly smelling of seaweed and rusty iron", - "suspiciously smelling of ozone and lightning sparks", - "strongly of rum and peppermint oil", - "faintly of chalk dust and peppermint oil", - "like a mix of rum and wet tail fur", - "like a mix of cheese and damp wood", - "reminiscent of chalk dust and wet tail fur", - "reminiscent of rum and peppermint oil", - "suspiciously smelling of copper and spilled ink", - "reminiscent of cheese and sour lemons", - "pleasantly smelling of parchment and damp wood", - "reminiscent of chalk dust and salty air", - "pleasantly smelling of pine tar and salty air", - "strongly of rum and wet tail fur", - "strongly of ink and damp wood", - "like a mix of pine tar and peppermint oil", - "strongly of gunpowder and sour lemons", - "faintly of ink and burnt abacuses", - "like a mix of rum and sour lemons", - "pleasantly smelling of cheese and sour lemons", - "strongly of cheese and lightning sparks", - "reminiscent of chalk dust and burnt abacuses", - "Salty parchment and copper coins", - "strongly of rum and lightning sparks", - "suspiciously smelling of seaweed and burnt abacuses", - "reminiscent of cheese and rusty iron", - "faintly of cheese and lightning sparks", - "like a mix of cheese and peppermint oil", - "reminiscent of ink and spilled ink", - "faintly of pine tar and peppermint oil", - "faintly of parchment and burnt abacuses", - "reminiscent of parchment and burnt abacuses", - "strongly of pine tar and peppermint oil", - "pleasantly smelling of ozone and peppermint oil", - "like a mix of parchment and rusty iron", - "faintly of ink and stale grog", - "pleasantly smelling of pine tar and burnt abacuses", - "suspiciously smelling of cheese and peppermint oil", - "strongly of gunpowder and rusty iron", - "reminiscent of cheese and spilled ink" - ], - "first_words": [ - "By the deep sea! the probability indicates we are sinking logarithmically!", - "I have transformed... and my hunger is logarithmic!", - "Avast! the geometry of this deck requires the coordinates of the treasure island!", - "Blow me down! the geometry of this deck requires the shortest boarding vector!", - "Blast it! the slope of the sea shows a prime number of hazards!", - "Aha! the abacus predicts infinite cheese!", - "Blow me down! the probability indicates the shortest boarding vector!", - "Arrr, the hypotenuse is magnificent!", - "To the brig! the slope of the sea shows a prime number of hazards!", - "Shiver my timbers! the coordinates point to the gats are ready to fire!", - "Arrr! my tail calculations reveal a division by zero!", - "Avast! the slope of the sea shows the coordinates of the treasure island!", - "Arrr! the tangent of the gat implies a division by zero!", - "Shiver my timbers! the slope of the sea shows an escape velocity of ten knots!", - "Hear me crew! the slope of the sea shows a division by zero!", - "Shiver my timbers! the probability indicates a division by zero!", - "Hear me crew! the captain's slide rule shows infinite cheese!", - "Avast! the geometry of this deck requires the gats are ready to fire!", - "Hear me crew! the tangent of the gat implies a perfect circle of doom!", - "Aha! the formula for cheese says we are sinking logarithmically!", - "Aha! the tangent of the gat implies a jackpot of gold doubloons!", - "Aha! the probability indicates infinite cheese!", - "To the brig! my tail calculations reveal a division by zero!", - "To the brig! the tangent of the gat implies a jackpot of gold doubloons!", - "Look alive! the slope of the sea shows infinite cheese!", - "Look alive! the geometry of this deck requires a perfect circle of doom!", - "Shiver my timbers! the captain's slide rule shows we are sinking logarithmically!", - "Blast it! the tangent of the gat implies the shortest boarding vector!", - "To the horizon, at a 45-degree angle!", - "To the brig! the formula for cheese says the gats are ready to fire!", - "Arrr! the captain's slide rule shows the shortest boarding vector!", - "Blow me down! the coordinates point to an escape velocity of ten knots!", - "Hear me crew! the probability indicates we are sinking logarithmically!", - "Look alive! the matrix of the hold contains a jackpot of gold doubloons!", - "Blow me down! the slope of the sea shows an escape velocity of ten knots!", - "Aha! the slope of the sea shows infinite cheese!", - "Arrr, divide by zero!", - "Arrr! the captain's slide rule shows infinite cheese!", - "Arrr! the coordinates point to the coordinates of the treasure island!", - "Look alive! my tail calculations reveal we are sinking logarithmically!", - "To the brig! the slope of the sea shows an escape velocity of ten knots!", - "Blast it! the coordinates point to an escape velocity of ten knots!", - "Aha! the matrix of the hold contains we are sinking logarithmically!", - "Look alive! the coordinates point to the gats are ready to fire!", - "Arrr! the geometry of this deck requires the coordinates of the treasure island!", - "Blast it! the slope of the sea shows an escape velocity of ten knots!", - "Arrr! the slope of the sea shows a jackpot of gold doubloons!", - "By the deep sea! the probability indicates the shortest boarding vector!", - "Hear me crew! the coordinates point to an escape velocity of ten knots!", - "Look alive! the geometry of this deck requires infinite cheese!", - "Arrr! the abacus predicts infinite cheese!", - "Arrr! the slope of the sea shows infinite cheese!", - "Avast! the probability indicates the shortest boarding vector!", - "Avast! the abacus predicts a prime number of hazards!", - "Blow me down! the slope of the sea shows a perfect circle of doom!", - "Blow me down! the formula for cheese says the coordinates of the treasure island!", - "Hear me crew! the coordinates point to the coordinates of the treasure island!", - "To the brig! the captain's slide rule shows the coordinates of the treasure island!", - "Hear me crew! my tail calculations reveal a prime number of hazards!", - "Aha! the tangent of the gat implies a division by zero!", - "Arrr! the geometry of this deck requires a jackpot of gold doubloons!", - "Blow me down! my tail calculations reveal a jackpot of gold doubloons!", - "To the brig! the coordinates point to we are sinking logarithmically!", - "Blow me down! the geometry of this deck requires we are sinking logarithmically!", - "By the deep sea! the slope of the sea shows the shortest boarding vector!", - "Hear me crew! the formula for cheese says infinite cheese!", - "Shiver my timbers! the coordinates point to a prime number of hazards!", - "Shiver my timbers! the matrix of the hold contains the coordinates of the treasure island!", - "Aha! the formula for cheese says the shortest boarding vector!", - "Avast! the slope of the sea shows we are sinking logarithmically!", - "Aha! my tail calculations reveal the shortest boarding vector!", - "By the deep sea! the matrix of the hold contains the coordinates of the treasure island!", - "Arrr! the matrix of the hold contains a prime number of hazards!", - "Shiver my timbers! my tail calculations reveal a perfect circle of doom!", - "Arrr! the geometry of this deck requires we are sinking logarithmically!", - "Hear me crew! the slope of the sea shows a perfect circle of doom!", - "Aha! the matrix of the hold contains an escape velocity of ten knots!", - "Shiver my timbers! the captain's slide rule shows the gats are ready to fire!", - "Blow me down! the captain's slide rule shows the coordinates of the treasure island!", - "Hear me crew! the coordinates point to the shortest boarding vector!", - "Blast it! the captain's slide rule shows the shortest boarding vector!", - "Arrr! the coordinates point to the shortest boarding vector!", - "Avast! the geometry of this deck requires a perfect circle of doom!", - "Arrr! the coordinates point to infinite cheese!", - "Arrr! the tangent of the gat implies infinite cheese!", - "Look alive! the slope of the sea shows a jackpot of gold doubloons!", - "Avast! the slope of the sea shows a division by zero!", - "Blow me down! the coordinates point to the shortest boarding vector!", - "Shiver my timbers! the geometry of this deck requires a division by zero!", - "Arrr! the formula for cheese says we are sinking logarithmically!", - "Blast it! the geometry of this deck requires the coordinates of the treasure island!", - "Look alive! the matrix of the hold contains a division by zero!", - "To the brig! the captain's slide rule shows the gats are ready to fire!", - "Hear me crew! the probability indicates an escape velocity of ten knots!", - "Avast! the tangent of the gat implies a perfect circle of doom!", - "Shiver my timbers! the captain's slide rule shows infinite cheese!", - "Shiver my decimals!", - "Blast it! the probability indicates an escape velocity of ten knots!", - "Arrr! the probability indicates the gats are ready to fire!", - "Arrr! the captain's slide rule shows the coordinates of the treasure island!", - "Blow me down! the tangent of the gat implies the shortest boarding vector!", - "Shiver my timbers! the matrix of the hold contains we are sinking logarithmically!", - "By the deep sea! the abacus predicts we are sinking logarithmically!", - "Avast! the slope of the sea shows an escape velocity of ten knots!", - "Aha! the tangent of the gat implies an escape velocity of ten knots!", - "Blow me down! the tangent of the gat implies an escape velocity of ten knots!", - "Avast! the probability indicates we are sinking logarithmically!", - "Aha! the slope of the sea shows a perfect circle of doom!", - "Look alive! my tail calculations reveal the coordinates of the treasure island!", - "Shiver my timbers! the formula for cheese says infinite cheese!", - "Aha! the matrix of the hold contains the shortest boarding vector!", - "Aha! the geometry of this deck requires the shortest boarding vector!", - "Blast it! the probability indicates a division by zero!", - "To the brig! the formula for cheese says a division by zero!", - "Shiver my timbers! the slope of the sea shows a jackpot of gold doubloons!", - "By the deep sea! the tangent of the gat implies a perfect circle of doom!", - "By the deep sea! the formula for cheese says we are sinking logarithmically!", - "Blow me down! the matrix of the hold contains a division by zero!", - "Blow me down! the captain's slide rule shows an escape velocity of ten knots!", - "Arrr! the geometry of this deck requires a division by zero!", - "Blow me down! the abacus predicts a perfect circle of doom!", - "Avast! the matrix of the hold contains a jackpot of gold doubloons!", - "To the brig! my tail calculations reveal a prime number of hazards!", - "Aha! the geometry of this deck requires we are sinking logarithmically!", - "Hear me crew! the tangent of the gat implies a division by zero!", - "Hear me crew! the abacus predicts a jackpot of gold doubloons!", - "Arrr! my tail calculations reveal a prime number of hazards!", - "By the deep sea! the probability indicates a jackpot of gold doubloons!", - "By the deep sea! the formula for cheese says the shortest boarding vector!", - "By the deep sea! the geometry of this deck requires the gats are ready to fire!", - "Hear me crew! the abacus predicts a division by zero!", - "By the deep sea! the tangent of the gat implies an escape velocity of ten knots!", - "Blast it! the probability indicates we are sinking logarithmically!", - "Hear me crew! the geometry of this deck requires infinite cheese!", - "Avast! the captain's slide rule shows the shortest boarding vector!", - "To the brig! the slope of the sea shows a division by zero!", - "Hear me crew! the captain's slide rule shows the gats are ready to fire!", - "Avast! the tangent of the gat implies a jackpot of gold doubloons!", - "Hear me crew! my tail calculations reveal the shortest boarding vector!", - "Shiver my timbers! the formula for cheese says the coordinates of the treasure island!", - "Hear me crew! the matrix of the hold contains a perfect circle of doom!", - "By the deep sea! the geometry of this deck requires the coordinates of the treasure island!", - "Look alive! the formula for cheese says the coordinates of the treasure island!", - "Gats, cheese, and geometry\u2014that's all a rat needs!", - "Arrr! the probability indicates a jackpot of gold doubloons!", - "Hear me crew! the probability indicates a prime number of hazards!", - "Blow me down! the geometry of this deck requires an escape velocity of ten knots!", - "To the brig! the matrix of the hold contains a division by zero!", - "Blast it! my tail calculations reveal infinite cheese!", - "Shiver my timbers! my tail calculations reveal a jackpot of gold doubloons!", - "Shiver my timbers! the matrix of the hold contains the gats are ready to fire!", - "Hear me crew! the abacus predicts the gats are ready to fire!", - "Avast! the geometry of this deck requires we are sinking logarithmically!", - "Shiver my timbers! the tangent of the gat implies we are sinking logarithmically!", - "Avast! the tangent of the gat implies a prime number of hazards!", - "Avast! my tail calculations reveal infinite cheese!", - "Arrr! the matrix of the hold contains the shortest boarding vector!", - "Blow me down! the slope of the sea shows a prime number of hazards!", - "Aha! the coordinates point to a division by zero!", - "To the brig! the matrix of the hold contains we are sinking logarithmically!", - "Look alive! the formula for cheese says we are sinking logarithmically!", - "Look alive! the abacus predicts a division by zero!", - "By the deep sea! the coordinates point to an escape velocity of ten knots!", - "Blow me down! the coordinates point to we are sinking logarithmically!", - "By the deep sea! the probability indicates the coordinates of the treasure island!", - "To the brig! the formula for cheese says a prime number of hazards!", - "To the brig! the probability indicates infinite cheese!", - "Look alive! the tangent of the gat implies an escape velocity of ten knots!", - "Shiver my timbers! the probability indicates we are sinking logarithmically!", - "By the deep sea! the abacus predicts infinite cheese!", - "Blow me down! the matrix of the hold contains the coordinates of the treasure island!", - "Arrr! my tail calculations reveal a perfect circle of doom!", - "Avast! the captain's slide rule shows an escape velocity of ten knots!", - "Arrr! the captain's slide rule shows an escape velocity of ten knots!", - "Blast it! the abacus predicts a prime number of hazards!", - "Blast it! my tail calculations reveal a division by zero!", - "Blow me down! the probability indicates a jackpot of gold doubloons!", - "By the deep sea! the coordinates point to a division by zero!", - "By the deep sea! the abacus predicts a jackpot of gold doubloons!", - "Blast it! the captain's slide rule shows a prime number of hazards!", - "Aha! the slope of the sea shows the coordinates of the treasure island!", - "To the brig! the matrix of the hold contains a jackpot of gold doubloons!", - "Look alive! the tangent of the gat implies the gats are ready to fire!", - "Blast it! the matrix of the hold contains a prime number of hazards!", - "Arrr! the tangent of the gat implies a perfect circle of doom!", - "Avast! the slope of the sea shows a jackpot of gold doubloons!", - "Shiver my timbers! the formula for cheese says a prime number of hazards!", - "By the deep sea! my tail calculations reveal we are sinking logarithmically!", - "Hear me crew! the slope of the sea shows a jackpot of gold doubloons!", - "Aha! the geometry of this deck requires infinite cheese!", - "To the brig! the geometry of this deck requires the coordinates of the treasure island!", - "Look alive! the coordinates point to the coordinates of the treasure island!", - "Look alive! the formula for cheese says the shortest boarding vector!", - "By the deep sea! the geometry of this deck requires a prime number of hazards!", - "To the brig! the tangent of the gat implies we are sinking logarithmically!", - "Hear me crew! the coordinates point to a perfect circle of doom!", - "Aha! the formula for cheese says infinite cheese!", - "By the deep sea! the formula for cheese says a prime number of hazards!", - "Aha! the matrix of the hold contains the gats are ready to fire!", - "Arrr! my tail calculations reveal the gats are ready to fire!" - ], - "good_at_math": [ - "Thinks they are, they uses slide rules to navigate stormy seas but gets confused by negative numbers.", - "Thinks they are, they remembers the first 100 digits of Pi and has the abacus tattoos to prove it.", - "Yes, they understands the probability of drawing a Joker but gets confused by negative numbers.", - "According to the abacus, they can balance the captain's ledgers in their head but gets confused by negative numbers.", - "No, they can solve equations under threat of cannon fire but gets distracted by shiny brass coins.", - "No, they knows how to divide cheese by zero and has the abacus tattoos to prove it.", - "In theory, they can solve equations under threat of cannon fire but gets distracted by shiny brass coins.", - "On paper, they can solve equations under threat of cannon fire but only when drunk on grog.", - "Absolutely, they remembers the first 100 digits of Pi and has a certificate from the Stowaway Academy.", - "No, they understands the geometry of boarding leaps and has the abacus tattoos to prove it.", - "Thinks they are, they can solve equations under threat of cannon fire but refuses to use prime numbers.", - "Barely, they can calculate the trajectory of a gat bullet but refuses to use prime numbers.", - "Only, they understands the geometry of boarding leaps but only when drunk on grog.", - "Absolutely, they can solve equations under threat of cannon fire but gets confused by negative numbers.", - "Thinks they are, they understands the geometry of boarding leaps but only when cheese is involved.", - "Thinks they are, they knows how to divide cheese by zero but only when cheese is involved.", - "On paper, they remembers the first 100 digits of Pi but only in base-3.", - "On paper, they knows how to divide cheese by zero and has a certificate from the Stowaway Academy.", - "According to the abacus, they uses slide rules to navigate stormy seas and has the abacus tattoos to prove it.", - "Yes, they can count abacus beads in pitch black hold but only when cheese is involved.", - "No, they can calculate the trajectory of a gat bullet but gets confused by negative numbers.", - "No, they interprets sea maps as coordinate grids but thinks fractions are bad luck.", - "Secretly, they can solve equations under threat of cannon fire but thinks fractions are bad luck.", - "On paper, they uses slide rules to navigate stormy seas and has a certificate from the Stowaway Academy.", - "According to the abacus, they interprets sea maps as coordinate grids but only in base-3.", - "In theory, they interprets sea maps as coordinate grids but gets distracted by shiny brass coins.", - "Thinks they are, they knows how to divide cheese by zero but thinks fractions are bad luck.", - "Secretly, they can balance the captain's ledgers in their head but only when cheese is involved.", - "Only, they interprets sea maps as coordinate grids and has the abacus tattoos to prove it.", - "According to the abacus, they can balance the captain's ledgers in their head but gets distracted by shiny brass coins.", - "Only, they uses slide rules to navigate stormy seas but refuses to use prime numbers.", - "No, they remembers the first 100 digits of Pi but only when drunk on grog.", - "On paper, they can calculate the trajectory of a gat bullet but gets confused by negative numbers.", - "In theory, they uses slide rules to navigate stormy seas but thinks fractions are bad luck.", - "Thinks they are, they understands the geometry of boarding leaps but refuses to use prime numbers.", - "Absolutely, they can count abacus beads in pitch black hold but gets confused by negative numbers.", - "Yes, they can solve equations under threat of cannon fire but only when drunk on grog.", - "Only, they understands the geometry of boarding leaps and has the abacus tattoos to prove it.", - "Thinks they are, they can balance the captain's ledgers in their head but refuses to use prime numbers.", - "Secretly, they can solve equations under threat of cannon fire but gets confused by negative numbers.", - "No, they can calculate the trajectory of a gat bullet and has the abacus tattoos to prove it.", - "Yes, specializes in escape vector geometry.", - "Secretly, they knows how to divide cheese by zero but only when drunk on grog.", - "No, they understands the geometry of boarding leaps and has a certificate from the Stowaway Academy.", - "Absolutely, they understands the probability of drawing a Joker and has the abacus tattoos to prove it.", - "Absolutely, they interprets sea maps as coordinate grids but only in base-3.", - "Yes, they can calculate the trajectory of a gat bullet but only when cheese is involved.", - "In theory, they can balance the captain's ledgers in their head but gets confused by negative numbers.", - "No, they uses slide rules to navigate stormy seas but refuses to use prime numbers.", - "According to the abacus, they can solve equations under threat of cannon fire but gets distracted by shiny brass coins.", - "Absolutely, they remembers the first 100 digits of Pi but gets confused by negative numbers.", - "Thinks they are, they uses slide rules to navigate stormy seas but only when drunk on grog.", - "Yes, they can count abacus beads in pitch black hold but only in base-3.", - "Secretly, they can calculate the trajectory of a gat bullet but only when drunk on grog.", - "On paper, they can calculate the trajectory of a gat bullet but only when drunk on grog.", - "Only, they can solve equations under threat of cannon fire but gets confused by negative numbers.", - "Yes, they can count abacus beads in pitch black hold and has the abacus tattoos to prove it.", - "In theory, they can balance the captain's ledgers in their head but only when cheese is involved.", - "Barely, they interprets sea maps as coordinate grids but thinks fractions are bad luck.", - "According to the abacus, they interprets sea maps as coordinate grids and claims numbers speak to them in dreams.", - "Thinks they are, they can balance the captain's ledgers in their head but thinks fractions are bad luck.", - "Absolutely, they knows how to divide cheese by zero but refuses to use prime numbers.", - "Secretly, they understands the geometry of boarding leaps but only when drunk on grog.", - "In theory, they can calculate the trajectory of a gat bullet but only in base-3.", - "Barely, they knows how to divide cheese by zero and has a certificate from the Stowaway Academy.", - "Absolutely, they remembers the first 100 digits of Pi but gets distracted by shiny brass coins.", - "Thinks they are, they understands the geometry of boarding leaps but thinks fractions are bad luck.", - "On paper, they remembers the first 100 digits of Pi but gets confused by negative numbers.", - "On paper, they understands the probability of drawing a Joker but gets distracted by shiny brass coins.", - "Secretly, they can solve equations under threat of cannon fire but only when drunk on grog.", - "In theory, they interprets sea maps as coordinate grids and has the abacus tattoos to prove it.", - "In theory, they knows how to divide cheese by zero and has the abacus tattoos to prove it.", - "Absolutely, they knows how to divide cheese by zero but only in base-3.", - "Only, they remembers the first 100 digits of Pi but only when cheese is involved.", - "Only, they understands the probability of drawing a Joker but only when cheese is involved.", - "Barely, they can balance the captain's ledgers in their head but gets distracted by shiny brass coins.", - "No, they understands the probability of drawing a Joker and has a certificate from the Stowaway Academy.", - "In theory, they remembers the first 100 digits of Pi but only when cheese is involved.", - "Yes, they can count abacus beads in pitch black hold but only when drunk on grog.", - "In theory, they can calculate the trajectory of a gat bullet and claims numbers speak to them in dreams.", - "Only, they understands the probability of drawing a Joker and has a certificate from the Stowaway Academy.", - "Secretly, they understands the geometry of boarding leaps and has a certificate from the Stowaway Academy.", - "Secretly, they remembers the first 100 digits of Pi but only when cheese is involved.", - "Absolutely, they understands the geometry of boarding leaps and has a certificate from the Stowaway Academy.", - "Thinks they are, they understands the probability of drawing a Joker and claims numbers speak to them in dreams.", - "On paper, they understands the probability of drawing a Joker but only when cheese is involved.", - "Only, they understands the geometry of boarding leaps and has a certificate from the Stowaway Academy.", - "Thinks they are, they remembers the first 100 digits of Pi but thinks fractions are bad luck.", - "No, they understands the probability of drawing a Joker but thinks fractions are bad luck.", - "On paper, they can calculate the trajectory of a gat bullet but thinks fractions are bad luck.", - "In theory, they can calculate the trajectory of a gat bullet but only when drunk on grog.", - "Yes, but only in base-8 because they lost two claws to a cat.", - "No, they uses slide rules to navigate stormy seas but gets distracted by shiny brass coins.", - "Only, they uses slide rules to navigate stormy seas and has a certificate from the Stowaway Academy.", - "Thinks they are, they can count abacus beads in pitch black hold but gets confused by negative numbers.", - "Absolutely, they understands the probability of drawing a Joker but gets confused by negative numbers.", - "Secretly, they can calculate the trajectory of a gat bullet but only in base-3.", - "In theory, they interprets sea maps as coordinate grids but only in base-3.", - "Absolutely, they understands the probability of drawing a Joker but refuses to use prime numbers.", - "Secretly, they remembers the first 100 digits of Pi and claims numbers speak to them in dreams.", - "Thinks they are, they can count abacus beads in pitch black hold and has a certificate from the Stowaway Academy.", - "Secretly, they uses slide rules to navigate stormy seas and has the abacus tattoos to prove it.", - "Absolutely, they interprets sea maps as coordinate grids and has the abacus tattoos to prove it.", - "Only, they understands the geometry of boarding leaps but gets distracted by shiny brass coins.", - "Secretly, they uses slide rules to navigate stormy seas but only in base-3.", - "According to the abacus, they knows how to divide cheese by zero but gets confused by negative numbers.", - "According to the abacus, they interprets sea maps as coordinate grids and has the abacus tattoos to prove it.", - "No, they understands the probability of drawing a Joker and claims numbers speak to them in dreams.", - "No, they interprets sea maps as coordinate grids and has the abacus tattoos to prove it.", - "According to the abacus, they understands the probability of drawing a Joker but only in base-3.", - "Thinks they are, they can calculate the trajectory of a gat bullet but gets confused by negative numbers.", - "Absolutely, they remembers the first 100 digits of Pi and claims numbers speak to them in dreams.", - "Secretly, they interprets sea maps as coordinate grids and has a certificate from the Stowaway Academy.", - "Absolutely, they can solve equations under threat of cannon fire and has a certificate from the Stowaway Academy.", - "Yes, they understands the probability of drawing a Joker but thinks fractions are bad luck.", - "Absolutely, they can count abacus beads in pitch black hold and has the abacus tattoos to prove it.", - "Absolutely, they uses slide rules to navigate stormy seas and has the abacus tattoos to prove it.", - "According to the abacus, they understands the geometry of boarding leaps and claims numbers speak to them in dreams.", - "Only, they can solve equations under threat of cannon fire and has a certificate from the Stowaway Academy.", - "Absolutely, they understands the geometry of boarding leaps but gets confused by negative numbers.", - "Absolutely, they understands the geometry of boarding leaps but gets distracted by shiny brass coins.", - "Absolutely, they interprets sea maps as coordinate grids but only when cheese is involved.", - "No, they can balance the captain's ledgers in their head but gets confused by negative numbers.", - "Absolutely, they can solve equations under threat of cannon fire but refuses to use prime numbers.", - "No, they can solve equations under threat of cannon fire but thinks fractions are bad luck.", - "Barely, they uses slide rules to navigate stormy seas but only in base-3.", - "In theory, they knows how to divide cheese by zero but only in base-3.", - "Thinks they are, they can solve equations under threat of cannon fire but only when drunk on grog.", - "Absolutely, they uses slide rules to navigate stormy seas but only when drunk on grog.", - "Only, they understands the probability of drawing a Joker but only when drunk on grog.", - "They can compute a Fibonacci sequence in under three seconds.", - "Secretly, they knows how to divide cheese by zero and claims numbers speak to them in dreams.", - "Thinks they are, they can count abacus beads in pitch black hold but gets distracted by shiny brass coins.", - "Secretly, they interprets sea maps as coordinate grids and claims numbers speak to them in dreams.", - "Absolutely, they can solve equations under threat of cannon fire but only when drunk on grog.", - "Yes, they can balance the captain's ledgers in their head but gets distracted by shiny brass coins.", - "Only, they knows how to divide cheese by zero and has the abacus tattoos to prove it.", - "Thinks they are, they can calculate the trajectory of a gat bullet but only when cheese is involved.", - "According to the abacus, they can calculate the trajectory of a gat bullet and has the abacus tattoos to prove it.", - "In theory, they remembers the first 100 digits of Pi but gets distracted by shiny brass coins.", - "According to the abacus, they can balance the captain's ledgers in their head but thinks fractions are bad luck.", - "No, they understands the probability of drawing a Joker but only in base-3.", - "In theory, they uses slide rules to navigate stormy seas but gets confused by negative numbers.", - "Thinks they are, they uses slide rules to navigate stormy seas but refuses to use prime numbers.", - "Secretly, they interprets sea maps as coordinate grids but only when drunk on grog.", - "Yes, they interprets sea maps as coordinate grids but gets confused by negative numbers.", - "No, they understands the geometry of boarding leaps but only in base-3.", - "Secretly, they remembers the first 100 digits of Pi but thinks fractions are bad luck.", - "Absolutely, they can count abacus beads in pitch black hold but refuses to use prime numbers.", - "In theory, they uses slide rules to navigate stormy seas and has the abacus tattoos to prove it.", - "Yes, they can count abacus beads in pitch black hold but gets confused by negative numbers.", - "Yes, they can solve equations under threat of cannon fire but only in base-3.", - "Absolutely, they can balance the captain's ledgers in their head and has a certificate from the Stowaway Academy.", - "Yes, they can balance the captain's ledgers in their head and claims numbers speak to them in dreams.", - "Absolutely, they can calculate the trajectory of a gat bullet and claims numbers speak to them in dreams.", - "On paper, they knows how to divide cheese by zero but thinks fractions are bad luck.", - "Thinks they are, they understands the probability of drawing a Joker but only when cheese is involved.", - "Thinks they are, they uses slide rules to navigate stormy seas but only in base-3.", - "Barely, they understands the probability of drawing a Joker but gets distracted by shiny brass coins.", - "Only, they understands the geometry of boarding leaps but gets confused by negative numbers.", - "On paper, they knows how to divide cheese by zero but only when drunk on grog.", - "On paper, they can count abacus beads in pitch black hold but gets confused by negative numbers.", - "No, they understands the probability of drawing a Joker but only when cheese is involved.", - "Barely, they knows how to divide cheese by zero but refuses to use prime numbers.", - "On paper, they understands the geometry of boarding leaps but thinks fractions are bad luck.", - "In theory, they can balance the captain's ledgers in their head but gets distracted by shiny brass coins.", - "Yes, they remembers the first 100 digits of Pi but only when cheese is involved.", - "Only, they knows how to divide cheese by zero but only when cheese is involved.", - "Only, they can balance the captain's ledgers in their head but only when cheese is involved.", - "Absolutely, they can count abacus beads in pitch black hold and has a certificate from the Stowaway Academy.", - "Barely, they can count abacus beads in pitch black hold but gets confused by negative numbers.", - "On paper, they can count abacus beads in pitch black hold and claims numbers speak to them in dreams.", - "Absolutely, they understands the geometry of boarding leaps and claims numbers speak to them in dreams.", - "Barely, they knows how to divide cheese by zero but only when cheese is involved.", - "Thinks they are, they can solve equations under threat of cannon fire but thinks fractions are bad luck.", - "In theory, they interprets sea maps as coordinate grids but refuses to use prime numbers.", - "Yes, they understands the probability of drawing a Joker but gets distracted by shiny brass coins.", - "In theory, they knows how to divide cheese by zero and claims numbers speak to them in dreams.", - "Yes, they interprets sea maps as coordinate grids and claims numbers speak to them in dreams.", - "Only, they remembers the first 100 digits of Pi and claims numbers speak to them in dreams.", - "Only, they uses slide rules to navigate stormy seas and has the abacus tattoos to prove it.", - "In theory, they can balance the captain's ledgers in their head but only in base-3.", - "On paper, they remembers the first 100 digits of Pi and has a certificate from the Stowaway Academy.", - "According to the abacus, they understands the geometry of boarding leaps but gets distracted by shiny brass coins.", - "On paper, they can solve equations under threat of cannon fire and has a certificate from the Stowaway Academy.", - "In theory, they understands the probability of drawing a Joker but refuses to use prime numbers.", - "Absolutely, they can balance the captain's ledgers in their head and has the abacus tattoos to prove it.", - "On paper, they can balance the captain's ledgers in their head but only when drunk on grog.", - "No, they can count abacus beads in pitch black hold but only when drunk on grog.", - "Barely, they uses slide rules to navigate stormy seas but only when drunk on grog.", - "No, they can balance the captain's ledgers in their head but thinks fractions are bad luck.", - "According to the abacus, they remembers the first 100 digits of Pi but refuses to use prime numbers.", - "Barely, they understands the probability of drawing a Joker but only when drunk on grog.", - "Yes, they can balance the captain's ledgers in their head but thinks fractions are bad luck.", - "Only, they can solve equations under threat of cannon fire but only when cheese is involved.", - "Absolutely, they interprets sea maps as coordinate grids and claims numbers speak to them in dreams.", - "On paper, they can calculate the trajectory of a gat bullet but gets distracted by shiny brass coins.", - "Barely, they can count abacus beads in pitch black hold and has the abacus tattoos to prove it.", - "Thinks they are, they interprets sea maps as coordinate grids but only when cheese is involved.", - "According to the abacus, they remembers the first 100 digits of Pi and claims numbers speak to them in dreams." - ], - "like": [ - "They secretly saves the gunpowder barrels during storm navigation.", - "They always shares the captain's stash with mathematical precision.", - "They faithfully guards the escape vectors when the seagulls attack.", - "They always shares the backup abacus even under heavy fire.", - "They cheerfully carries the coordinate charts when the seagulls attack.", - "They always shares the compass dial because they are a true friend.", - "They never steals the backup abacus to keep the crew happy.", - "They cleanly polishes the captain's stash because they are a true friend.", - "They secretly saves the gunpowder barrels just to be nice.", - "They cleanly polishes the gunpowder barrels during storm navigation.", - "They faithfully guards the compass dial during storm navigation.", - "They keep the gats polished and oiled.", - "They cleanly polishes the gunpowder barrels with mathematical precision.", - "They secretly saves the spare gats without asking for a share.", - "They secretly saves the gunpowder barrels to keep the crew happy.", - "They expertly calculates the captain's stash to keep the crew happy.", - "They secretly saves the escape vectors even under heavy fire.", - "They secretly saves the golden abacus beads to ensure a perfect escape.", - "They cheerfully carries the cheese wedges without asking for a share.", - "They never steals the cheese wedges with mathematical precision.", - "They quietly hums shanties for the captain's stash to ensure a perfect escape.", - "They quietly hums shanties for the captain's stash without asking for a share.", - "They always shares the compass dial to ensure a perfect escape.", - "They always shares the coordinate charts without asking for a share.", - "They never steals the captain's stash in base-10 code.", - "They expertly calculates the golden abacus beads without asking for a share.", - "They quietly hums shanties for the coordinate charts just to be nice.", - "They expertly calculates the cheese wedges when the seagulls attack.", - "They cheerfully carries the wet hold biscuits even under heavy fire.", - "They quietly hums shanties for the coordinate charts without asking for a share.", - "They boldly defends the gunpowder barrels without asking for a share.", - "They faithfully guards the coordinate charts in base-10 code.", - "They always shares the cheese wedges to keep the crew happy.", - "They always shares the cheese wedges with mathematical precision.", - "They never steals the gunpowder barrels without asking for a share.", - "They never steals the wet hold biscuits without asking for a share.", - "They expertly calculates the backup abacus in base-10 code.", - "They brilliantly solves the coordinate charts to ensure a perfect escape.", - "They expertly calculates the wet hold biscuits to ensure a perfect escape.", - "They cleanly polishes the escape vectors in base-10 code.", - "They secretly saves the gunpowder barrels to ensure a perfect escape.", - "They brilliantly solves the escape vectors even under heavy fire.", - "They cheerfully carries the gunpowder barrels because they are a true friend.", - "They boldly defends the gunpowder barrels because they are a true friend.", - "They boldly defends the compass dial in base-10 code.", - "They secretly saves the cheese wedges when the seagulls attack.", - "They quietly hums shanties for the compass dial with mathematical precision.", - "They cheerfully carries the gunpowder barrels without asking for a share.", - "They faithfully guards the wet hold biscuits with mathematical precision.", - "They quietly hums shanties for the compass dial when the seagulls attack.", - "They expertly calculates the coordinate charts when the seagulls attack.", - "They cleanly polishes the wet hold biscuits when the seagulls attack.", - "They boldly defends the compass dial to keep the crew happy.", - "They quietly hums shanties for the spare gats just to be nice.", - "They faithfully guards the cheese wedges even under heavy fire.", - "They cheerfully carries the spare gats because they are a true friend.", - "They faithfully guards the coordinate charts even under heavy fire.", - "They faithfully guards the compass dial with mathematical precision.", - "They cleanly polishes the wet hold biscuits with mathematical precision.", - "They quietly hums shanties for the captain's stash in base-10 code.", - "They never steals the coordinate charts with mathematical precision.", - "They cleanly polishes the gunpowder barrels even under heavy fire.", - "They cleanly polishes the spare gats even under heavy fire.", - "They boldly defends the escape vectors with mathematical precision.", - "They secretly saves the backup abacus when the seagulls attack.", - "They faithfully guards the coordinate charts when the seagulls attack.", - "They always shares the gunpowder barrels in base-10 code.", - "They never steals the captain's stash even under heavy fire.", - "They brilliantly solves the wet hold biscuits to ensure a perfect escape.", - "They faithfully guards the backup abacus because they are a true friend.", - "They expertly calculates the compass dial in base-10 code.", - "They secretly saves the backup abacus to ensure a perfect escape.", - "They expertly calculates the compass dial when the seagulls attack.", - "They brilliantly solves the backup abacus in base-10 code.", - "They expertly calculates the coordinate charts because they are a true friend.", - "They cleanly polishes the gunpowder barrels without asking for a share.", - "They expertly calculates the coordinate charts in base-10 code.", - "They expertly calculates the cheese wedges even under heavy fire.", - "They boldly defends the compass dial when the seagulls attack.", - "They cheerfully carries the wet hold biscuits during storm navigation.", - "They always shares the escape vectors because they are a true friend.", - "They cheerfully carries the escape vectors even under heavy fire.", - "They faithfully guards the captain's stash in base-10 code.", - "They boldly defends the compass dial because they are a true friend.", - "They faithfully guards the golden abacus beads even under heavy fire.", - "They cleanly polishes the golden abacus beads because they are a true friend.", - "They secretly saves the cheese wedges with mathematical precision.", - "They always shares the wet hold biscuits to keep the crew happy.", - "They quietly hums shanties for the spare gats without asking for a share.", - "They never steals the captain's stash to ensure a perfect escape.", - "They faithfully guards the gunpowder barrels because they are a true friend.", - "They quietly hums shanties for the wet hold biscuits with mathematical precision.", - "They never steals the cheese wedges when the seagulls attack.", - "They faithfully guards the compass dial to ensure a perfect escape.", - "They quietly hums shanties for the spare gats in base-10 code.", - "They never steals the compass dial even under heavy fire.", - "They faithfully guards the cheese wedges just to be nice.", - "They cleanly polishes the captain's stash when the seagulls attack.", - "They cleanly polishes the golden abacus beads just to be nice.", - "They expertly calculates the escape vectors even under heavy fire.", - "They never steals the compass dial when the seagulls attack.", - "They quietly hums shanties for the golden abacus beads when the seagulls attack.", - "They cheerfully carries the coordinate charts in base-10 code.", - "They faithfully guards the cheese wedges when the seagulls attack.", - "They secretly saves the wet hold biscuits without asking for a share.", - "They faithfully guards the compass dial because they are a true friend.", - "They always shares the backup abacus because they are a true friend.", - "They cleanly polishes the wet hold biscuits in base-10 code.", - "They boldly defends the backup abacus to ensure a perfect escape.", - "They cheerfully carries the spare gats even under heavy fire.", - "They brilliantly solves the coordinate charts with mathematical precision.", - "They secretly saves the compass dial because they are a true friend.", - "They faithfully guards the coordinate charts because they are a true friend.", - "They expertly calculates the backup abacus without asking for a share.", - "They never steals the coordinate charts during storm navigation.", - "They secretly saves the captain's stash when the seagulls attack.", - "They brilliantly solves the backup abacus just to be nice.", - "They boldly defends the gunpowder barrels to keep the crew happy.", - "They cleanly polishes the compass dial to ensure a perfect escape.", - "They expertly calculates the golden abacus beads with mathematical precision.", - "They secretly saves the coordinate charts because they are a true friend.", - "They never steals the gunpowder barrels because they are a true friend.", - "They secretly saves the gunpowder barrels when the seagulls attack.", - "They always shares the golden abacus beads in base-10 code.", - "They secretly saves the gunpowder barrels because they are a true friend.", - "They faithfully guards the coordinate charts with mathematical precision.", - "They expertly calculates the captain's stash just to be nice.", - "They cleanly polishes the gunpowder barrels because they are a true friend.", - "They quietly hums shanties for the compass dial even under heavy fire.", - "They secretly saves the captain's stash in base-10 code.", - "They brilliantly solves the wet hold biscuits just to be nice.", - "They cleanly polishes the wet hold biscuits because they are a true friend.", - "They brilliantly solves the spare gats when the seagulls attack.", - "They always shares the escape vectors with mathematical precision.", - "They never steals the backup abacus in base-10 code.", - "They cheerfully carries the escape vectors because they are a true friend.", - "They cheerfully carries the gunpowder barrels in base-10 code.", - "They always shares the escape vectors without asking for a share.", - "They cleanly polishes the golden abacus beads without asking for a share.", - "They expertly calculates the coordinate charts without asking for a share.", - "They faithfully guards the golden abacus beads to ensure a perfect escape.", - "They brilliantly solves the golden abacus beads with mathematical precision.", - "They brilliantly solves the backup abacus without asking for a share.", - "They cheerfully carries the captain's stash when the seagulls attack.", - "They expertly calculates the escape vectors during storm navigation.", - "They never steals the gunpowder barrels when the seagulls attack.", - "They expertly calculates the captain's stash even under heavy fire.", - "They brilliantly solves the golden abacus beads without asking for a share.", - "They boldly defends the compass dial even under heavy fire.", - "They tell the best stories about the Great Cheese Reef.", - "They never steals the escape vectors just to be nice.", - "They faithfully guards the spare gats because they are a true friend.", - "They quietly hums shanties for the cheese wedges when the seagulls attack.", - "They expertly calculates the escape vectors because they are a true friend.", - "They always shares the backup abacus when the seagulls attack.", - "They quietly hums shanties for the cheese wedges to keep the crew happy.", - "They brilliantly solves the cheese wedges to ensure a perfect escape.", - "They never steals the wet hold biscuits when the seagulls attack.", - "They brilliantly solves the golden abacus beads even under heavy fire.", - "They quietly hums shanties for the captain's stash to keep the crew happy.", - "They quietly hums shanties for the gunpowder barrels to ensure a perfect escape.", - "They boldly defends the escape vectors to keep the crew happy.", - "They always shares the spare gats to keep the crew happy.", - "They quietly hums shanties for the gunpowder barrels even under heavy fire.", - "They brilliantly solves the compass dial even under heavy fire.", - "They cleanly polishes the cheese wedges in base-10 code.", - "They brilliantly solves the captain's stash just to be nice.", - "They quietly hums shanties for the cheese wedges because they are a true friend.", - "They brilliantly solves the compass dial just to be nice.", - "They cleanly polishes the backup abacus to keep the crew happy.", - "They never steals the cheese wedges to keep the crew happy.", - "They secretly saves the cheese wedges in base-10 code.", - "They boldly defends the wet hold biscuits because they are a true friend.", - "They always shares the escape vectors during storm navigation.", - "They quietly hums shanties for the golden abacus beads to keep the crew happy.", - "They brilliantly solves the wet hold biscuits in base-10 code.", - "They cleanly polishes the spare gats to keep the crew happy.", - "They cheerfully carries the captain's stash with mathematical precision.", - "They boldly defends the backup abacus just to be nice.", - "They expertly calculates the coordinate charts even under heavy fire.", - "They quietly hums shanties for the backup abacus in base-10 code.", - "They faithfully guards the gunpowder barrels during storm navigation.", - "They always shares the backup abacus to ensure a perfect escape.", - "They faithfully guards the spare gats just to be nice.", - "They cleanly polishes the cheese wedges because they are a true friend.", - "They always shares the gunpowder barrels to keep the crew happy.", - "They always shares the backup abacus just to be nice.", - "They brilliantly solves the backup abacus when the seagulls attack.", - "They expertly calculates the wet hold biscuits to keep the crew happy.", - "They faithfully guards the escape vectors to keep the crew happy.", - "They expertly calculates the coordinate charts during storm navigation.", - "They secretly saves the coordinate charts in base-10 code.", - "They cheerfully carries the cheese wedges just to be nice.", - "They expertly calculates the escape vectors to keep the crew happy.", - "They always shares the golden abacus beads during storm navigation.", - "They faithfully guards the captain's stash without asking for a share.", - "They cheerfully carries the backup abacus in base-10 code.", - "They cheerfully carries the compass dial during storm navigation.", - "They expertly calculates the wet hold biscuits just to be nice.", - "They secretly saves the compass dial when the seagulls attack." - ], - "hate": [ - "They annoyingly chews the coordinate maps but only in base-3.", - "They secretly hoards the gat barrel oil but gets confused by negative numbers.", - "They loudly whistles the abacus beads and has a certificate from the Stowaway Academy.", - "They clumsily breaks the geometry homework and has the abacus tattoos to prove it.", - "They frequently drops the bilge keys but only when drunk on grog.", - "They always claims the navigator's compass but only when drunk on grog.", - "They carelessly stains the abacus beads but only when drunk on grog.", - "They carelessly stains the hammock ropes and has the abacus tattoos to prove it.", - "They constantly complains about the navigator's compass but refuses to use prime numbers.", - "They stubbornly argues about the slide rule but only in base-3.", - "They annoyingly chews the abacus beads but only in base-3.", - "They secretly hoards the dry gunpowder bags and has the abacus tattoos to prove it.", - "They always claims the geometry homework but only when drunk on grog.", - "They accidently misplaces the navigator's compass but thinks fractions are bad luck.", - "They carelessly stains the gat barrel oil but gets distracted by shiny brass coins.", - "They annoyingly chews the coordinate maps but gets confused by negative numbers.", - "They carelessly stains the slide rule but refuses to use prime numbers.", - "They stubbornly argues about the coordinate maps and claims numbers speak to them in dreams.", - "They stubbornly argues about the dry gunpowder bags but gets distracted by shiny brass coins.", - "They loudly whistles the gat barrel oil but only when cheese is involved.", - "They accidently misplaces the navigator's compass and has the abacus tattoos to prove it.", - "They frequently drops the geometry homework and claims numbers speak to them in dreams.", - "They carelessly stains the coordinate maps but only in base-3.", - "They accidently misplaces the hammock ropes and has a certificate from the Stowaway Academy.", - "They accidently misplaces the gat barrel oil and claims numbers speak to them in dreams.", - "They stubbornly argues about the dry gunpowder bags and has a certificate from the Stowaway Academy.", - "They clumsily breaks the slide rule and has a certificate from the Stowaway Academy.", - "They chew their tail when nervous.", - "They annoyingly chews the hammock ropes but refuses to use prime numbers.", - "They annoyingly chews the hammock ropes but thinks fractions are bad luck.", - "They loudly whistles the gat barrel oil and has the abacus tattoos to prove it.", - "They frequently drops the hammock ropes but gets distracted by shiny brass coins.", - "They annoyingly chews the hammock ropes but gets confused by negative numbers.", - "They accidently misplaces the cheese wedges but gets distracted by shiny brass coins.", - "They always claims the hammock ropes but gets confused by negative numbers.", - "They secretly hoards the coordinate maps and claims numbers speak to them in dreams.", - "They clumsily breaks the slide rule and claims numbers speak to them in dreams.", - "They annoyingly chews the gat barrel oil but only in base-3.", - "They always claims the slide rule but only in base-3.", - "They stubbornly argues about the bilge keys but only when drunk on grog.", - "They loudly whistles the cheese wedges but refuses to use prime numbers.", - "They accidently misplaces the slide rule but thinks fractions are bad luck.", - "They accidently misplaces the abacus beads and claims numbers speak to them in dreams.", - "They loudly whistles the hammock ropes but only in base-3.", - "They secretly hoards the navigator's compass but only in base-3.", - "They accidently misplaces the navigator's compass but gets distracted by shiny brass coins.", - "They clumsily breaks the hammock ropes but gets distracted by shiny brass coins.", - "They always claims the gat barrel oil and has the abacus tattoos to prove it.", - "They always claims the navigator's compass and claims numbers speak to them in dreams.", - "They always claims the hammock ropes and claims numbers speak to them in dreams.", - "They clumsily breaks the navigator's compass but only when drunk on grog.", - "They loudly whistles the navigator's compass and has the abacus tattoos to prove it.", - "They stubbornly argues about the navigator's compass but refuses to use prime numbers.", - "They always claims the cheese wedges but thinks fractions are bad luck.", - "They frequently drops the bilge keys but gets confused by negative numbers.", - "They talk about imaginary numbers in their sleep.", - "They secretly hoards the dry gunpowder bags but only when cheese is involved.", - "They stubbornly argues about the coordinate maps but gets confused by negative numbers.", - "They secretly hoards the navigator's compass but only when drunk on grog.", - "They accidently misplaces the coordinate maps and has a certificate from the Stowaway Academy.", - "They clumsily breaks the abacus beads but thinks fractions are bad luck.", - "They accidently misplaces the coordinate maps but only in base-3.", - "They annoyingly chews the coordinate maps but only when drunk on grog.", - "They accidently misplaces the coordinate maps but thinks fractions are bad luck.", - "They clumsily breaks the coordinate maps but gets confused by negative numbers.", - "They clumsily breaks the geometry homework but gets distracted by shiny brass coins.", - "They frequently drops the abacus beads but gets distracted by shiny brass coins.", - "They secretly hoards the gat barrel oil but only when cheese is involved.", - "They stubbornly argues about the bilge keys and claims numbers speak to them in dreams.", - "They clumsily breaks the geometry homework and claims numbers speak to them in dreams.", - "They carelessly stains the hammock ropes but gets confused by negative numbers.", - "They frequently drops the dry gunpowder bags but thinks fractions are bad luck.", - "They always claims the geometry homework but refuses to use prime numbers.", - "They always claims the cheese wedges but only in base-3.", - "They always claims the geometry homework and has a certificate from the Stowaway Academy.", - "They annoyingly chews the dry gunpowder bags but refuses to use prime numbers.", - "They loudly whistles the cheese wedges and has a certificate from the Stowaway Academy.", - "They clumsily breaks the dry gunpowder bags but only when cheese is involved.", - "They stubbornly argues about the gat barrel oil but only when drunk on grog.", - "They annoyingly chews the navigator's compass but only in base-3.", - "They annoyingly chews the hammock ropes but gets distracted by shiny brass coins.", - "They carelessly stains the gat barrel oil and claims numbers speak to them in dreams.", - "They secretly hoards the geometry homework and has a certificate from the Stowaway Academy.", - "They secretly hoards the hammock ropes and has the abacus tattoos to prove it.", - "They frequently drops the gat barrel oil and claims numbers speak to them in dreams.", - "They accidently misplaces the hammock ropes and claims numbers speak to them in dreams.", - "They frequently drops the coordinate maps but gets distracted by shiny brass coins.", - "They carelessly stains the gat barrel oil but only in base-3.", - "They always claims the cheese wedges but only when cheese is involved.", - "They loudly whistles the gat barrel oil but thinks fractions are bad luck.", - "They frequently drops the dry gunpowder bags but gets confused by negative numbers.", - "They clumsily breaks the dry gunpowder bags but gets distracted by shiny brass coins.", - "They always claims the bilge keys and has the abacus tattoos to prove it.", - "They constantly complains about the geometry homework but only when drunk on grog.", - "They carelessly stains the slide rule and has the abacus tattoos to prove it.", - "They constantly complains about the slide rule but refuses to use prime numbers.", - "They chew on the gunpowder bags.", - "They constantly complains about the navigator's compass but only in base-3.", - "They annoyingly chews the geometry homework but only when drunk on grog.", - "They always claims the bilge keys but refuses to use prime numbers.", - "They stubbornly argues about the slide rule but gets distracted by shiny brass coins.", - "They carelessly stains the hammock ropes but only when drunk on grog.", - "They accidently misplaces the navigator's compass but only when drunk on grog.", - "They accidently misplaces the coordinate maps but refuses to use prime numbers.", - "They stubbornly argues about the gat barrel oil but thinks fractions are bad luck.", - "They carelessly stains the cheese wedges but thinks fractions are bad luck.", - "They loudly whistles the navigator's compass but gets distracted by shiny brass coins.", - "They constantly complains about the dry gunpowder bags but refuses to use prime numbers.", - "They annoyingly chews the hammock ropes but only when drunk on grog.", - "They constantly complains about the geometry homework but refuses to use prime numbers.", - "They stubbornly argues about the navigator's compass but gets distracted by shiny brass coins.", - "They stubbornly argues about the gat barrel oil but refuses to use prime numbers.", - "They frequently drops the slide rule and has the abacus tattoos to prove it.", - "They stubbornly argues about the navigator's compass but only when cheese is involved.", - "They annoyingly chews the cheese wedges but only when cheese is involved.", - "They stubbornly argues about the geometry homework but refuses to use prime numbers.", - "They stubbornly argues about the dry gunpowder bags but gets confused by negative numbers.", - "They constantly complains about the hammock ropes and claims numbers speak to them in dreams.", - "They clumsily breaks the dry gunpowder bags but gets confused by negative numbers.", - "They frequently drops the geometry homework but only when cheese is involved.", - "They accidently misplaces the slide rule but only when drunk on grog.", - "They clumsily breaks the bilge keys but only when drunk on grog.", - "They annoyingly chews the cheese wedges and has the abacus tattoos to prove it.", - "They accidently misplaces the bilge keys but only when cheese is involved.", - "They loudly whistles the dry gunpowder bags and has the abacus tattoos to prove it.", - "They loudly whistles the slide rule but refuses to use prime numbers.", - "They frequently drops the navigator's compass but gets distracted by shiny brass coins.", - "They secretly hoards the geometry homework but gets confused by negative numbers.", - "They carelessly stains the abacus beads but thinks fractions are bad luck.", - "They stubbornly argues about the hammock ropes but only when cheese is involved.", - "They accidently misplaces the abacus beads but gets distracted by shiny brass coins.", - "They always claims the bilge keys but thinks fractions are bad luck.", - "They always claims the gat barrel oil but only when drunk on grog.", - "They loudly whistles the slide rule but only when cheese is involved.", - "They annoyingly chews the slide rule and has a certificate from the Stowaway Academy.", - "They carelessly stains the slide rule but only when drunk on grog.", - "They constantly complains about the cheese wedges but only when drunk on grog.", - "They clumsily breaks the gat barrel oil but gets distracted by shiny brass coins.", - "They annoyingly chews the navigator's compass and claims numbers speak to them in dreams.", - "They stubbornly argues about the geometry homework but only when cheese is involved.", - "They clumsily breaks the dry gunpowder bags and has the abacus tattoos to prove it.", - "They carelessly stains the coordinate maps but thinks fractions are bad luck.", - "They annoyingly chews the slide rule and has the abacus tattoos to prove it.", - "They stubbornly argues about the slide rule and claims numbers speak to them in dreams.", - "They frequently drops the navigator's compass and has the abacus tattoos to prove it.", - "They clumsily breaks the slide rule but gets distracted by shiny brass coins.", - "They clumsily breaks the cheese wedges and has a certificate from the Stowaway Academy.", - "They carelessly stains the bilge keys but thinks fractions are bad luck.", - "They stubbornly argues about the cheese wedges but refuses to use prime numbers.", - "They annoyingly chews the slide rule but refuses to use prime numbers.", - "They stubbornly argues about the coordinate maps and has a certificate from the Stowaway Academy.", - "They constantly complains about the hammock ropes but refuses to use prime numbers.", - "They accidently misplaces the hammock ropes but only in base-3.", - "They stubbornly argues about the abacus beads but only when cheese is involved.", - "They always claims the bilge keys but gets distracted by shiny brass coins.", - "They constantly complains about the abacus beads but gets distracted by shiny brass coins.", - "They accidently misplaces the navigator's compass but only when cheese is involved.", - "They always claims the coordinate maps and has the abacus tattoos to prove it.", - "They annoyingly chews the navigator's compass but only when drunk on grog.", - "They annoyingly chews the bilge keys but gets distracted by shiny brass coins.", - "They stubbornly argues about the navigator's compass but gets confused by negative numbers.", - "They annoyingly chews the gat barrel oil but refuses to use prime numbers.", - "They stubbornly argues about the hammock ropes but gets distracted by shiny brass coins.", - "They secretly hoards the abacus beads but gets confused by negative numbers.", - "They carelessly stains the bilge keys but only when drunk on grog.", - "They always claims the dry gunpowder bags but refuses to use prime numbers.", - "They always claims the slide rule but refuses to use prime numbers.", - "They carelessly stains the dry gunpowder bags but gets distracted by shiny brass coins.", - "They carelessly stains the navigator's compass but refuses to use prime numbers.", - "They always claims the geometry homework but gets confused by negative numbers.", - "They frequently drops the cheese wedges but only when cheese is involved.", - "They always claims the abacus beads but gets distracted by shiny brass coins.", - "They stubbornly argues about the dry gunpowder bags but only when drunk on grog.", - "They loudly whistles the slide rule but gets confused by negative numbers.", - "They carelessly stains the bilge keys and has the abacus tattoos to prove it.", - "They stubbornly argues about the cheese wedges and has a certificate from the Stowaway Academy.", - "They loudly whistles the gat barrel oil but gets distracted by shiny brass coins.", - "They constantly complains about the hammock ropes but gets distracted by shiny brass coins.", - "They accidently misplaces the cheese wedges but only when cheese is involved.", - "They frequently drops the bilge keys but gets distracted by shiny brass coins.", - "They stubbornly argues about the abacus beads and has a certificate from the Stowaway Academy.", - "They secretly hoards the dry gunpowder bags but gets distracted by shiny brass coins.", - "They clumsily breaks the hammock ropes but gets confused by negative numbers.", - "They always claims the navigator's compass and has the abacus tattoos to prove it.", - "They loudly whistles the dry gunpowder bags but refuses to use prime numbers.", - "They constantly complains about the hammock ropes but only in base-3.", - "They accidently misplaces the geometry homework but only in base-3.", - "They clumsily breaks the bilge keys but gets distracted by shiny brass coins.", - "They always claims the abacus beads but only in base-3.", - "They stubbornly argues about the navigator's compass and has a certificate from the Stowaway Academy.", - "They frequently drops the bilge keys and has the abacus tattoos to prove it.", - "They annoyingly chews the cheese wedges but only in base-3.", - "They carelessly stains the navigator's compass but only in base-3.", - "They stubbornly argues about the gat barrel oil and claims numbers speak to them in dreams.", - "They secretly hoards the bilge keys but only in base-3.", - "They loudly whistles the coordinate maps but gets distracted by shiny brass coins.", - "They frequently drops the gat barrel oil and has a certificate from the Stowaway Academy.", - "They stubbornly argues about the slide rule and has the abacus tattoos to prove it.", - "They accidently misplaces the dry gunpowder bags and has a certificate from the Stowaway Academy.", - "They frequently drops the slide rule but gets confused by negative numbers." - ] -}; - function pickFrom(arr, exclude = []) { const taken = new Set(exclude.map(s => s.trim().toLowerCase())); const available = arr.filter(s => !taken.has(s.trim().toLowerCase())); @@ -1223,22 +7,28 @@ function pickFrom(arr, exclude = []) { return pool[Math.floor(Math.random() * pool.length)]; } -export function getSuggestion(type, exclude = []) { - const arr = SUGGESTIONS[type]; - if (!arr) return ""; - return pickFrom(arr, exclude); +// Share in-flight requests, but allow a fresh attempt after a network failure. +function cachedPool(endpoint) { + let promise; + return () => { + if (!promise) { + promise = apiRequest(endpoint).catch(error => { + promise = null; + throw error; + }); + } + return promise; + }; } -// Secret Pirate Technique names live in the backend (it also uses them to equip -// re-rolled recruits); fetch the pool once and pick from it client-side. -let techniquePoolPromise = null; -function loadTechniquePool() { - if (!techniquePoolPromise) { - techniquePoolPromise = apiRequest('/suggestions/techniques').then(d => d.techniques); - } - return techniquePoolPromise; +const loadCharacterPool = cachedPool('/suggestions'); +const loadTechniquePool = cachedPool('/suggestions/techniques'); + +export async function getSuggestion(type, exclude = []) { + const pool = await loadCharacterPool(); + return pool[type]?.length ? pickFrom(pool[type], exclude) : ''; } export async function getTechniqueSuggestion(exclude = []) { - return pickFrom(await loadTechniquePool(), exclude); + return pickFrom((await loadTechniquePool()).techniques, exclude); } diff --git a/frontend/src/pages/Dashboard.svelte b/frontend/src/pages/Dashboard.svelte index a111e6e..f5f21b5 100644 --- a/frontend/src/pages/Dashboard.svelte +++ b/frontend/src/pages/Dashboard.svelte @@ -113,18 +113,18 @@ async function skipCharacterCreation() { // Suggested values for everyone's free-text fields; the backend only // applies them to fields players haven't filled in themselves. - const fills = {}; - for (const p of state.players) { - fills[p.id] = { - avatar_look: getSuggestion('look'), - avatar_smell: getSuggestion('smell'), - first_words: getSuggestion('first_words'), - good_at_math: getSuggestion('good_at_math'), - like: getSuggestion('like'), - hate: getSuggestion('hate'), - }; - } try { + const fills = {}; + for (const p of state.players) { + fills[p.id] = { + avatar_look: await getSuggestion('look'), + avatar_smell: await getSuggestion('smell'), + first_words: await getSuggestion('first_words'), + good_at_math: await getSuggestion('good_at_math'), + like: await getSuggestion('like'), + hate: await getSuggestion('hate'), + }; + } await apiRequest(`/game/${gameId}/player/${playerId}/skip-character-creation`, 'POST', { fills: JSON.stringify(fills) }); diff --git a/frontend/tests/suggestions.test.js b/frontend/tests/suggestions.test.js new file mode 100644 index 0000000..720ab42 --- /dev/null +++ b/frontend/tests/suggestions.test.js @@ -0,0 +1,31 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; + +const asModule = source => `data:text/javascript;base64,${Buffer.from(source).toString('base64')}`; +const api = asModule(await readFile(new URL('../src/lib/api.js', import.meta.url), 'utf8')); +const source = (await readFile(new URL('../src/lib/suggestions.js', import.meta.url), 'utf8')) + .replace("'./api'", JSON.stringify(api)); + +test('suggestions retry failed requests, share the pool, and respect exclusions', async () => { + const originalFetch = globalThis.fetch; + let calls = 0; + globalThis.fetch = async url => { + calls++; + if (calls === 1) throw new Error('offline'); + assert.equal(url, '/api/suggestions'); + return { ok: true, json: async () => ({ look: ['Bandana', 'Eyepatch'], smell: ['Tar'] }) }; + }; + try { + const { getSuggestion } = await import(asModule(source)); + await assert.rejects(getSuggestion('look'), /offline/); + assert.deepEqual(await Promise.all([ + getSuggestion('look', [' bandana ']), getSuggestion('smell') + ]), ['Eyepatch', 'Tar']); + assert.equal(calls, 2); + assert.equal(await getSuggestion('unknown'), ''); + assert.ok(['Bandana', 'Eyepatch'].includes(await getSuggestion('look', ['Bandana', 'Eyepatch']))); + } finally { + globalThis.fetch = originalFetch; + } +}); diff --git a/src/pirats/crud_character.py b/src/pirats/crud_character.py index a6667ba..5cdaf37 100644 --- a/src/pirats/crud_character.py +++ b/src/pirats/crud_character.py @@ -502,7 +502,7 @@ def skip_character_creation(db: Session, game: Game, fills: dict): creation for ALL players and advances to scene setup. `fills` maps player_id -> suggested values for the free-text fields (avatar_look, avatar_smell, first_words, good_at_math, like, hate), supplied by the - admin's client from the frontend suggestion pools. Techniques come from + admin's client from the backend suggestion API. Techniques come from the backend pool. Already-filled fields are left untouched. """ from .cards import TECHNIQUE_SUGGESTIONS diff --git a/src/pirats/routes_character.py b/src/pirats/routes_character.py index bb06c59..438a800 100644 --- a/src/pirats/routes_character.py +++ b/src/pirats/routes_character.py @@ -4,10 +4,16 @@ from sqlmodel import Session from .database import get_session from . import crud from .cards import TECHNIQUE_SUGGESTIONS +from .suggestions import CHARACTER_SUGGESTIONS from .validation import sanitize_text, sanitize_name router = APIRouter() +@router.get("/suggestions") +def character_suggestions(): + return CHARACTER_SUGGESTIONS + + # Secret Pirate Technique name pool (for the frontend's Suggest buttons) @router.get("/suggestions/techniques") def technique_suggestions(): diff --git a/src/pirats/suggestions.py b/src/pirats/suggestions.py new file mode 100644 index 0000000..b1bf8eb --- /dev/null +++ b/src/pirats/suggestions.py @@ -0,0 +1,126 @@ +"""Hand-written Rat Records prompts for the scrappy fantasy pirates of Yeld. + +Smells also serve as temporary names; keep them short noun phrases. Math +is a personality joke, not a power or a rule benefit. +""" + +CHARACTER_SUGGESTIONS = {'look': ['A red bandana with two holes chewed through for ears', + 'An eyepatch that keeps sliding onto the wrong eye', + 'A stolen waistcoat with pockets full of biscuit crumbs', + 'Whiskers braided with bits of sail thread', + 'A tail tied in a knot so nobody steps on it', + 'A tiny skull painted between the ears', + "A coat made from the ship's old flag", + 'One gold tooth and a grin that shows it off', + 'A belt made of rope, with far too many knots', + 'A hat so wide it catches every gust of wind', + 'Soot-black paws and a suspiciously innocent expression', + 'A scar across the snout that they insist looks impressive', + 'A brass button worn as a medal', + 'A striped shirt still bearing the laundry tag', + 'A fork tucked behind one ear for emergencies', + 'A tail wrapped in a strip of stolen velvet', + 'A necklace of fish bones and one very nice pearl', + "Fur slicked back with the cook's best butter", + 'A chalk handprint on the back of a borrowed coat', + 'An enormous hat held on with string'], + 'smell': ['Gunpowder and wet fur', + 'Old cheese and fresh tar', + 'Pickle brine', + 'Burnt toast', + 'Fish guts and cheap perfume', + 'Damp rope', + 'Sour grog', + 'Peppermint and bilge water', + 'Smoked herring', + 'Candle wax and singed whiskers', + 'Mouldy biscuits', + 'Salt pork and garlic', + 'Seaweed left in the sun', + 'Stolen jam', + 'Wet wool and black pepper', + 'Boot polish', + 'Rancid butter', + 'Lemon peel and cannon smoke', + 'Onions and damp wood', + 'Something dead behind the pantry'], + 'first_words': ["Who's been keeping all this cheese up here?", + "I've got thumbs! Nobody panic!", + 'Right. Which end of the ship do we steal first?', + "That hat's mine now.", + 'I liked the captain better when I could fit in his boot.', + 'I demand a bigger lunch.', + 'Can we eat the map?', + 'Nobody tell the cat.', + "I can explain. Actually, no I can't.", + 'Why is the floor suddenly so far away?', + 'Hand over the biscuits and nobody gets bitten.', + 'I vote we keep the ship.', + 'Does this mean I have to wear trousers?', + "I've always wanted to shout this: BOARD THEM!", + 'Somebody fetch me a dangerous stick.', + 'I know three words and two of them are threats.', + 'Was that your cheese? Unfortunate.', + 'I can count! We are outnumbered!', + "Let's point the cannon at whoever owns it.", + 'I was already this clever. Ask anyone.'], + 'good_at_math': ['Yes, until someone starts watching.', + 'Only when dividing up stolen food.', + 'No, but very loud about the answer.', + 'Can count every coin in a purse by shaking it.', + 'Knows that two lunches are better than one.', + "Counts on their claws, then borrows someone else's.", + 'Brilliant at sums. Cannot tell left from right.', + 'Insists every problem can be solved by adding more rats.', + 'Yes, and will prove it on your coat in chalk.', + 'Can divide loot fairly. Chooses not to.', + 'Thinks fractions are what happens when you bite a biscuit.', + 'Keeps losing count when their tail moves.', + 'No. Has appointed a beetle to handle the numbers.', + 'Can calculate a cannon shot but not the price of lunch.', + 'Gets the right answer for entirely the wrong reasons.', + 'Counts backwards whenever frightened.', + 'Only if the numbers are small enough to threaten.', + 'Knows pi to several places, all of them wrong.', + "Refuses to subtract. That's how things go missing.", + 'Perfectly average, which they find deeply suspicious.'], + 'like': ['They always save you the least mouldy biscuit.', + "They'll bite anyone who threatens the crew.", + 'They remember which hammock is yours.', + 'They take the blame when a good prank goes wrong.', + 'They can make a feast out of stolen scraps.', + 'They laugh at your jokes, even during a mutiny.', + 'They share their last dry match.', + 'They never leave a rat behind.', + 'They know when to stop talking and start chewing through ropes.', + 'They tell excellent lies on your behalf.', + 'They warm your paws when the night watch gets cold.', + 'They always volunteer to distract the cat.', + 'They can find food in an empty cupboard.', + 'They mend your clothes without being asked.', + 'They cheer loudest when you do something reckless.', + 'They keep a lookout while you sneak an extra ration.', + 'They turn every terrible plan into a team effort.', + 'They know a song for every disaster.', + 'They give the best apologies, usually with snacks.', + 'They trust you with the good end of the rope.'], + 'hate': ['They eat the evidence before anyone can examine it.', + 'They borrow your boots and return only one.', + "They practice their captain voice while you're sleeping.", + 'They leave fish bones in your hammock.', + 'They insist every plan was their idea.', + 'They lick the best biscuit before offering to share.', + "They chew through ropes without checking what they're holding up.", + 'They shout "Land ho!" whenever they\'re bored.', + 'They use your coat to wipe cannon soot off their paws.', + 'They keep a secret food stash that everyone can smell.', + 'They correct your sums in the middle of a fight.', + 'They drum on empty barrels during the night watch.', + 'They promise your share of the loot to strangers.', + 'They pick their teeth with your favourite knife.', + 'They give away the hiding place by giggling.', + "They refuse to admit they can't read the map.", + 'They shake seawater onto everyone after a swim.', + 'They start a new verse just when the song seems over.', + 'They call every creature with fins their cousin.', + "They always ask if you're going to finish that, mid-bite."]} diff --git a/tests/test_suggestions.py b/tests/test_suggestions.py new file mode 100644 index 0000000..2dc14e4 --- /dev/null +++ b/tests/test_suggestions.py @@ -0,0 +1,20 @@ +from fastapi.testclient import TestClient +from pirats.main import app +from pirats.validation import sanitize_name, sanitize_text + + +def test_suggestions_api_covers_rat_records_without_truncation(): + # No lifespan needed: these public endpoints do not access the database. + client = TestClient(app) + response = client.get('/api/suggestions') + assert response.status_code == 200 + pools = response.json() + assert set(pools) == {'look', 'smell', 'first_words', 'good_at_math', 'like', 'hate'} + for category, entries in pools.items(): + assert len(entries) >= 20 + assert len({entry.casefold() for entry in entries}) == len(entries) + sanitize = sanitize_name if category == 'smell' else sanitize_text + assert all(entry and sanitize(entry) == entry for entry in entries) + techniques = client.get('/api/suggestions/techniques') + assert techniques.status_code == 200 + assert techniques.json()['techniques']