Chase the audit's leads: verify, implement, or reject

Every lead in AUDIT.md, traced to the running source and then settled.

Ceremonial Dagger DESTROYS the joker to its right at blind select
(card.lua:2945) and skips Eternals. The card says so; what it cannot say
is WHICH of your jokers is about to die. JCA.dagger_victim names it in
the tooltip -- "WILL DESTROY Baron at the next blind" -- while there is
still time to reorder, and stays quiet when the neighbour is Eternal.

Four jokers that scored 0 against all 150 now have partners, all verified
in card.lua rather than recalled:
* Burglar + Ramen: Ramen decays per discarded card and is DESTROYED at x1
  (SMODS.destroy_cards). Burglar zeroes discards, so it never decays and
  never dies. Same for Burglar + Green Joker, which is only punished by
  discarding.
* Trading Card + Erosion: Erosion pays per card MISSING from the deck,
  and Trading Card permanently destroys the card it discards.
* Chaos the Clown + Flash Card: a free reroll every shop, and a joker
  that grows per reroll. Both were inert.

Erosion is the mirror of card_gen, so it now clashes with every joker
that permanently adds a card: DNA, Marble, Certificate.

Rejected, with the reasoning recorded so nobody "fixes" it later:
Card Sharp and Supernova reward replaying a hand and Obelisk punishes it,
but neither destroys the other's precondition -- the player's hand choice
does. That is an opposed incentive, not an opposed effect. The clash list
only earns trust while every entry is mechanical.

The audit's own silent-check was wrong: it flagged Square Joker, which
has been paired with Four Fingers all along, and I duplicated that pair
before the suite caught it. Silence now means no tags AND no famous pair.

711 pass locally, 10 in-game.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
funman300
2026-07-14 12:36:01 -07:00
parent 96a00d0d0c
commit 8ce5619273
5 changed files with 158 additions and 64 deletions
+46 -3
View File
@@ -191,6 +191,34 @@ function JCA.copy_source(card)
return target, center.blueprint_compat ~= false
end
-- Ceremonial Dagger is positional too, and it is the dangerous one: when the
-- blind is selected it DESTROYS the joker to its right and eats twice its sell
-- value as Mult (card.lua:2945). The card text says so; what it cannot tell you
-- is *which joker on your board* is about to die. Vanilla skips Eternal jokers,
-- so an Eternal neighbour is safe.
--
-- Returns the joker it will eat (or nil), and whether that joker is safe.
function JCA.dagger_victim(card)
if not (G.jokers and G.jokers.cards and card.config and card.config.center) then
return nil
end
if card.config.center.key ~= 'j_ceremonial' then return nil end
local cards, idx = G.jokers.cards, nil
for i, c in ipairs(cards) do
if c == card then idx = i break end
end
if not idx then return nil end
local target = cards[idx + 1]
if not target or not (target.config and target.config.center) then return nil end
local eternal = target.ability and target.ability.eternal
if SMODS and SMODS.is_eternal then
local ok, res = pcall(SMODS.is_eternal, target, card)
if ok then eternal = res end
end
return target, not not eternal
end
-- Sell advisor: on a full board, the owned joker contributing the least
-- total synergy to the rest is the natural cut when something better shows
-- up. Returns nil when slots are free, the board is tiny, or every joker
@@ -434,10 +462,11 @@ local function tooltip_rows(card)
local caution = in_buy_area(card) and JCA.cautions[key]
if caution then text_row('Caution: ' .. caution, G.C.RED) end
-- Copy jokers: say what this one is copying RIGHT NOW. The board order decides
-- it, and a Blueprint in the wrong slot is a dead card that looks fine. This is
-- an explanation, not a verdict, so learning mode keeps it.
-- Positional jokers: say what this one is doing to its neighbour RIGHT NOW.
-- The board order decides it, so only an owned joker has an answer. These are
-- explanations, not verdicts, so learning mode keeps them.
if card.area == G.jokers then
-- Copy jokers. A Blueprint in the wrong slot is a dead card that looks fine.
local target, copyable = JCA.copy_source(card)
if not target then
if COPIERS[key] then
@@ -451,6 +480,20 @@ local function tooltip_rows(card)
else
text_row('Copying ' .. name_of(target.config.center.key), G.C.GREEN)
end
-- Ceremonial Dagger. This one is about to eat a joker, permanently, at the
-- next blind — worth shouting about while there is still time to reorder.
local victim, safe = JCA.dagger_victim(card)
if victim then
local vname = name_of(victim.config.center.key)
if safe then
text_row(vname .. ' is Eternal - the blade cannot eat it', G.C.GREEN)
else
text_row('WILL DESTROY ' .. vname .. ' at the next blind', G.C.RED)
end
elseif key == 'j_ceremonial' then
text_row('Nothing to its right - the blade goes hungry', G.C.GREEN)
end
end
-- Sell advisor verdict (owned jokers only; suppressed in learning mode