← Back to editor

What's New

What's New

Newest first. Nearly all of it comes from people building characters and telling us what broke or what was missing.

0.8.0

2026-07-31

Six weeks of community requests and bug reports from Discord. Almost everything here came from someone building a character and hitting a wall.

New things you can build

Your own creatures and companions. Summonable pets with their own art, HP and attacks — give them a damage bonus, heal or hurt them, send them away, or make a card do something extra while yours is out. Plus Summon and Osty-attack effects for the vanilla creature.

Custom Chronicles. Your character can have its own Timeline stories and epochs, with their own art, alongside the vanilla ones.

Cards that ask for X. X Energy cost already worked; X Stars is new, and effects can now scale off either — "deal 3 damage per Star spent", or a formula mixing the spend with anything else.

A lot more ways for a card to react while it sits in your hand or discard. When it is drawn, when it is retained, when you play a card of a given cost, tag, name or type, when a certain number of cards have been played this turn, and when you gain or lose one of your own statuses.

Custom archetype tags. Tag your cards, then count them, trigger off them, scale from them, or make a relic care about them. Relics can be tagged too.

Roughly a hundred new effects and conditions, including: give Block to allies (fixed or scaled), Energy scaled off anything, recover cards from the discard or exhaust pile, return the top card of a pile to your hand, remove cards from the deck permanently, add cards to the deck permanently, transform every card with a given name, play a card automatically, exhaust from the top of the draw pile, apply a status equal to almost any measurement, heal or lose HP on a scale, a Vigor-style one-shot damage bonus, a per-turn damage cap, an Artifact-like ward you can narrow to specific statuses, curses, and a customizable "play a visual effect" effect.

Multi-level upgrades, the Searing Blow pattern — a card that can be upgraded more than once, with its own text per level.

Custom orbs that apply your statuses or draw cards, with real icons and an adjustable position.

Custom stances that change the character's idle, attack and cast art, adapt their damage per move, cut enemy buffs, or change healing.

Better relics: several triggers on one relic, a stack-counter badge on the icon, trigger on a specific turn, on a card joining your deck, on the kind of enemy killed, and the ability to hand the player a card permanently.

Editor quality of life: card categories with drag-and-drop, a searchable sound and effect picker, a one-click share image, a project migration layer so older saves keep working, and a spec table listing every image size.

Fixed

  • Upgrade text. The whole card no longer turns green when an upgrade only changed the cost, added a keyword, or differed by a stray space or period. Upgraded numbers now show up on effects that were hiding them, custom-status amounts included, and multi-level text no longer crashes the description.
  • "You cannot die" no longer bricks the run. It put the game in a coma-like state where nothing could proceed.
  • Lethal damage works on cards, not just statuses — a card can now tell whether the damage it dealt actually killed, was blocked, or broke Block.
  • "Tokens come out upgraded" now covers every effect that makes a token. It only worked for three of the seven.
  • Two effects on one card no longer share a number. "Gain 2 Block. If X: gain 3 Block" granted 2 twice and printed 2 twice.
  • Multi-hit damage takes Strength, Vulnerable and Weak, uses the per-hit damage you typed in, and its upgrade actually applies.
  • Scaled damage is no longer quietly cut by Weak (a computed value is not a swing), and can opt back in to Strength when you want it.
  • Statuses with non-English names work as {tokens} in card text.
  • A status no longer fires on the card that granted it.
  • Several export blockers: mods that failed to build, projects this tool exported that it could not re-import, "too many files" from non-buildable assets, image uploads timing out, and the editor breaking after an animation upload.
  • Art: background removal no longer eats white artwork, the export compressor no longer destroys spritesheets, combat animations render at a consistent size, custom relics show the right outline, and token cards use your character's colour instead of the curse frame.
  • Targeting: Any Player no longer hangs solo runs, ally-targeted cards give every ally their token, target conditions on an all-enemies attack are judged per enemy, and "apply status equal to X" no longer applies a room-wide total to one enemy.
  • Dozens more, each with a test pinning the exact output that was wrong.

Around 2,960 tests, plus real compiles against the game's own libraries.

0.7.0

2026-06-13

P2 polish wave — closing out the audit's remaining editor/codegen/image items.

Added

  • Upgrade system completed: upgradeEffects.additionalEffects now fire under if (base.IsUpgraded) (were silently dropped); companion powers on Power cards thread the card's upgrade state so recurring effects scale; an upgradedDescription override emits {IfUpgraded:show(upgraded|base)}; a plain description override that would freeze the displayed numbers now warns.
  • Editor UX: deletions are undoable via toast (no more confirm()), alert() replaced with non-blocking toasts everywhere, Duplicate for relics and token cards, sidebar mechanic rows focus the clicked power, number inputs clamp to their schema range on blur, and a mobile "☰ Browse" drawer (the sidebar — the only way to pick a card/relic — was hidden on mobile).
  • Sidebar validation dots: items with a blocking pre-flight error show a red dot (preflight issues now carry an entityId).
  • Ancient acquisition warning: Ancient cards (excluded from shop/reward rolls) are flagged inline and in pre-flight, pointing to the starting-deck path that actually makes them obtainable.

Fixed

  • Transparency: JPEG is rejected on transparency-required slots (it has no alpha → black/white boxes in game); a corner-sampled solid-colour background remover handles flat backgrounds, not just checkerboards.
  • Relic outline: the small top-bar relic icon's outline layer is populated (it was null — ResourceLoader can't read raw mod PNGs).
  • PCK engine-version header bumped to the game's Godot 4.5.1.

547 tests passing.

0.6.0

2026-06-12

The feature wave following the 0.5.0 audit — toward full game-mechanic parity.

Added

  • All 183 player-usable vanilla powers exposed (was 16) — registry generated from the decompiled source (scripts/generate-power-registry.mjssrc/lib/generated/gamePowers.ts); searchable power picker with Buff/Debuff tags and descriptions. Flying = Flutter/Soar, tagged for conditions.
  • If/then/else conditionals — any conditioned effect can carry up to 3 "Otherwise" effects; conditions can check ANY registry power (targetHasPower — e.g. "is the target Flying", selfHasPower, targetPowerStacksAtLeast). Card text renders "If …: … Otherwise: …".
  • Passive always-on modifiers on custom statuses AND relics — 12 kinds compiled to the game's Modify*/Should* overrides (the Strength/Dexterity/Frail/Barricade pattern): damage dealt/taken, block gained, extra draw, max energy, healing, damage cap, block-not-cleared, shop prices, rest-site healing. Powers can scale flat amounts with stacks; passive-only statuses are valid.
  • Random-card mechanics — "Random token card" option for token effects; addRandomCardFromPool (pile/amount/type filter/0-cost), discoverCard (the game's own Discovery flow), transformRandomCardInHand. All seeded through RunState.Rng (multiplayer/replay safe).
  • New primitives — loseGold, gainPotionSlot, gainStars, stunEnemy.
  • Guided tour + /guide manual — 8-step spotlight walkthrough (auto-launches on first run, replayable from the titlebar) and a full reference page: effects, upgrades, image specs, shop rules, install steps.
  • Rest-site campfire character, treasure-hand textures, map-marker patch — custom characters now appear at campfires (generated NRestSiteCharacter subclass + scene), the relic-grab hand renders, and the map marker uses a consumer-side Harmony patch instead of an impossible CompressedTexture2D cast.
  • Nightly real-compile — golden fixtures build on the deployed Fly service every night; failures file a code-factory issue. PCK writer round-trip tests.

521 tests passing (was 305 at session start).

0.5.0

2026-06-12

Driven by an 8-dimension multi-agent audit against the decompiled game source (full findings with file:line evidence in C:\Work\Projects\slay\audit-findings\).

Fixed — compile errors reported by users

  • Non-Latin names (Chinese/Japanese/emoji)sanitizeIdentifier now produces deterministic hash-based identifiers instead of collapsing every non-Latin name to _ (the Cards/_4.cs + colliding-class family); compile-service sanitizeModName kept in lockstep
  • Name registry — all generated class names assigned once, collision-proof, shared by codegen, localization keys, and asset paths; replaces the post-hoc file renamer that broke cross-references for duplicate names
  • `StarterRelic` CS0246 — projects with zero relics now synthesize a default starter relic (with localization) instead of referencing a class that was never generated
  • `CustomPower` CS0246 — effects referencing deleted/unlinked custom powers or token cards are skipped with a comment instead of emitting phantom classes; targetHasCustomStatus conditions on missing statuses compile to false
  • `removeCustomPower` on AllEnemies CS1503PowerCmd.Remove<T> takes a single Creature; all-enemies variants now loop (the user-reported IReadOnlyList<Creature> error)
  • Stance/Mantra/Scry emitted Watcher-mod-only classes — generated self-contained _StanceSupport.cs (Wrath/Calm/Divinity/Mantra, ported from the Watcher mod) and _ScryCmd.cs; scry previously *drew* cards instead of scrying
  • 15+ verified API mismatchesSetRetainGiveSingleTurnRetain, phantom CardSelectPreferencesCardSelectorPrefs, .Health.CurrentHp, relic base.Owner.Playerbase.Owner, missing CardSelection/Models.Cards usings, Watcher-only "Smite" clamped to Shiv, slugify divergence on consecutive capitals (blank titles), fractional CardsVar/EnergyVar, FromCard(null) NRE chains in relic/power damage (a damage relic used to hit the *player*)
  • AllEnemies/RandomEnemy cards — debuffs no longer silently target the player; bare damage uses TargetingAllOpponents/TargetingRandomOpponents instead of null cardPlay.Target
  • MSB6006 "csc.dll exited with code 1" — root-caused to compiler OOM/disk crashes whose stack trace the error filter discarded; raw output tail now included, UseSharedCompilation=false, session images stay on disk instead of being held as base64 strings through the entire build, __pck_img__ payloads no longer written to the build dir

Fixed — in-game crashes and broken behavior

  • Shop soft-lock — the merchant throws (run unrecoverable) unless the pool has ≥2 Rare Attacks, ≥2 Rare Skills, ≥1 Rare Power; codegen now auto-fills filler cards and the export panel explains the gap
  • Upgrade system overhaul — keyword upgrades (removeExhaust/addRetain) now use AddKeyword/RemoveKeyword in OnUpgrade (the game caches Keywords, so the old ternary never re-evaluated); "+Energy on Upgrade" was dead code; power-stack upgrades routed to the correct PowerVar instead of the card's first var; gainBlock upgrades crashed the game (undeclared BlockVar); heal/draw/energy play lines now read their DynamicVars so card text and behavior stay in sync; token cards support upgrades
  • `new Random()` in power-context random targeting → seeded RunState.Rng.CombatTargets (multiplayer/replay safety)
  • doubleDamage uses the game's own DoubleDamagePower instead of a non-stacking clone
  • `afterApplied` custom-power trigger never fired for enemy-applied powers; onPickup relics with run-level effects (heal/gold/max HP) never fired outside combat

Fixed — images ("art doesn't work", "character is tiny", black backgrounds)

  • JPEG-under-.png — export compression re-encoded large images to JPEG at .png PCK paths; Godot picks decoders by extension, so art silently failed to load and alpha went black. Now always PNG (downscale, never switch codecs)
  • Combat sprite scale — hardcoded 0.28 rendered a 512px upload ~143px tall; now auto-scales to the ~310px creature bounds
  • Token card art wiped on reload — ArtRestorer now restores token cards (and the fast-hydration path no longer skips poses/sheets/energy layers)
  • Relic/power icons bumped to the game's real 256×256; upload-session filename collisions (relic + power sharing a name) fixed with content-addressed names

Added

  • Pre-flight checks panel in Export — dangling references, empty/CJK names, shop-safety gaps, missing starting relic — caught *before* compile, with compile blocked on errors
  • Friendly compile errors — raw dotnet build output translated to "Your card 'X' caused CS0246 …" with plain-language hints; technical output collapsed behind a toggle
  • CI workflow (.github/workflows/ci.yml) — typecheck + 417 tests on every push/PR (previously nothing ran tests)
  • Golden kitchen-sink suite — fixture built programmatically from EFFECT_BLOCKS/triggers/conditions (coverage can't rot); validates every generated file structurally, asserts unique paths and that every cross-file reference resolves
  • Upgrade editor everywhere — per-stat upgrade inputs for all var-backed effect types, on cards *and* token cards; honest "not yet upgradable" note for custom statuses
  • Roadmap for the power registry (all ~150 player-usable game powers), passive modifier blocks, if/then/else conditionals, random-card effects, rest-site/hand/map-marker art, and the guided tutorial in TODOS.md

0.4.0

2026-03-19

Added

  • Art appears in-game — session-based image upload pipeline sends card/character art directly to the Fly.io compile service, bypassing Vercel's 4.5MB body limit; card portraits now appear in-game at the correct PCK paths
  • Custom Mechanics Editor (Powers tab) — full visual editor for creating custom buffs, debuffs, and status effects with multi-trigger composition (13 trigger types), effect builders, balance badges, and delete-with-confirmation
  • 13 trigger types for powersafterTurnEnd, afterCardPlayed, afterDamageReceived, afterDamageGiven, afterPlayerTurnStart, afterSideTurnStart, afterBlockGained, afterCurrentHpChanged, afterApplied, afterRemoved, beforeAttack, afterCardExhausted, afterCardDrawn
  • Mechanic templates — 8 pre-built power patterns (Momentum, Rage, Thorns, Echo, Siphon, Fortify, Overcharge, Elemental Attunement) to start from instead of blank canvas
  • Power balance indicator — heuristic strength rating (Feeble/Balanced/Potent/Broken) comparing trigger count, effect weights, and stack type against vanilla power baselines
  • C# validation step — lightweight structural validation (balanced braces, duplicate override detection) before compile; surfaces errors in the UI
  • Character description field — textarea on CharacterConfig (max 200 chars); shown on the character select screen
  • Character portrait generation — portrait embeds at res://images/packed/portraits/ and overrides CharacterSelectIconPath
  • Card frame preview — STS2-style card mockup with cost orb, rarity gem, art/gradient placeholder, and rarity bar in CardEditor detail panel
  • `applyCustomPower` / `removeCustomPower` effects — cards and powers can reference project-defined custom powers by ID
  • Disk full error handling — 507 on disk full, with a clear message instead of a raw failure

Changed

  • Power schemaPowerDefinition now uses triggerBlocks array (1-6 blocks); old projects auto-migrate on load
  • `generateEffectLine` — now accepts typed EffectContext config objects; CARD_CONTEXT, RELIC_CONTEXT, POWER_CONTEXT defined
  • Tab order — Powers tab added between Relics and Balance; Sidebar shows Powers count badge

Fixed

  • Path traversal guard — compile service rejects file paths that escape the build directory
  • Duplicate trigger deduplication — same-trigger blocks merged before C# codegen to prevent duplicate method override compile errors

0.3.3

2026-03-19

Added

  • Art persistence (IndexedDB) — card/relic art is saved to browser IndexedDB and restored on every page load; art no longer disappears on refresh

Fixed

  • 413 on compile — removed base64 art data URLs from the compile request payload (stripped __pck_img__ entries); compile no longer exceeds Vercel's 4.5 MB request body limit
  • Art disappearing after Load into Editor — localStorage quota was exceeded by ~30 MB of base64 images; art URLs are now excluded from Zustand's persist middleware and stored in IndexedDB instead
  • Strike/Defend cards dropped their effects — cards named "Strike" or "Defend" were compiled from simple templates that discarded everything the card actually did; they now use the full effect codegen with a class rename

0.3.2

2026-03-19

Fixed

  • Import JSON error messages — distinguishes JSON parse errors from schema validation errors; shows the specific failing field path from Zod
  • Double-click compile guard — added compilingRef ref to prevent race condition window where rapid double-clicks could trigger two compile requests
  • Unicode/emoji in card names — verified sanitizeIdentifier handles emoji, pure-emoji, and unicode-only inputs without crashing; added 14 regression tests

Added

  • 14 new tests: sanitizeIdentifier unicode edge cases, toPascalCase, and 0-card/0-relic isValid guard (152 → 166 tests)

0.3.1

2026-03-19

Added

  • BaseLib auto-bundling — compiled zip now includes BaseLib/ folder alongside the mod folder for single drag-and-drop install; BaseLib files are silently skipped if not present in the compile environment
  • How to Install — collapsible installation guide appears in Export tab after a successful compile, with Windows + Mac paths and step-by-step instructions

0.3.0

2026-03-19

Added

  • Images embedded in the mod PCKcompile-service/compile.ts handles the __pck_img__: prefix for base64 → binary embedding
  • Custom powersPowerModel subclasses with turn-trigger effects - src/lib/codegen/powerTemplate.ts — C# PowerModel codegen (7 effect types: damageEnemy, damageSelf, gainStrength, gainDexterity, gainBlock, applyPoison, drawCard)
  • VFX variety — card effects now use effect-appropriate VFX paths instead of hardcoded slash - selectVfx() maps 15 effect types to distinct VFX paths (slash, heavy_blunt, giant_horizontal_slash, slime, starry, lightning, blunt, block, debuff, heal)
  • Character color theming — 6 color properties now use the character's chosen color: NameColor, EnergyLabelOutlineColor, DialogueColor, MapDrawingColor, RemoteTargetingLineColor, RemoteTargetingLineOutline

Changed

  • src/lib/effectBlocks.ts — damage effect codegenTemplates use {vfx} placeholder (substituted at codegen time)
  • src/lib/codegen/helpers.tsgenerateEffectLine() substitutes {vfx} with selectVfx() result
  • src/lib/codegen/cardTemplate.ts — exports cardPortraitPckPath(); PortraitPath uses actual PCK path when artUrl is set
  • src/lib/codegen/generateProject.ts — emits __pck_img__: entries for cards with artUrl; includes power files
  • src/lib/schema.ts — added PowerDefinition/PowerEffect schemas; powers array on CharacterProject; artStyle on modMeta
  • src/lib/codegen/localizationTemplate.ts — generates powers.json localization when powers exist

0.2.0

2026-03-19

Added

  • Synergy annotationssynergizesWith field on cards, shown on hover in card list
  • Ancient card rarity — added to schema, codegen, and UI

Changed

  • src/lib/schema.ts — added synergizesWith, buildPath fields to CardDefinition; added archetype to CharacterProject; raised card max to 120, relic max to 15
  • src/lib/codegen/constants.ts — added Ancient to CARD_RARITY_MAP
  • src/components/CardPreview.tsx — added Ancient rarity style

Fixed

  • Ancient rarity cards now render correctly in CardPreview (previously would throw a TS index error)

0.1.0

2026-03-18

Added

  • Initial MVP: a starting character (12-14 cards, 1 Starter relic)
  • Phase 0 foundation: vitest test suite (87 tests), shared codegen constants/helpers, DynamicVar extraction
  • 7 previously-unimplemented effect codegen types: removeDebuffs, discard, scry, addCardToHand, addCardToDiscard, addCardToDeck, upgradeRandomCard
  • C# codegen for all 6 templates: card, relic, character, localization, modInit, project
  • PCK file generation for Godot mod packaging
  • Compile service integration