Fix enabler phrasing, wake two silent jokers, read the board order

* The tooltip mis-taught every pure enabler. JCA.explain used a cluster
  tag's `both` text whenever EITHER side was a full member, so Four
  Fingers next to Runner claimed "both reward Straights" -- Four Fingers
  does not reward Straights, it makes them reachable. `both` now requires
  both sides, and every cluster tag carries give/want phrasings.

* Blue Joker and Abstract Joker scored 0 against all 150 jokers. Blue
  Joker scales on #G.deck.cards, so it wants card_gen (DNA, Marble,
  Certificate); Abstract scales on #G.jokers.cards, so it wants joker_gen
  (Riff-Raff is +6 Mult on its own). Both verified in card.lua. Steel and
  Glass Joker look like the same fix but are NOT: they need Steel/Glass
  specifically, and the only enhance_gen givers make Gold and Stone, so
  tagging them would invent a synergy that does not exist.

* Copy jokers are positional and the board order was there all along.
  JCA.copy_source reports what an owned Blueprint/Brainstorm is actually
  copying, including when the target is one of the 29 centers vanilla
  refuses to copy (blueprint_compat = false), or when it is copying
  nothing at all.

* The sell advisor now counts clashes when ranking what to cut. JCA.score
  stays pure -- a trap must never make a card look like a combo -- but a
  joker eating another one's payoff is exactly the one to sell.

The suite caught a real bug while writing this: `(mode == 'right') and
cards[idx+1] or cards[1]` falls through to the LEFTMOST joker when the
right-hand slot is nil, so a rightmost Blueprint would have named the
wrong card. 673 pass here, 9 in-game via the smoke harness.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
funman300
2026-07-14 12:24:33 -07:00
parent bf0672a438
commit e688de0efb
4 changed files with 226 additions and 19 deletions
+37 -15
View File
@@ -54,7 +54,9 @@ j('j_misprint', {'mult'})
j('j_raised_fist', {'mult'}, {'retrig_held','hand_size'})
j('j_chaos', {})
j('j_scary_face', {'chips'}, {'faces','retrig_scoring'})
j('j_abstract', {'mult'})
-- 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.
j('j_abstract', {'mult'}, {'joker_gen'})
j('j_delayed_grat', {'money'})
j('j_gros_michel', {'mult'})
j('j_even_steven', {'mult'}, {'retrig_scoring'})
@@ -67,7 +69,9 @@ j('j_egg', {'sell_value'})
j('j_runner', {'chips','straight'}, {'straight'})
j('j_ice_cream', {'chips'})
j('j_splash', {'retrig_scoring'}) -- makes every played card score
j('j_blue_joker', {'chips'})
-- Blue Joker's Chips scale with the cards left in the deck (`#G.deck.cards`,
-- card.lua:4311), so every joker that permanently adds cards grows it.
j('j_blue_joker', {'chips'}, {'card_gen'})
j('j_faceless', {'money'}, {'faces','discards_up'})
j('j_green_joker', {'mult'})
j('j_superposition', {'tarot_gen','straight'}, {'straight'})
@@ -323,26 +327,44 @@ local TAG_TEXT = {
probability = {give = 'improves listed odds', want = 'relies on listed odds'},
money = {give = 'earns money', want = 'scales with your money'},
tarot_gen = {give = 'creates Tarot cards', want = 'rewards Tarot use'},
planet = {both = 'shares the Planet economy'},
spectral_gen = {both = 'shares the Spectral theme'},
planet = {both = 'shares the Planet economy',
give = 'creates Planet cards', want = 'rewards Planet use'},
spectral_gen = {both = 'shares the Spectral theme',
give = 'creates Spectral cards', want = 'rewards Spectral use'},
gold_gen = {give = 'creates Gold cards', want = 'pays off Gold cards'},
stone_gen = {give = 'adds Stone cards', want = 'pays off Stone cards'},
enhance_gen = {give = 'enhances cards', want = 'feeds on enhancements'},
card_gen = {give = 'adds cards to the deck', want = 'grows as the deck grows'},
joker_gen = {give = 'creates spare Jokers', want = 'profits when Jokers sell'},
-- The want text has to fit every wanter: Campfire sells the spares, Swashbuckler
-- sums their sell value, Abstract Joker just counts them.
joker_gen = {give = 'creates spare Jokers', want = 'rewards spare Jokers'},
sell_value = {give = 'raises sell values', want = 'turns sell value into Mult'},
copy_target = {give = 'is a prime copy target', want = 'copies your best Joker'},
suit_flex = {give = 'makes suits count as others', want = 'cares which suits score'},
pair = {both = 'both reward Pairs'},
two_pair = {both = 'both reward Two Pair'},
three_kind = {both = 'both reward Three of a Kind'},
four_kind = {both = 'both reward Four of a Kind'},
straight = {both = 'both reward Straights'},
flush = {both = 'both reward Flushes'},
hearts = {both = 'both love Hearts'},
diamonds = {both = 'both love Diamonds'},
spades = {both = 'both love Spades'},
clubs = {both = 'both love Clubs'},
-- Cluster tags need all three phrasings. `both` is only right when BOTH jokers
-- sit on both sides of the tag; a pure enabler (Four Fingers, DNA) gives the
-- tag without wanting it, and "both reward Straights" would be a lie -- Four
-- Fingers does not reward Straights, it makes them reachable.
pair = {both = 'both reward Pairs',
give = 'makes Pairs easier', want = 'rewards Pairs'},
two_pair = {both = 'both reward Two Pair',
give = 'makes Two Pair easier', want = 'rewards Two Pair'},
three_kind = {both = 'both reward Three of a Kind',
give = 'makes Three of a Kind easier', want = 'rewards Three of a Kind'},
four_kind = {both = 'both reward Four of a Kind',
give = 'makes Four of a Kind easier', want = 'rewards Four of a Kind'},
straight = {both = 'both reward Straights',
give = 'makes Straights easier', want = 'rewards Straights'},
flush = {both = 'both reward Flushes',
give = 'makes Flushes easier', want = 'rewards Flushes'},
hearts = {both = 'both love Hearts',
give = 'turns cards into Hearts', want = 'rewards Hearts'},
diamonds = {both = 'both love Diamonds',
give = 'turns cards into Diamonds', want = 'rewards Diamonds'},
spades = {both = 'both love Spades',
give = 'turns cards into Spades', want = 'rewards Spades'},
clubs = {both = 'both love Clubs',
give = 'turns cards into Clubs', want = 'rewards Clubs'},
}
-- Order in which tags are considered when picking the one reason to show;