Fix four tag gaps and a contradiction found by the full-database audit

Cross-checked all 150 jokers' tags against JOKER_EFFECTS.md and the dump:

- Drop the Vampire + Marble clash: Vampire gains xMult from any non-base
  scoring card (card.lua:3907), Stones included, so Marble feeds it --
  the same shape as the Midas Mask pair. The data even scored the duo
  as a combo while warning against it. Stone-build harm stays covered
  by the Vampire + Stone Joker line.
- Delayed Gratification wants discards_up: it pays per unused discard,
  same shape as Banner.
- The Idol wants suit_flex: it checks is_suit (card.lua:3530), so
  Smeared doubles its eligible cards, like Ancient Joker.
- 8 Ball wants retrig_scoring: the 1-in-4 rolls per scored 8 in the
  individual pass (card.lua:3507), so retriggers re-roll it.
- Reword the suit give phrasings: nothing vanilla turns cards into a
  suit, so 'turns cards into Spades' was a lie whenever Blackboard sat
  across from a one-sided giver like Wrathful or Arrowhead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
funman300
2026-07-15 18:51:49 -07:00
parent 4e4c2e68c3
commit 53907424b0
2 changed files with 24 additions and 17 deletions
+9 -9
View File
@@ -12,7 +12,7 @@ does not get redone from scratch every session.
|---|---| |---|---|
| Jokers in the database | 150 | | Jokers in the database | 150 |
| Famous pairs | 36 | | Famous pairs | 36 |
| Clashes | 25 | | Clashes | 24 |
| Cautions | 15 | | Cautions | 15 |
| Themes | 31 | | Themes | 31 |
| Jokers in no famous pair | 102 | | Jokers in no famous pair | 102 |
@@ -74,7 +74,7 @@ A tag with two is fragile: drop either joker and the theme dies.
| `clubs` | 3 | 4 | 4 | yes | | `clubs` | 3 | 4 | 4 | yes |
| `copy_target` | 10 | 3 | 13 | yes | | `copy_target` | 10 | 3 | 13 | yes |
| `diamonds` | 2 | 2 | **2** | yes | | `diamonds` | 2 | 2 | **2** | yes |
| `discards_up` | 2 | 8 | 10 | yes | | `discards_up` | 2 | 9 | 11 | yes |
| `enhance_gen` | 2 | 2 | 4 | yes | | `enhance_gen` | 2 | 2 | 4 | yes |
| `faces` | 1 | 9 | 10 | yes | | `faces` | 1 | 9 | 10 | yes |
| `flush` | 5 | 4 | 6 | yes | | `flush` | 5 | 4 | 6 | yes |
@@ -91,13 +91,13 @@ A tag with two is fragile: drop either joker and the theme dies.
| `retrig_faces` | 1 | 10 | 11 | yes | | `retrig_faces` | 1 | 10 | 11 | yes |
| `retrig_held` | 1 | 4 | 5 | yes | | `retrig_held` | 1 | 4 | 5 | yes |
| `retrig_low` | 1 | 11 | 12 | yes | | `retrig_low` | 1 | 11 | 12 | yes |
| `retrig_scoring` | 4 | 16 | 20 | yes | | `retrig_scoring` | 4 | 17 | 21 | yes |
| `sell_value` | 2 | 2 | 4 | yes | | `sell_value` | 2 | 2 | 4 | yes |
| `spades` | 2 | 3 | 3 | yes | | `spades` | 2 | 3 | 3 | yes |
| `spectral_gen` | 2 | 2 | **2** | yes | | `spectral_gen` | 2 | 2 | **2** | yes |
| `stone_gen` | 1 | 1 | **2** | yes | | `stone_gen` | 1 | 1 | **2** | yes |
| `straight` | 7 | 6 | 8 | yes | | `straight` | 7 | 6 | 8 | yes |
| `suit_flex` | 1 | 11 | 12 | yes | | `suit_flex` | 1 | 12 | 13 | yes |
| `tarot_gen` | 6 | 2 | 7 | yes | | `tarot_gen` | 6 | 2 | 7 | yes |
| `three_kind` | 4 | 3 | 4 | yes | | `three_kind` | 4 | 3 | 4 | yes |
| `two_pair` | 3 | 3 | 3 | yes | | `two_pair` | 3 | 3 | 3 | yes |
@@ -109,11 +109,11 @@ mis-tagged, the error is spread across the whole database.
| joker | partners scoring >= 2 | | joker | partners scoring >= 2 |
|---|---| |---|---|
| `j_dusk` | 16 | | `j_dusk` | 17 |
| `j_hanging_chad` | 16 | | `j_hanging_chad` | 17 |
| `j_selzer` | 16 | | `j_selzer` | 17 |
| `j_smeared` | 16 | | `j_smeared` | 17 |
| `j_splash` | 16 | | `j_splash` | 17 |
| `j_to_the_moon` | 16 | | `j_to_the_moon` | 16 |
| `j_bootstraps` | 15 | | `j_bootstraps` | 15 |
| `j_bull` | 15 | | `j_bull` | 15 |
+15 -8
View File
@@ -54,7 +54,7 @@ j('j_half', {'mult'})
j('j_credit_card', {}) j('j_credit_card', {})
j('j_banner', {'chips'}, {'discards_up'}) j('j_banner', {'chips'}, {'discards_up'})
j('j_mystic_summit', {'mult'}) j('j_mystic_summit', {'mult'})
j('j_8_ball', {'tarot_gen'}, {'probability'}) j('j_8_ball', {'tarot_gen'}, {'probability','retrig_scoring'})
j('j_misprint', {'mult'}) j('j_misprint', {'mult'})
j('j_raised_fist', {'mult'}, {'retrig_held','hand_size'}) j('j_raised_fist', {'mult'}, {'retrig_held','hand_size'})
j('j_chaos', {}) j('j_chaos', {})
@@ -62,7 +62,7 @@ j('j_scary_face', {'chips'}, {'faces','retrig_scoring',
-- Abstract Joker's Mult is the joker count (`#G.jokers.cards`, card.lua:4119), so -- Abstract Joker's Mult is the joker count (`#G.jokers.cards`, card.lua:4119), so
-- anything that hands you spare Jokers feeds it. Riff-Raff is +6 Mult on its own. -- anything that hands you spare Jokers feeds it. Riff-Raff is +6 Mult on its own.
j('j_abstract', {'mult'}, {'joker_gen'}) j('j_abstract', {'mult'}, {'joker_gen'})
j('j_delayed_grat', {'money'}) j('j_delayed_grat', {'money'}, {'discards_up'})
j('j_gros_michel', {'mult'}) j('j_gros_michel', {'mult'})
j('j_even_steven', {'mult'}, {'retrig_scoring','retrig_low'}) j('j_even_steven', {'mult'}, {'retrig_scoring','retrig_low'})
j('j_odd_todd', {'chips'}, {'retrig_scoring','retrig_low'}) j('j_odd_todd', {'chips'}, {'retrig_scoring','retrig_low'})
@@ -171,7 +171,7 @@ j('j_ring_master', {})
j('j_flower_pot', {'xmult'}, {'suit_flex'}) j('j_flower_pot', {'xmult'}, {'suit_flex'})
j('j_merry_andy', {'discards_up'}) j('j_merry_andy', {'discards_up'})
j('j_oops', {'probability'}) j('j_oops', {'probability'})
j('j_idol', {'xmult','copy_target'}, {'retrig_scoring','retrig_low','retrig_faces'}) j('j_idol', {'xmult','copy_target'}, {'retrig_scoring','retrig_low','retrig_faces','suit_flex'})
j('j_seeing_double', {'xmult','clubs'}, {'clubs','suit_flex'}) j('j_seeing_double', {'xmult','clubs'}, {'clubs','suit_flex'})
j('j_matador', {'money'}) j('j_matador', {'money'})
j('j_hit_the_road', {'xmult'}, {'discards_up'}) j('j_hit_the_road', {'xmult'}, {'discards_up'})
@@ -295,7 +295,11 @@ local CLASHES = {
{'j_vampire', 'j_glass', 'strips Glass before it shatters'}, {'j_vampire', 'j_glass', 'strips Glass before it shatters'},
{'j_vampire', 'j_drivers_license', 'strips the 16 enhanced cards'}, {'j_vampire', 'j_drivers_license', 'strips the 16 enhanced cards'},
{'j_vampire', 'j_stone', 'eats the Stone cards it counts'}, {'j_vampire', 'j_stone', 'eats the Stone cards it counts'},
{'j_vampire', 'j_marble', 'eats the Stones Marble adds'}, -- j_vampire + j_marble is NOT here on purpose: Vampire gains xMult from any
-- non-base scoring card (card.lua:3907), Stones included, so Marble is a
-- renewable supply for it -- the same shape as the Midas Mask pair. The
-- harm only appears via a third joker (Stone Joker), which carries its own
-- clash line; third-party harm is not a clash (see the Card Sharp verdict).
-- Joker Stencil's xMult is the count of EMPTY joker slots. -- Joker Stencil's xMult is the count of EMPTY joker slots.
{'j_stencil', 'j_riff_raff', 'fills the slots Stencil needs'}, {'j_stencil', 'j_riff_raff', 'fills the slots Stencil needs'},
@@ -389,14 +393,17 @@ local TAG_TEXT = {
give = 'makes Straights easier', want = 'rewards Straights'}, give = 'makes Straights easier', want = 'rewards Straights'},
flush = {both = 'both reward Flushes', flush = {both = 'both reward Flushes',
give = 'makes Flushes easier', want = 'rewards Flushes'}, give = 'makes Flushes easier', want = 'rewards Flushes'},
-- No vanilla joker converts cards to a suit; every suit "giver" is a payoff
-- in the same cluster. The give phrasing must stay true for those (it shows
-- when the wanter is one-sided, e.g. Blackboard vs Wrathful/Arrowhead).
hearts = {both = 'both love Hearts', hearts = {both = 'both love Hearts',
give = 'turns cards into Hearts', want = 'rewards Hearts'}, give = 'also builds around Hearts', want = 'rewards Hearts'},
diamonds = {both = 'both love Diamonds', diamonds = {both = 'both love Diamonds',
give = 'turns cards into Diamonds', want = 'rewards Diamonds'}, give = 'also builds around Diamonds', want = 'rewards Diamonds'},
spades = {both = 'both love Spades', spades = {both = 'both love Spades',
give = 'turns cards into Spades', want = 'rewards Spades'}, give = 'also builds around Spades', want = 'rewards Spades'},
clubs = {both = 'both love Clubs', clubs = {both = 'both love Clubs',
give = 'turns cards into Clubs', want = 'rewards Clubs'}, give = 'also builds around Clubs', want = 'rewards Clubs'},
} }
-- Order in which tags are considered when picking the one reason to show; -- Order in which tags are considered when picking the one reason to show;