diff --git a/bun.lock b/bun.lock index ff410d7..4256ecc 100644 --- a/bun.lock +++ b/bun.lock @@ -68,6 +68,7 @@ "recharts": "^2.15.2", "remeda": "^2.21.2", "server-only": "^0.0.1", + "slugify": "^1.6.6", "sonner": "^2.0.3", "superjson": "^2.2.1", "tailwind-merge": "^3.1.0", @@ -1033,6 +1034,8 @@ "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], + "slugify": ["slugify@1.6.6", "", {}, "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw=="], + "sonner": ["sonner@2.0.3", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-njQ4Hht92m0sMqqHVDL32V2Oun9W1+PHO9NDv9FHfJjT3JT22IG4Jpo3FPQy+mouRKCXFWO+r67v6MrHX2zeIA=="], "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], diff --git a/content/docs/getting-started/meta.json b/content/docs/getting-started/meta.json index 0b55923..992fc96 100644 --- a/content/docs/getting-started/meta.json +++ b/content/docs/getting-started/meta.json @@ -1,5 +1,5 @@ { "title": "Getting Started", - "pages": ["installation", "multiplayer-balance-changes", "faq"], + "pages": ["installation", "faq"], "defaultOpen": true } diff --git a/content/docs/meta.json b/content/docs/meta.json index 849073e..c3588d8 100644 --- a/content/docs/meta.json +++ b/content/docs/meta.json @@ -1,5 +1,10 @@ { - "title": "Advanced", - "pages": ["index", "getting-started", "advanced"], + "pages": [ + "index", + "getting-started", + "rulesets", + "ranked-matchmaking", + "advanced" + ], "defaultOpen": true } diff --git a/content/docs/rulesets/standard.mdx b/content/docs/rulesets/standard.mdx new file mode 100644 index 0000000..bf40ede --- /dev/null +++ b/content/docs/rulesets/standard.mdx @@ -0,0 +1,335 @@ +--- +title: Standard +description: The standard ruleset includes Multiplayer cards and changes to the base game to fit the Multiplayer meta. +--- + + +## Jokers + +### Multiplayer Jokers + +There are **10 added multiplayer jokers**. All jokers added in the multiplayer mod are designed +to **interact with your opponent** and will not show up in single player games. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
JokerDescriptionNotes
+ #### Defensive Joker [toc] + + + +125 Chips for every life less than your Nemesis. + + There is a bug where this joker might appear in single player mode. To fix this, disable the multiplayer + mod when playing single player. +
+ #### Skip-Off [toc] + + + +1 Hands and +1 Discards per additional blind skipped compared to your + Nemesis. +
+ #### Let's Go Gambling [toc] + + +
+ 1 in 4 chance for X4 Mult and $10 + 1 in 8 chance to give your Nemesis $5 +
+
+ The effect applies on each hand played. +
+ #### Speedrun [toc] + + + If you reach a PvP Blind before your Nemesis, create a + random Spectral card. Must have room. + + There is a bug where the spectral card might not be created, but is is very rare. We're working on a + fix. +
+ #### Conjoined Joker [toc] + + + While in a PvP Blind, gain + X1 Mult for every Hand + your Nemesis has left + (Max X5 Mult) +
+ #### Penny Pincher [toc] + + + At start of shop, gain + $1 for every $3 your Nemesis spent last shop +
+ #### Taxes [toc] + + + This Joker gains +5 Mult each time your Nemesis sells a card +
+ #### Magnet [toc] + + + After 2 rounds, sell this card to Copy your Nemesis' highest sell cost Joker. Does not + copy Joker state. + + If your Nemesis has multiple Jokers that have the highest sell cost, a random one will be copied. +
+ #### Pizza [toc] + + +
+ +6 Discards for all players + -1 Discard when any player selects a blind + Eaten when your Nemesis skips +
+
+ #### Pacifist [toc] + + +
+ X10 Mult while not in a PvP Blind +
+
+
+ + + These jokers can be removed by unchecking the **"Enable Multiplayer Cards"** option in the lobby options. + + +### Disabled Jokers +The following jokers are **unavailable** in multiplayer due to their interaction with boss blinds: + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
JokerDescription
+ #### Chicot [toc] + + + Disables effect of every Boss Blind +
+ #### Matador [toc] + + + Earn $8 if played hand triggers the Boss Blind ability +
+ #### Mr. Bones [toc] + + + Prevents Death if chips scored are at least 25% of required chips. + Self destructs +
+ #### Luchador [toc] + + + Sell this card to disable the current Boss Blind +
+
+ + +### Modified Jokers + +These jokers are modified versions of the original jokers. + +
+ + + + + + + + + + + + + +
JokerDescription
+ #### Hanging Chad [toc] + + + Retrigger first and second played cards used in + scoring 1 additional time +
+
+ +## Planet cards + +
+ + + + + + + + + + + + + + + +
CardDescriptionNotes
+ ### Asteroid [toc] + + + Removes one level from your Nemesis' highest level poker hand. +
+
+ +## Tarot Cards + +
+ + + + + + + + + + + + + + + +
CardDescriptionNotes
+ ### Justice [toc] + + + This card is **not available** in the standard ruleset. + + Glass cards can only be found in + - Standard packs + - Spectral cards that spawn cards (Grim, Incantation, and Familiar) +
+
+ + + +## Enhancements + +
+ + + + + + + + + + + + + + + +
CardDescriptionNotes
+ ### Glass Card [toc] + + +
+ X1.5 Mult + 1 in 4 chance to destroy card after all scoring is finished +
+
+ Glass cards can only be found in + - Standard packs + - Spectral cards that spawn cards (Grim, Incantation, and Familiar) +
+
+ +### Glass Cards + +Glass cards are now **1.5x** instead of 2x multiplier and can **only** be found in: + +- Standard packs +- Spectral cards that spawn cards (Grim, Incantation, and Familiar) diff --git a/package.json b/package.json index ec76dce..7feed8a 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "recharts": "^2.15.2", "remeda": "^2.21.2", "server-only": "^0.0.1", + "slugify": "^1.6.6", "sonner": "^2.0.3", "superjson": "^2.2.1", "tailwind-merge": "^3.1.0", diff --git a/public/cards/c_asteroid.png b/public/cards/c_asteroid.png new file mode 100644 index 0000000..9f09a28 Binary files /dev/null and b/public/cards/c_asteroid.png differ diff --git a/public/cards/c_asteroid_ru.png b/public/cards/c_asteroid_ru.png new file mode 100644 index 0000000..a7c039c Binary files /dev/null and b/public/cards/c_asteroid_ru.png differ diff --git a/public/cards/e_glass.png b/public/cards/e_glass.png new file mode 100644 index 0000000..4d48013 Binary files /dev/null and b/public/cards/e_glass.png differ diff --git a/public/cards/j_chicot.png b/public/cards/j_chicot.png new file mode 100644 index 0000000..c15bdba Binary files /dev/null and b/public/cards/j_chicot.png differ diff --git a/public/cards/j_conjoined_joker.png b/public/cards/j_conjoined_joker.png new file mode 100644 index 0000000..7682a67 Binary files /dev/null and b/public/cards/j_conjoined_joker.png differ diff --git a/public/cards/j_copycat.png b/public/cards/j_copycat.png new file mode 100644 index 0000000..a0c2afa Binary files /dev/null and b/public/cards/j_copycat.png differ diff --git a/public/cards/j_defensive_joker.png b/public/cards/j_defensive_joker.png new file mode 100644 index 0000000..333cb15 Binary files /dev/null and b/public/cards/j_defensive_joker.png differ diff --git a/public/cards/j_hanging_chad.png b/public/cards/j_hanging_chad.png new file mode 100644 index 0000000..f3cf504 Binary files /dev/null and b/public/cards/j_hanging_chad.png differ diff --git a/public/cards/j_lets_go_gambling.png b/public/cards/j_lets_go_gambling.png new file mode 100644 index 0000000..d2ef89d Binary files /dev/null and b/public/cards/j_lets_go_gambling.png differ diff --git a/public/cards/j_luchador.png b/public/cards/j_luchador.png new file mode 100644 index 0000000..a0dc342 Binary files /dev/null and b/public/cards/j_luchador.png differ diff --git a/public/cards/j_magnet.png b/public/cards/j_magnet.png new file mode 100644 index 0000000..229bad3 Binary files /dev/null and b/public/cards/j_magnet.png differ diff --git a/public/cards/j_matador.png b/public/cards/j_matador.png new file mode 100644 index 0000000..88470b6 Binary files /dev/null and b/public/cards/j_matador.png differ diff --git a/public/cards/j_mr_bones.png b/public/cards/j_mr_bones.png new file mode 100644 index 0000000..29f87bd Binary files /dev/null and b/public/cards/j_mr_bones.png differ diff --git a/public/cards/j_pacifist.png b/public/cards/j_pacifist.png new file mode 100644 index 0000000..8b4e43f Binary files /dev/null and b/public/cards/j_pacifist.png differ diff --git a/public/cards/j_penny_pincher.png b/public/cards/j_penny_pincher.png new file mode 100644 index 0000000..3b535d7 Binary files /dev/null and b/public/cards/j_penny_pincher.png differ diff --git a/public/cards/j_pizza.png b/public/cards/j_pizza.png new file mode 100644 index 0000000..e018918 Binary files /dev/null and b/public/cards/j_pizza.png differ diff --git a/public/cards/j_skip_off.png b/public/cards/j_skip_off.png new file mode 100644 index 0000000..1d48ab5 Binary files /dev/null and b/public/cards/j_skip_off.png differ diff --git a/public/cards/j_speedrun.png b/public/cards/j_speedrun.png new file mode 100644 index 0000000..58941e9 Binary files /dev/null and b/public/cards/j_speedrun.png differ diff --git a/public/cards/j_taxes.png b/public/cards/j_taxes.png new file mode 100644 index 0000000..c007789 Binary files /dev/null and b/public/cards/j_taxes.png differ diff --git a/public/cards/modicon.png b/public/cards/modicon.png new file mode 100644 index 0000000..b2b8511 Binary files /dev/null and b/public/cards/modicon.png differ diff --git a/public/cards/player_blind_row.png b/public/cards/player_blind_row.png new file mode 100644 index 0000000..a5e1432 Binary files /dev/null and b/public/cards/player_blind_row.png differ diff --git a/public/cards/sticker_balanced.png b/public/cards/sticker_balanced.png new file mode 100644 index 0000000..89586ea Binary files /dev/null and b/public/cards/sticker_balanced.png differ diff --git a/public/cards/sticker_nemesis.png b/public/cards/sticker_nemesis.png new file mode 100644 index 0000000..17523a3 Binary files /dev/null and b/public/cards/sticker_nemesis.png differ diff --git a/public/cards/t_justice.png b/public/cards/t_justice.png new file mode 100644 index 0000000..2cd6ec8 Binary files /dev/null and b/public/cards/t_justice.png differ diff --git a/src/app/_components/chance.tsx b/src/app/_components/chance.tsx new file mode 100644 index 0000000..ee27002 --- /dev/null +++ b/src/app/_components/chance.tsx @@ -0,0 +1,7 @@ +import { cn } from '@/lib/utils' + +export function Chance({ className, ...props }: React.ComponentProps<'span'>) { + return ( + + ) +} diff --git a/src/app/_components/chips.tsx b/src/app/_components/chips.tsx new file mode 100644 index 0000000..ae7b76c --- /dev/null +++ b/src/app/_components/chips.tsx @@ -0,0 +1,9 @@ +'use client' + +import { cn } from '@/lib/utils' + +export function Chips({ className, ...props }: React.ComponentProps<'span'>) { + return ( + + ) +} diff --git a/src/app/_components/hands.tsx b/src/app/_components/hands.tsx new file mode 100644 index 0000000..dd45f9c --- /dev/null +++ b/src/app/_components/hands.tsx @@ -0,0 +1,9 @@ +'use client' + +import { cn } from '@/lib/utils' + +export function Hands({ className, ...props }: React.ComponentProps<'span'>) { + return ( + + ) +} diff --git a/src/app/_components/joker-card.tsx b/src/app/_components/joker-card.tsx new file mode 100644 index 0000000..16c4796 --- /dev/null +++ b/src/app/_components/joker-card.tsx @@ -0,0 +1,27 @@ +'use client' + +import type { ElementType } from 'react' +import slugify from 'slugify' + +type JokerCardProps = { + name: string + img: string + h?: number +} + +export function JokerCard({ name, img, h = 3 }: JokerCardProps) { + const Heading = `h${h}` as ElementType + return ( +
+ {name} +
+ + {name} + +
+
+ ) +} diff --git a/src/app/_components/money.tsx b/src/app/_components/money.tsx new file mode 100644 index 0000000..5e14549 --- /dev/null +++ b/src/app/_components/money.tsx @@ -0,0 +1,7 @@ +import { cn } from '@/lib/utils' + +export function Money({ className, ...props }: React.ComponentProps<'span'>) { + return ( + + ) +} diff --git a/src/app/_components/mult.tsx b/src/app/_components/mult.tsx new file mode 100644 index 0000000..791555b --- /dev/null +++ b/src/app/_components/mult.tsx @@ -0,0 +1,7 @@ +import { cn } from '@/lib/utils' + +export function Mult({ className, ...props }: React.ComponentProps<'span'>) { + return ( + + ) +} diff --git a/src/app/_components/spectral.tsx b/src/app/_components/spectral.tsx new file mode 100644 index 0000000..59170ef --- /dev/null +++ b/src/app/_components/spectral.tsx @@ -0,0 +1,10 @@ +import { cn } from '@/lib/utils' + +export function Spectral({ + className, + ...props +}: React.ComponentProps<'span'>) { + return ( + + ) +} diff --git a/src/app/_components/xmult.tsx b/src/app/_components/xmult.tsx new file mode 100644 index 0000000..6e2c198 --- /dev/null +++ b/src/app/_components/xmult.tsx @@ -0,0 +1,15 @@ +'use client' + +import { cn } from '@/lib/utils' + +export function Xmult({ className, ...props }: React.ComponentProps<'span'>) { + return ( + + ) +} diff --git a/src/app/docs/[[...slug]]/page.tsx b/src/app/docs/[[...slug]]/page.tsx index b5d4efd..78f6cdf 100644 --- a/src/app/docs/[[...slug]]/page.tsx +++ b/src/app/docs/[[...slug]]/page.tsx @@ -1,3 +1,11 @@ +import { Chance } from '@/app/_components/chance' +import { Chips } from '@/app/_components/chips' +import { Hands } from '@/app/_components/hands' +import { JokerCard } from '@/app/_components/joker-card' +import { Money } from '@/app/_components/money' +import { Mult } from '@/app/_components/mult' +import { Spectral } from '@/app/_components/spectral' +import { Xmult } from '@/app/_components/xmult' import { Button } from '@/components/ui/button' import { ImageZoom } from 'fumadocs-ui/components/image-zoom' import defaultMdxComponents from 'fumadocs-ui/mdx' @@ -21,7 +29,13 @@ export default async function Page(props: { const MDX = page.data.body return ( - + {page.data.title} {page.data.description} @@ -30,6 +44,14 @@ export default async function Page(props: { ...defaultMdxComponents, img: (props) => , Button: (props) =>