Skip to content

MHS cards, batch 5#10871

Merged
tool4ever merged 33 commits into
Card-Forge:masterfrom
Fulgur14:Fulgur14-patch-211701
Jun 5, 2026
Merged

MHS cards, batch 5#10871
tool4ever merged 33 commits into
Card-Forge:masterfrom
Fulgur14:Fulgur14-patch-211701

Conversation

@Fulgur14
Copy link
Copy Markdown
Contributor

@Fulgur14 Fulgur14 commented Jun 4, 2026

No description provided.

Comment thread forge-gui/res/cardsfolder/upcoming/abomination_terrifying_titan.txt Outdated
Comment thread forge-gui/res/cardsfolder/upcoming/kang_prime.txt Outdated
Comment thread forge-gui/res/cardsfolder/upcoming/baron_strucker_hydra_overlord.txt Outdated
Comment thread forge-gui/res/cardsfolder/upcoming/absorbing_man.txt Outdated
Comment thread forge-gui/res/cardsfolder/upcoming/patriot_shield_wielder.txt Outdated
Comment thread forge-gui/res/cardsfolder/upcoming/nick_fury_agent_of_s_h_i_e_l_d.txt Outdated
@Fulgur14 Fulgur14 marked this pull request as ready for review June 4, 2026 12:15
Comment thread forge-gui/res/cardsfolder/upcoming/abomination_terrifying_titan.txt Outdated
@tool4ever tool4ever merged commit ceab94a into Card-Forge:master Jun 5, 2026
2 checks passed
@Fulgur14 Fulgur14 deleted the Fulgur14-patch-211701 branch June 5, 2026 20:13
delebedev added a commit to delebedev/forge that referenced this pull request Jun 6, 2026
* Rearrange getter methods, expose in interface, make getAllCardsNoAlt use rules lookup.

* Fix CardView IdRef substitution / retire UI_NETPLAY_COMPAT (Card-Forge#10662)

The pref gated two outer-codec branches that had been functionally
equivalent for production traffic since 2020. Reference compression
runs at the inner layer (DeltaSyncManager.toNetworkValue, wrapEvents)
regardless of the outer codec, and a pref-mismatch between endpoints
could corrupt the stream on the first class descriptor.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Realm of legends 1.045: Mapfixes (Card-Forge#10656)

* Mapfix

* Mapfix

* fixed typo

* Mapfix

* Add files via upload (Card-Forge#10653)

* - Reuse basicManaFixing function instead of recreating a new function for it

* Consolidate inner event codec onto CObject streams (Card-Forge#10664)

Drops ReplacingOutputStream/ResolvingInputStream — wrapEvents,
unwrapEvents, measureSize now go through CObjectOutputStream and
CObjectInputStream. Thin descriptors don't carry serialVersionUID,
so the Android record UID fallback is gone with them.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Card cleanup: 2026-05-13

* PH23: Mr. Monopoly, On the Go (Card-Forge#10666)

* Add files via upload

* Update TypeLists.txt

* Update 2023 Heroes of the Realm.txt

* Make chosen unique prints follow card art preference.

* Bilbo, Thief in the Night

* Bloodline Recollector // Ancestral Craving

* Stingcaster Mage (FRA leak) (Card-Forge#10484)

* Correct Bilbo, Thief in the Night

* Switch no-match return value to empty list.

* Lobby update fixes and null-card guard in CMatchUI.updateCards (Card-Forge#10618)

- NetConnectUtil: drop redundant server.updateLobbyState() call from
  the player-change listener; updateSlot already triggers it via the
  IUpdateable listener above, so the explicit call duplicated every
  LobbyUpdateEvent broadcast.

---------

Co-authored-by: Autumn Wind <209156905+autumnmyst@users.noreply.github.com>

* Route opponent-hand reveal and discard through FloatingZone on desktop (Card-Forge#10660)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: tool4EvEr <tool4EvEr@>

* Add Commander bracket calculation and bracket views (Card-Forge#10672)

* Add Ctrl+0 select-min hotkey for FloatingZone (Card-Forge#10676)

* Yield Rework V2 — configurable interrupts, APINA, suggestions, settings UI (Card-Forge#10606)

Features
- Six configurable interrupt prefs that control when an active autopass
  (EOT, marker) is cancelled: OPPONENT_SPELL, ATTACKERS, TARGETING,
  MASS_REMOVAL, TRIGGERS, REVEAL. First two default ON to preserve
  master's hardcoded behavior; the rest default OFF.
- APINA (Auto-Pass If No Actions) — per-tick predicate gated by the
  AvailableActions heuristic in forge-ai, with configurable timeout.
- Smart suggestions — InputPassPriority offers a stack-yield prompt when
  there are spells on the stack and no playable response, and a no-actions
  marker prompt on the player's own turn with no playable cards. Each has
  a configurable decline scope (NEVER / ALWAYS / STACK / TURN).
- Speed settings — opt-in skip of inter-phase and post-resolve delays.
- Desktop UI: VYield dock-tab panel (Auto-Pass toggle + Settings buttons)
  and VYieldSettings dialog. Three configurable shortcuts: Ctrl+Y opens
  settings, P toggles APINA, ESC clears the active yield.
- Mobile UI: VYieldOptions scrollable settings dialog + VGameMenu entries
  for Yield Options and the Auto-Pass toggle.

* Split stack-yield into interruptible and non-interruptible variants

The stack-item context menu now offers two choices on desktop and mobile. "Yield to stack" auto-passes until the stack empties but backs off when any of the existing yield-interrupt prefs trip (opponent spell, targeting, mass removal, triggers, reveal). "Resolve entire stack" preserves today's fire-and-forget behavior — only stack-empty turns it off. The "you cannot respond to the stack" suggestion defaults to the interruptible variant.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: tool4EvEr <tool4EvEr@>

* Fix edition section being loaded as print sheet

Closes Card-Forge#10675.

* Back from the Holiday commit (Card-Forge#10677)

* Update the_mind_stone.txt (Card-Forge#10679)

* Add P hotkey for auto-pass toggle on mobile (Card-Forge#10682)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Add files via upload

* Update Keyword.java

fix Enchant Reminder Text

* Clean up (Card-Forge#10686)

* Edition updates: MSC, PEWK, PUNK, SLD, UNK, YSOS

* Make getAllCards fetch by rules instead of name.

* Card cleanup: 2026-05-16 (Card-Forge#10688)

* Add files via upload

* Update nesting_dragon.txt

* Update r_2_2_dragon_flying_firebreathing.txt

* Update bitterheart_witch.txt

* Update nahiri_the_unforgiving.txt (Card-Forge#10690)

* Swap to AI controller during AvailableActions predictive sweep (Card-Forge#10691)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Hexproof: simlify for color and cardTypes (Card-Forge#10689)

* Fix crash from refactor below Android 13 (Card-Forge#10694)

* Edition updates: SLD

* Support Chandra, Chill of Compliance (Card-Forge#10696)

* Create chandra_chill_of_compliance.txt (Card-Forge#10697)

* Add search filter to mobile Settings (Card-Forge#10450)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Dock rework: configurable layout, show/hide, new icons (Card-Forge#10681)

Adds drag-to-reorder, right-click hide/show, FPref-backed layout,
dock-specific FSkinProp slots, and game-icons.net glyphs. Removes
Settings / Revert / Open / Save Layout dock buttons (all still on
the menu bar).

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Desktop menu cleanup v2 / UI Guidelines (Card-Forge#10637)

* Update starwinder.txt

* Keyword: add View Records for Serializing (Card-Forge#10651)

* Keyword: add View Records for Serializing
* KeywordCollectionView: make Serializable
* FSkinProp: use KeywordView for Icon
* PlayerView: join on KeywordView
* remove most of the Ability Properties
* Commander and Ringbearer icons without extra drawSymbol
* remove old ability icons except for Hexproof and Protection
* Hexproof logic added and some Card fixes
* Refactor Protection Icons
* remove CardFaceSymbols.drawAbilitySymbol on desktop

---------

Co-authored-by: tool4ever <therealtoolkit@hotmail.com>
Co-authored-by: tool4EvEr <tool4EvEr@>

* Only grab the first keycard found

* fix Starting intensity crashing reminder text

* Utilize KeyCards for discarding from opponents hands

* checkStateEffects tweaks (Card-Forge#10708)

* Network cleanup (Card-Forge#10693)

The roomKey constructor parameter was never stored on the field set
and both call sites passed the magic literal "0". Drop the parameter.

* Remove unreachable UpdateLobbyPlayerEvent branch in LobbyInputHandler

* Clear lastChecksumBreakdown after onResyncRequested logs it

The fields are populated on every checksum tick (~every 20 packets)
but only consumed when a client mismatch triggers onResyncRequested.
If a second resync arrives after additional checksums have
overwritten them, the log describes the more recent state, not the
state the client was actually reconciling against — actively
misleading the investigation. Clear them after the log so a follow-up
resync only logs if a fresh checksum has computed in between.

* Extract NetworkChecksumUtil shared hashing helpers

computeStateChecksum and computeChecksumBreakdown share three
identical block sequences that MUST stay byte-identical for the
breakdown to correctly diagnose a real mismatch. The class comment
at the breakdown explicitly notes "This must mirror computeStateChecksum
exactly" — an invariant held by hand, which a future reader can
silently break.

Extract three private static helpers (collectSortedBattlefieldCards,
hashCardProps, hashCombatAttackers), each containing the
unmodified body of the original inline block. Property ordering,
value extraction, and hash operations are preserved exactly; both
methods now route through the same helpers so divergence becomes
mechanically impossible.

The Javadoc on hashCardProps spells out the load-bearing contract
("server and client must apply the exact same operations in the
exact same order") so the reason this exists isn't lost.

The per-player zone+mana fold is NOT extracted: computeChecksumBreakdown
interleaves logging with the hash steps, and extracting would
either require returning a struct or recomputing the zone-size
lookups, both worse than the duplication.

* Drop dead null guards in YieldController

isPriorityAtOrPastMarker dropped its currentPhase == null check —
gv.getPhase() only returns null between matches, and every caller is
gated by an active match.

onSpellAbilityCast and onAttackersDeclared dropped their `owner != null ?`
ternaries — both reach YieldController via humanController.getYieldController(),
where the controller passes `this` to the YieldController constructor.
The NetGameController-wrapped instance with owner=null is unreachable
from these callers.

* setHighlighted: take Iterable like setSelectables

The hot loops (InputAttack.setCurrentDefender, activateBand, target
selection setup/teardown) were emitting one protocol packet per entity.
Mirror setSelectables' Iterable shape so they coalesce into a single
packet.

Mixed-state callers (setCurrentDefender) emit two ordered calls — false
batch first, then true batch — so the to-be-highlighted entity isn't
briefly cleared on the client. Single-entity callers wrap with
List.of(...).

* Move handleYieldMarkerToggle to AbstractGuiGame

The desktop and mobile copies were ~25-line duplicates of the same
yield-marker toggle algorithm: null guards, lookup the player's
YieldController, compare against the existing marker, then send either
ClearMarker or SetMarker plus a hard-stop label tweak. Only the label
tweak differs between platforms.

Lift the shared body to AbstractGuiGame.handleYieldMarkerToggle and have
each platform pass a Runnable for the divergent label action. The
desktop and mobile PhaseLabel classes are unrelated widget types, so
the shared method doesn't take a label parameter — the Runnable closes
over it at the call site.

* Skip checksum breakdown log line when stableChecksum is off

computeChecksumBreakdown returned a "stable checksum disabled or
gameView null" placeholder, which the client always logged at ERROR.
That fired on every mismatch without carrying any diagnostic value,
since the breakdown only makes sense when stableChecksum is enabled.

Return null in that case and skip the log line on the client.
DeltaSyncManager already null-guards before logging the server-side
breakdown.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: tool4EvEr <tool4EvEr@>

* Refresh SpellAbilityVariables after text change (Card-Forge#10709)

* Fix: stop prompt eating player hand in spectator mode (Card-Forge#10706)

* Prefer growing a player field cell when filling layout gaps

SRearrangingUtil.fillGap previously returned at the first viable
strategy (left, right, below, above). For an empty HAND_0 cell in
spectator mode this meant REPORT_MESSAGE expanded horizontally to
absorb the hand area. Bias the choice toward strategies that grow a
player FIELD cell so the prompt stays put and FIELD_0 expands down
instead. Falls back to the original priority order when no
FIELD-bearing strategy is viable.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Fix network CME from EDT walking game state (Card-Forge#10701)

AbstractGuiGame.awaitNextInput's 250ms Timer runnable runs on the EDT
and called showPromptMessage / updateButtons / showWaitingTimer on
RemoteClientGuiGame. Those methods walked the trackable graph (via
updateGameView and the flushPendingEvents inside send) — graph reads
that only the game thread may safely perform. The walk raced with
concurrent game-thread mutations, throwing
ConcurrentModificationException in Tracker.getDelayedPropsFor.

The three methods carry only player IDs, strings, and button flags —
their API contract doesn't depend on the trackable graph at all. The
eager flush was defensive bloat. Reachability from a non-game thread
is itself the signal that a command doesn't need state bundling.

`send` now matches the underlying `sender.send` semantic. The three
helpers are listed in hierarchy order (simplest first, each adding a
layer), and each has a javadoc describing purpose, thread constraint,
and when to use it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ChangeZoneEffect: allow mass-select for Mandatory mass searches (Card-Forge#10703)

Drop the !Mandatory exclusion from allowMultiSelect, so cards
like Insidious Dreams route mandatory library searches through
one batch chooser instead of looping a single-card picker per
requested card.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Use input prompt for opponent-hand reveal acknowledgement (Card-Forge#10704)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Banned and Restricted Announcement for May 18, 2026

* Edition updates: YSOS

* Add YECL and YSOS to formats

* Option: Auto-apply remembered ability order (Card-Forge#10683)

Adds an "Always use this order" checkbox to the simultaneous-ability ordering dialog. When checked, the chosen order is silently auto-applied on subsequent firings of the same SA combo within the match; when unchecked, the dialog still re-prompts but with the previous order pre-arranged.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Update fin.rnk (Card-Forge#10710)

* Move booster pics to forge-extras (Card-Forge#10584)

* Update MH3

* Update booster-images.txt links

* Move boosters to Github + PNG download support

* Allows full URL fetch in booster-images.txt

* Fix special boosters

* Enable mass-select on remote-controlled human players (Card-Forge#10716)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Fix: restore ICO_ARCSHOVER for theme compatibility (Card-Forge#10718)

Re-add ICO_ARCSHOVER at its pre-dock-rework coordinates (400, 800)
as a duplicate of ICO_ARCSOFF, so custom themes that paint a distinct
hover glyph at that cell render correctly. CDock now uses ICO_ARCSHOVER
when ArcState is MOUSEOVER instead of falling back to ICO_ARCSOFF.

* FSkin: widen theme sprite probe radius from +-2 to +-8

testPreferredSprite samples 5 points around a cell's centre to decide
whether the active theme has an override for that cell. The +-2 spread
missed icons with a transparent middle — e.g. paired-card targeting
glyphs where the negative space sits over the cell midpoint — and
fell back to the default sheet even when the theme had a sprite.

Widen the offsets to +-8, clamped to half the smaller cell dimension
so probes stay in bounds on tiny cells (ICO_BLANK is 2x2). Fold the
five inline blocks into a loop now that the offset is shared.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* RemoteClientGuiGame helper cleanup (Card-Forge#10715)

* Driveby: silence EventDeltaCheck zone-transition false positives

Guard the tap-state mismatch check on the card still being on the battlefield.
A card that has moved zones since the GameEventCardTapped fired carries a
stale tap flag on its old CardView, which produced hundreds of WARN lines per
game and made the eventStateMismatches counter meaningless.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Edition updates: FRC, PMEI, TRC, TRK

* Captain Kirk, Boldly Going (TRC leak) (Card-Forge#10717)

* Add files via upload (Card-Forge#10721)

* Add repeatable action macro recording for match play (Card-Forge#10711)

* Fix Nexus Mentality (Card-Forge#10723)

* Resubmission: YECL (3 cards), YEOE (3 cards) (Card-Forge#10725)

* Add files via upload

* Update pep_raucous_raider.txt

* UNK: 7 cards, 4 tokens (Card-Forge#7460)

* Add files via upload

* Add files via upload

* Update CounterEnumType.java

* Update CounterEnumType.java

* Update pox_plague.txt

* MB2: 8 cards (Card-Forge#7714)

* Add files via upload

* Add files via upload

* Add files via upload

* Update TypeLists.txt

* Update lilianas_other_contract_lilianas_undead_minion.txt

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Animate: RemoveThisAbility via Predicate (Card-Forge#10726)

* Animate: RemoveThisAbility via Predicate

* Change sacrifice target from Creature to Permanent

* Update turtle_van.txt

Closes Card-Forge#10727

* Update where_were_going.txt

* Update Unknown Event.txt

* Add files via upload

* Update mathemagics.txt

* Update Un‐cards,-Playtest-Cards,-and-Other-Funny-Cards.md

* Console documentation cleanup

Reordered commands and clarified descriptions.
Shell-like argument syntax.
Added undocumented commands and arguments.
Added warnings to mobile-unfriendly commands.
Fixed clearnosell description.
Identified redundant commands.
Fixed feedback messages in console code.
Fixed "debug off" command that had been turning map debugging ON.

* Update captain_kirk_boldly_going.txt

* Restored console documentation for reset map command

* Revised console documentation for reset map command

* Add files via upload

* Add draft and sealed modes to online multiplayer (desktop) (Card-Forge#10474)

Host-driven multiplayer draft and sealed in the online lobby:
- Draft engine runs on the host; clients submit picks as NetEvents and
  receive packs via DraftPackArrivedEvent
- Per-seat disconnect grace window (configurable) with auto-pick
  fallback after grace; reconnect resumes live picking without reclaim
  timer or /skipreconnect interference
- Live FDraftOverlay shows pack/pick and neighbor queue depths; event
  log tinted per seat with pack-M/pick-N notation and [N waiting] badge
- Sealed path generates and delivers ReceiveEventPoolEvent pools to
  each seat; both sides transition to the deck editor automatically
- Event results saved as plain Decks with metadata tags (eventId,
  format, product, date); host picks an event for the follow-on match
  via a dropdown filtered from saved tags

Mobile port deferred — desktop-only for this PR.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: tool4EvEr <tool4EvEr@>

* Revised console documentation for 'set event', 'give boosters', 'give item', 'give print', and 'listPOI' commands and inserted line breaks to separate TODO commentary

* Add files via upload

* Revised console documentation and downgraded TODOs

Corrected 'give card' (any title will work), amended 'give print' (included the amount arg), and downgraded TODOs to current quirks and warnings.

* Trivially edited console documentation for remove enemy command

* Trivially edited console documentation to fix spelling

An accidental search-replace had garbled 'currently' to 'y' in a couple places.
Changed 'colour' to 'color', a remnant from earlier documentation.

* Split card pool filters up; only filter commander cards when appropriate. (Card-Forge#10742)

* Cleanup / minor bug fix (Card-Forge#10743)

* Release conceding player's input queue on concede

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Edition updates: PMEI, SLD

* CounterType: reduce the use of CounterEnumType for low used ones (Card-Forge#10659)

* CounterType: reduce the use of CounterEnumType for low used ones

* ~  remove CounterEnumType.ICE uses

* ~ remove QUEST uses

* Edition updates: PMEI, SLD

* Update fin.rnk, 1 misspelled card

AI underdrafts misspelled cards.

Summon: GF Ifrit -> Summon: G.F. Ifrit

* Update fin.rnk, 1 misspelled card

AI underdrafts misspelled cards

Summon: GF Cerberus -> Summon: G.F. Cerberus

* Update fin.rnk, 1 misspelled card

AI underdrafts misspelled cards

Summon: Choco Mog -> Summon: Choco/Mog

* Fixes Varchild's War Riders CumUpk from giving tokens to each opp (Card-Forge#10759)

* Only focus floating zone filter when no prompt button is actionable (Card-Forge#10763)

Gate the floating zone search filter focus grab on the prompt's
OK/Cancel buttons being enabled: only take filter focus when neither
button is enabled, otherwise leave focus on the prompt. The search
field stays clickable to filter either way.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Update several draft rankings and update MAR edition

* Update SPM play booster

* correct rarity

* Fix trying to generate products with boosters when edition has none (Card-Forge#10769)

* Add files via upload (Card-Forge#10767)

* Rework current metagame net decks

* Let players ignore the illegal-deck warning to start a match (Card-Forge#10755)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Remove unused GuiBase.isInterrupted flag

The flag suppressed an auto-connect prompt that OnlineLobbyScreen.onActivate
fired during disconnect teardown. That prompt was since replaced by a passive
Host/Join landing page, so the flag no longer guards anything.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* YSOS, batch 5: 4 cards (Card-Forge#10773)

* Add files via upload

* Add files via upload

* Consolidate ForgePreferences providing (Card-Forge#10771)

* fix (Card-Forge#10775)

* Update booster-images.txt

* YSOS: 4 cards, batch 1

* YSOS, batch 6: 3 cards (Card-Forge#10777)

* Add files via upload

* Update phoenix_of_iteration.txt

* Update variable_solutions.txt

* Update phoenix_of_iteration.txt

* Cleanup: Show card images in network prompts; tidy confirm() branching (Card-Forge#10776)

InputBase.showMessage dropped the referenced card and sent text only in
any networked game, falling back to showPromptMessage and leaving the
showCardPromptMessage path unused. The guard was a stopgap (the //todo
"additional check to pass this") from before clients reliably had the
referenced card.

Removing it is safe:
- Delta sync walks the trackable graph before dispatch
  (RemoteClientGuiGame.showCardPromptMessage -> syncAndSend), so the
  client holds the CardView the prompt references. Confirm dialogs
  already ship a reference card over the wire the same way
  (syncAndSendAndWait), so this is an exercised path, not a new one.
- The card image exposes no hidden information: the engine returns the
  face-down image for concealed cards; only supplementary info panels
  need guarding.
- The host's own GUI is also flagged as a net game but talks to its UI
  with no serialization, so the guard only degraded it; removing it
  makes the host's prompts match single-player.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Update Flamekin Gildweaver

* Update Lizardfolk Librarians

* Update Windrider Patrol

* Add an option to keep variants in Commander + auto-sell when already present

* Update the_vision.txt

* Adventure-Sprites-Buildings-v1.4 (Card-Forge#10789)

Added atlas to umber_hulk sprite and new enemies (greengecko, gecko, mouse, weasel, rabbit)

* Update Commander deckgen matrix from EDHREC data (Card-Forge#10780)

* Update CounterEnumType.java

Fix missing getAiCategory

* Stop per-test timeout from corrupting the shared card database load (Card-Forge#10792)

The AI simulation tests share a single lazily-loaded, memoized StaticData
holding the card and token databases. Whichever test first calls
FModel.getMagicDb() pays the multi-second load. When that test was
ReplacementHandlerTest.testPerpetualEntersTappedReplacementEffect, which
carries @test(timeOut = 2000), a slow CI runner could exceed 2s mid-load:
TestNG interrupted the thread and CardStorageReader.executeLoadTask swallowed
the InterruptedException. The half-built StaticData with an empty token map
was then cached for the whole JVM, so every later token lookup threw
"wrong token name" - turning one timeout into ~20 cascading failures that
disappeared on re-run.

Move the one-time FModel.initialize() out of initAndCreateGame() into an
untimed @BeforeMethod in AITest, so the load can never run inside a
@test(timeOut) window regardless of runner speed. Also propagate the
InterruptedException in CardStorageReader instead of swallowing it, so an
interrupted load fails loudly and is never cached as if complete.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Edition updates: A-F various fixes (Card-Forge#10783)

* Edition updates: G-M various fixes (Card-Forge#10786)

* Edition updates: N-Z various fixes (Card-Forge#10790)

* Another CardFactory ordering tweak (Card-Forge#10785)

* Prevent crash when selling cards in commander mode (Card-Forge#10760)

* Fix off-thread trackable-graph walk in network showPromptMessage (Card-Forge#10791)

* Clean up (Card-Forge#10795)

* AI timeout: even bigger bandaid (Card-Forge#10800)

* Edition updates: MSC, MSH

* Realm of Legends: Gwafa now costs 5k. Arzakon warning notice  (Card-Forge#10798)

* Realm of Legends: Gwafa now costs 5k. Arzakon warning notice for turning on non-legal cards.

* ROL: Mapfix

* docs: add Realm of Legends plane and expand Shandalar Old Border section (Card-Forge#10658)

Add a Realm of Legends entry to the Planes wiki page describing the
commander-focused plane (120+ dungeons, 300+ items, 850+ enemies) with
a link to its official guide.

Expand the Shandalar Old Border section with concrete content (card pool
size, enemy decks, boss count, items, Commander mode, Historical Arena)
and a link to the official site at oldborder-shandalar.net.

* - Implement custom draft formats for Old Border Shandalar. (Card-Forge#10707)

* Fix libgdx network client GL-thread deadlock on blocking dialogs (Card-Forge#10804)

message and showErrorDialog return void but open a blocking modal on the
client via WaitCallback.invokeAndWait. Dispatched to the libgdx GL thread,
that wait deadlocks the render thread, freezing the client with no error.
The Card-Forge#10461 guard only backgrounds return-value methods, so these
void-but-blocking methods slipped through; route them off the GL thread too.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Add maximum Commander bracket controls for generated decks (Card-Forge#10803)

* Add files via upload (Card-Forge#10752)

* TrackableObject: View getter return empty List (Card-Forge#10801)

* Split draft event handling off ILobbyListener (Card-Forge#10756)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* TrackableType: cleanup default value, reduce need of extra classes (Card-Forge#10751)

* TrackableType: cleanup default value, reduce need of extra classes

* Fixed item drop bug (Card-Forge#10810)

* Missing boosters

* AbilityManaPart: use Multiset for produced (Card-Forge#10811)

* Fix Veil of Summer (Card-Forge#10818)

* ManaPool: refactor GameEventManaPool and Mana added as once (Card-Forge#10812)

* ManaPool: refactor GameEventManaPool and Mana added as once

* Edition updates: SLD

* Online draft/sealed bug fixes and polish (desktop) (Card-Forge#10816)

* Use a limited deck format for networked limited matches

The networked lobby always launched matches as GameType.Constructed, so
online draft and sealed games inherited the Constructed sideboard cap of
0-15 cards. Building a deck from a limited pool then failed validation in
the sideboard dialog, demanding the unused pool be cut down to 15.

Pass GameType.Draft when the lobby is in limited mode, mirroring the
isLimitedMode() check already used for the lobby legality check. Draft
maps to DeckFormat.Limited, which has no sideboard cap, so the full pool
can sit in the sideboard. Draft is chosen over Sealed because the
win/lose screen keys off the game type: Sealed unconditionally selects
the gauntlet tournament screen, while Draft falls through to the normal
match win/lose screen when no gauntlet draft is running.

* Filter decks immediately when loading a past network event

Loading a past event set the active event id but left the conformance
flag untouched, so the deck list stayed unfiltered until the user toggled
the "only allow decks from this event" checkbox off and on. The
just-finished-draft path (receiveEventPool) already turns conformance on
when it selects the event; mirror that when loading a past event so the
filter applies right away, and sync the checkbox to match.

* List past network events newest first

* Fix edit button not loading network event decks

* Open network event decks in the matching limited editor

Every path that opened a network event deck hardcoded the sealed editor,
so draft pools opened with the sealed pool layout rather than the draft
one — CEditorLimited configures its catalog columns and card display per
screen, so the two are not interchangeable.

Route by the deck's eventFormat tag via a shared helper that picks the
draft or sealed editor screen, used by the decks-list open path and the
post-event-pool open. The post-draft completion path uses the draft
editor directly since it is always a draft.

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Mana: add Helper methods (Card-Forge#10821)

~ custom hashCode isn't needed anymore

* handleStayOpen complained in the IDE (Card-Forge#10817)

* Add files via upload (Card-Forge#10809)

* Update MTGP_05.pzl (Card-Forge#10822)

Fixed where you could win the puzzle by passing.

* - Better fix for MTGP_05. (Card-Forge#10829)

* Revive Sentry (Card-Forge#10831)

* Add files via upload (Card-Forge#10833)

* Set name in WrappedAbility (Card-Forge#10820)

* Fix ability-menu crash and positioning for floating-zone cards (Card-Forge#10834)

* Fix crash when the ability menu anchors to a hidden card panel

The ability/face popup anchored to the card's home-zone panel, which can be
hidden (e.g. a card playable via a Wish whose Sideboard window was opened then
closed), throwing IllegalComponentStateException. Guard the anchor and fall back
to the prompt area when it isn't showing.

* Anchor the ability menu to the clicked card panel

The menu looked up the panel by the card's home zone, so when a card is shown in
more than one window (e.g. in both the Playable Zone Cards window and the Sideboard
window) it could open over the wrong one. Track the clicked panel and prefer it.

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Show waiting opponent's name in single-player prompt (Card-Forge#10835)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Restore game log for reconnecting network clients (Card-Forge#10826)

On reconnect, reconstruct the host's accumulated entries as
GameEventAddLog events and replay them to that client only, rebuilding
its log through the existing formatter path. The whole batch ships as a
single events-only applyDelta packet rather than one message per entry,
and bypasses collectDeltas so it stays a plain serialize-and-send — no
redundant full-state resend, no off-thread delta collection.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Add playable card highlights (Card-Forge#10680)

A light blue outline ("weakly selectable") on cards the player can
currently play or activate. Reads the same AvailableActions heuristic
as APINA, so the highlight set and the auto-pass decision come from
one pass per priority window.

---------

Co-authored-by: Autumn Wind <209156905+autumnmyst@users.noreply.github.com>
Co-authored-by: tool4EvEr <tool4EvEr@>

* MSH: 5 cards (rare mana-fixing land cycle) (Card-Forge#10838)

* Update gathering_place.txt (Card-Forge#10839)

* Add Offer Draw action (Card-Forge#10807)

A player can propose an intentional draw; every remaining alive player must accept via a live-tally dialog. Unanimous acceptance ends the game in a draw, applied atomically (intentionalDraw on all alive players plus setGameOver(Draw)); any decline cancels with no state change.

Modeled on concede: a hidden-by-default dock button and Game-menu item on desktop and a match-menu item on mobile, routed through a new IGameController action. Two one-way protocol methods carry it over the network (drawOfferAction, client to server; updateDrawOffer, server broadcast), each platform rendering a non-blocking live-tally dialog. The AI always declines for now.

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Update Blighted Nightmare (Card-Forge#10815)

* Allow the grouping of identical cards (Card-Forge#10825)

* Allow the grouping of identical cards

* Cleaner reset

* Only show effect dialog when there are remaining enemies (Card-Forge#10828)

* Update ballad_of_the_black_flag.txt (Card-Forge#10844)

* MSH, batch 1: 5 cards (Card-Forge#10845)

* MSH leaks, 25th April (Card-Forge#10519)

* MSH comic cards. (Card-Forge#10784)

* MSH: Worthy (Card-Forge#10846)

* MSH Debut cards, batch 2 (Card-Forge#10848)

* Clean up (Card-Forge#10851)

* [RoL] Fix chests rewards in Church of Kaalia (Card-Forge#10853)

* Fix chest rewards

* Fix typo

* Create invisible_woman_sue_storm.txt (Card-Forge#10856)

Co-authored-by: TRT <>

* Update artful_dodge.txt (Card-Forge#10859)

* Edition updates: MAR, MSC, MSH

* Edition updates: Oops fix PLST

* MSH cards from debut, batch 1 (Card-Forge#10837)

* MSH, batch 2: 5 cards (Card-Forge#10857)

* Vanguard cleanup

* Update grove_8_hydra.tmx (Card-Forge#10866)

* MSH, batch 3: 5 cards  (Card-Forge#10860)

* Card cleanup: 2026-06-04, \upcoming

* RoL: Two new strixhaven areas with 16 new enemies, 8 new items (Card-Forge#10868)

* Two new areas, 16 new enemies, 8 new items

* Small fix to overworld spawns

* Edition updates: MSH, PPRO, PSPL, PW26, UNK

* Decklist typo fix (Card-Forge#10880)

* Decklist typo fix

* Dialogue typo fix

* Updated dialogue

* Update illvoi_infiltrator.txt (Card-Forge#10881)

* Card cleanup: 2026-06-03, incidental (Card-Forge#10847)

* Update ennis_debate_moderator.txt

* Rename bob_bevy_of_beebles.txt to b_o_b_bevy_of_beebles.txt

* Update craig_boone_novac_guard.txt (Card-Forge#10882)

* Incidental fix: 2026-06-04 (Card-Forge#10879)

* Update AddTurnEffect.java

* Update alchemists_gambit.txt

* Update chance_for_glory.txt

* Update final_fortune.txt

* Update last_chance.txt

* Update warriors_oath.txt

* Update kang_the_conqueror.txt

* MSH debut cards, batch 3 (Card-Forge#10849)

* MHS debut cards, batch 4 (Card-Forge#10858)

* MSH, batch 4: 5 cards

* Card cleanup: 2026-06-05, \upcoming

* - Generated quest for Secrets of Strixhaven. (Card-Forge#10885)

- Clarification for MTGP_05.

* Card cleanup: 2026-06-05, \upcoming, 2nd pass

* Fix StackOverflowError from unbounded texture load callback chain (Card-Forge#10887)

MemoryTrackingAssetManager.load() wrapped parameter.loadedCallback in a
new lambda on every call. Because getTextureFilter() returns a single
shared TextureParameter instance, the callback nested one level deeper
per texture load. After enough loads, invoking the chain recursed deep
enough to throw StackOverflowError during texture loading, manifesting
as a white flash, missing card art, and eventual crash that only a
restart cleared.

Install a fresh callback each load instead of wrapping the existing one,
so the callbacks can never accumulate into a chain.

Co-authored-by: Claude <noreply@anthropic.com>

* Edition updates: MSH, PLST, PMEI, PURL, PW25, PW26, SLD

* MHS cards, batch 5 (Card-Forge#10871)

* MSH, batch 5: 5 cards (Card-Forge#10874)

* Preserve fork-local patches after upstream merge

* Restore quiet card database initialization flag

* Restore mana ability activation events

* Remove duplicate trackable consumer methods

* Remove stale GUI imports

* Restore draft lobby seams after upstream merge

* Remove duplicate desktop merge artifacts

---------

Co-authored-by: Jetz <Jetz722@gmail.com>
Co-authored-by: MostCromulent <201167372+MostCromulent@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Serafina <serafina2880@gmail.com>
Co-authored-by: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com>
Co-authored-by: Chris H <zenchristo@gmail.com>
Co-authored-by: juniper <juniper@aethre.co>
Co-authored-by: Fulgur14 <54345051+Fulgur14@users.noreply.github.com>
Co-authored-by: autumnmyst <autumnonthewind@gmail.com>
Co-authored-by: Autumn Wind <209156905+autumnmyst@users.noreply.github.com>
Co-authored-by: Madwand99 <Madwand99@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tehdiplomat <180473+tehdiplomat@users.noreply.github.com>
Co-authored-by: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com>
Co-authored-by: Hans Mackowiak <hanmac@gmx.de>
Co-authored-by: tool4ever <therealtoolkit@hotmail.com>
Co-authored-by: Paul Hammerton <paulhammerton1@hotmail.co.uk>
Co-authored-by: JoshSpin <50713856+JoshSpin@users.noreply.github.com>
Co-authored-by: Eradev <Eradev@users.noreply.github.com>
Co-authored-by: Vhati <tvtronix@yahoo.com>
Co-authored-by: David d'Aquin <david@daquin.com>
Co-authored-by: Simisays <67333662+Simisays@users.noreply.github.com>
Co-authored-by: Eradev <admin@eradev.com>
Co-authored-by: AlexandreCMF <alexandre.cmf2000@gmail.com>
Co-authored-by: Dreavian <30947021+Dreavian@users.noreply.github.com>
Co-authored-by: Vanja <56617195+vanja-ivancevic@users.noreply.github.com>
Co-authored-by: Agetian <stavdev@mail.ru>
Co-authored-by: AncoronDS <xancoronx@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants