MHS cards, batch 5#10871
Merged
Merged
Conversation
tool4ever
reviewed
Jun 4, 2026
tool4ever
reviewed
Jun 4, 2026
tool4ever
reviewed
Jun 4, 2026
tool4ever
reviewed
Jun 4, 2026
tool4ever
reviewed
Jun 4, 2026
tool4ever
reviewed
Jun 4, 2026
tool4ever
reviewed
Jun 4, 2026
Fulgur14
commented
Jun 5, 2026
Fulgur14
commented
Jun 5, 2026
tool4ever
reviewed
Jun 5, 2026
tool4ever
approved these changes
Jun 5, 2026
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.