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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user