Network upgrade and new reconnection mode:
* users can disconnect or close app without game progress loose now;
* disconnect dialog will show active tables stats and additional options;
* all active tables will be restored on reconnect (tables, tourneys, games, drafts, sideboarding, constructing);
* user must use same server and username on next connection;
* there are few minutes for reconnect until server kick off a disconnected player from all player's tables (concede/loose);
* now you can safety reconnect after IP change (after proxy/vpn/wifi/router restart);
Other improvements and fixes:
* gui: main menu - improved switch panel button, added stats about current tables/panels;
* gui: improved data sync and updates (fixes many use cases with empty battlefield, not started games/drafts/tourneys, not updatable drafts, etc);
* gui: improved stability on game updates (fixes some random errors related to wrong threads);
* server: fixed miss messages about player's disconnection problems for other players in the chat;
* refactor: simplified and improved connection and network related code, deleted outdated code, added docs;
* tests: improved load test to support lands only set for more stable performance/network testing (set TEST_AI_RANDOM_DECK_SETS = PELP and run test_TwoAIPlayGame_Multiple);
* Improve some "mana spent -> give effect to permanent spell" cards
make effect source be the SpellAbility itself
* Implement Intrepid Paleontologist and tests
* Use a common class for the "specific MOR ETBs with counter" effect
* Prevent casting non-owned dinosuars
* Rename AddCounterEnteringMOR to AddCounterEnteringCreature
* fixes from review
* server: fixed that a critical errors ignored in user commands threads (now it will be added to the logs);
* network: fixed frozen user responses in some use cases;
* network: fixed accidental and incorrect user responses (only latest response will be used now);
* network: improved freeze logs, added problem method name and code's line number;
* cheats: removed outdated deck and card load logic (only init.txt commands supports now);
* cheats: fixed wrong priority after add card dialog (closes#11437);
* cheats: improved stability and random errors on cheat executes (related to #11437);
* docs: added details on network and thread logic, human feedback life cycle, etc (see HumanPlayer, ThreadExecutorImpl);
* Add tests for conditional mana usage with soft counterspells
* Fix "to cast" conditions on common ManaCondition classes
* Add fix to all remaining ManaCondition classes
* SimpleActivatedAbilityConditionalMana is tested to pay for a soft counterspell activated ability
* Remove now-unused imports
* Switch Convoke to using costs tag system
* Add Convoke copy/clone tests
* update author name on sufficiently changed files
* Remove now-unused CONVOKED event
* Add [WHO] Coward // Killer
* Add MTGO version of [UNF] "Name Sticker" Goblin
* Implement [WHO] Thijarian Witness
* Add NameStickerGoblinTest
* Fix Thijarian Witness, add tests (may need additional tests). Also adds a simple toString for MageObjectReference
* Don't spam the java garbage collector, add another test
* Replace non-ASCII characters in card text
* improve MOR toString
* Thijarian Witness fixed better, add AttackingBlockingWatcher in common
* cleanup from xenohedron's review
* Fix test, add warning not to use AttackingBlockingWatcher for static effects
* rename AttackingBlockingWatcher to AttackingBlockingDelayedWatcher to make it more obvious how it should be used, minor documentation changes
Simplify and rename Thijarian Witness Predicate
* add null checks
* new help window can be opened from a player panel;
* it collect and show all visible game hints from all players and all zones;
* it updates in real time on game update;
* allows to customize visible data;
* allows to open multiple windows (current limit is 5 windows, can be slow to render);
* allows to minimize opened windows;
* workable card popup on mouse move over card name or card id;
* filter modes:
* all - show hints from all players;
* player - show hints from single player;
* group mode:
* by hints - show same hints as one with all used cards;
* by cards - show full cards list with own hints;
* search mode:
* allows to filter card hints by player name, card name, card id or card hint;
* allows to search multiple words (equals to "or")
* current limitation:
* card popup shows a card instead a real object, e.g. miss card hints in it (relelated to game logs problem);
* unsupport of emblems, dungeons and other non card objects from a command zone;
* unsupport of revealed and library's top cards;
GUI - player's panel improves:
* added hints helper button;
* added player hithlight as possible target in choose dialogs;
* improved player name button in small mode;
* fixed wrong height in small mode;
Other fixes:
* game logs: added card popup support for logs with custom object name;
Moved the cardViewEquals method from CardPanelRenderModeMTGO to CardView
Decomposed conditional to increase readability.
Changed the variable/constant names to increase the readability.
* Implement Costs Tag Map system
* Use Costs Tag Map system to store X value for spells, abilities, and resolving permanents
* Store Bestow without target's tags
Change functions for getting tags and storing the tags of a new permanent
* Create and use deep copy function in CardUtil, add Copyable<T> to many classes
* Fix Hall Of the Bandit Lord infinite loop
* Add additional comments
* Don't store null/empty costs tags maps (saves memory)
* Fix two more Watchers with Ability variable
* Add check for exact collection types during deep copy
* Use generics instead of pure type erasure during deep copy
* convert more code to using deep copy helper, everything use Object copier, add EnumMap
* fix documentation
* Don't need the separate null checks anymore (handled in deepCopyObject)
* Minor cleanup
* Fix Subability copy bug (fix#10526 )
* Cards which copy abilities of other cards should not copy subabilities.
* Enable previously-failing tests
* Find more addAbility that should be done without subabilities
* Add documentation to addAbility function
* Add warning about not using basic addAbility when copying from a source
* Invert withSubabilities to fromExistingObject